Maison >Opération et maintenance >exploitation et entretien des fenêtres >Utilisez nginx pour créer un cluster WCF à haute disponibilité et à haute concurrence
Dans de nombreux cas, zookeeper est le premier choix pour un équilibrage complexe basé sur wcf, qui peut avoir une meilleure granularité de contrôle, mais zk n'est pas convivial pour C#, et il est relativement difficile à mettre en œuvre dans des situations réelles, si
.Si la granularité de votre mécanisme de chargement est très approximative, vous pouvez d'abord utiliser nginx. Il peut réaliser un équilibrage complexe et une sauvegarde à chaud sur deux machines, et mettre en œuvre notre activité avec la plus petite quantité de code que je partagerai ci-dessous.
1 : Matériel préparé
1. Pas grand chose à dire, une image vaut mille mots. Les serveurs sur la photo sont tous virtualisés par vmware, comme indiqué ci-dessous :
<.>《 1》 Trois machines Windows, deux serveurs Windows WCF (192.168.23.187, 192.168.23.188), un serveur client (192.168.23.1) 《2》 Une machine Centos, utilisée pour le complexe Web hôte nginx équilibré (192.168.23.190). 《3》Ajoutez le mappage d'hôte dans tous les fichiers Client Hosts : [192.168.23.190 cluster.com] pour faciliter l'accès à l'adresse IP du serveur où se trouve nginx via le nom de domaine. Deux : Configuration de l'environnement1. Programme WCF Puisqu'il s'agit d'un test, il doit s'agir d'un programme simple, et le code n'est pas complètement donné. 《1》 Le code de la classe d'implémentation HomeService est le suivant (afficher l'adresse IP du serveur actuel pour une visualisation facile) :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(); } }Enfin, exécutez le programme suivant pour voir si en 1000 cycles, le backend est pondéré 1:5 wcf fait l'appel ? ? ?
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!