Heim >Betrieb und Instandhaltung >Windows-Betrieb und -Wartung >Verwenden Sie Nginx, um einen WCF-Cluster mit hoher Verfügbarkeit und hoher Parallelität zu erstellen
Zookeeper ist in vielen Fällen die erste Wahl für komplexes Balancing auf WCF-Basis, das eine bessere Steuerungsgranularität bieten kann, aber zk ist nicht C#-freundlich und in tatsächlichen Situationen relativ mühsam zu implementieren
Wenn die Granularität Ihres Lademechanismus sehr grob ist, können Sie zunächst Nginx verwenden. Es kann nicht nur einen komplexen Ausgleich erreichen, sondern auch ein Dual-Machine-Hot-Backup realisieren und unser Geschäft mit der geringsten Menge an Code implementieren Teilen Sie es unten im Detail mit. 1: Vorbereitete Materialien 1. Es gibt nicht viel zu sagen, ein Bild sagt mehr als tausend Worte, wie unten gezeigt: 《 1》 Drei Windows-Maschinen, zwei WCF-Windows-Server (192.168.23.187, 192.168.23.188), ein Client-Server (192.168.23.1) 《2》 Eine Centos-Maschine, verwendet Hosts Web Complex Balanced Nginx (192.168.23.190). 《3》Fügen Sie die Hostzuordnung in allen Client-Hosts-Dateien hinzu: [192.168.23.190 Cluster.com], um den Zugriff auf die IP-Adresse des Servers, auf dem sich Nginx befindet, über den Domänennamen zu erleichtern. Zwei: Umgebungseinrichtung1. WCF-Programm Da es sich um einen Test handelt, muss es sich um ein einfaches Programm handeln, und der Code ist nicht vollständig angegeben. 《1》 Der HomeService-Implementierungsklassencode lautet wie folgt (geben Sie zur einfacheren Anzeige die IP-Adresse des aktuellen Servers aus):public class HomeService : IHomeService { public string DoWork(string msg) { var ip = Dns.GetHostAddresses(Dns.GetHostName()).FirstOrDefault(i => i.AddressFamily == AddressFamily.InterNetwork).ToString(); return string.Format("当前 request 由 server={0} 返回", ip); } }
<?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" /> </startup> <system.serviceModel> <behaviors> <serviceBehaviors> <behavior name=""> <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="false" /> </behavior> </serviceBehaviors> </behaviors> <services> <service name="WcfService.HomeService"> <endpoint address="/HomeService" binding="basicHttpBinding" contract="WcfService.IHomeService"> <identity> <dns value="localhost" /> </identity> </endpoint> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> <host> <baseAddresses> <add baseAddress="http://192.168.23.187:8733" /> </baseAddresses> </host> </service> </services> </system.serviceModel> </configuration>
[root@localhost nginx-1.13.6]# make && make install
[root@localhost conf]# ls
fastcgi.conf koi-utf nginx.conf uwsgi_params
fastcgi.conf.default koi-win nginx.conf.default uwsgi_params.defaultfastcgi_params mime.types scgi_params win-utf
fastcgi_params.default mime.types.default scgi_params.default[root@localhost conf]# vim nginx.conf
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # ' "$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; upstream cluster.com{ server 192.168.23.187:8733 weight=1; server 192.168.23.188:8733 weight=5; } server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; proxy_pass http://cluster.com; #设置主机头和客户端真实地址,以便服务器获取客户端真实IP proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } # another virtual host using mix of IP-, name-, and port-based configuration # #server { # listen 8000; # listen somename:8080; # server_name somename alias another.alias; # location / { # root html; # index index.html index.htm; # } #} # HTTPS server # #server { # listen 443 ssl; # server_name localhost; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # location / { # root html; # index index.html index.htm; # } #} }
class Program { static void Main(string[] args) { for (int i = 0; i < 1000; i++) { HomeServiceClient client = new HomeServiceClient(); var info = client.DoWork("hello world!"); Console.WriteLine(info); System.Threading.Thread.Sleep(1000);14 } Console.Read(); } }Führen Sie abschließend das folgende Programm aus, um zu sehen, ob das Backend 1:5 in 1000 Zyklen gewichtet ist der Anruf? ? ?
Das obige ist der detaillierte Inhalt vonVerwenden Sie Nginx, um einen WCF-Cluster mit hoher Verfügbarkeit und hoher Parallelität zu erstellen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!