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

Verwenden Sie Nginx, um einen WCF-Cluster mit hoher Verfügbarkeit und hoher Parallelität zu erstellen

PHP中文网
PHP中文网Original
2017-10-23 10:48:043000Durchsuche

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: Umgebungseinrichtung

1. 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); 
         }
       
     }


《2》App.Config-Code

 <?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>


Weil die IP-Adressen der beiden Windows-Maschinen sind 192.168.23.187, 192.168.23.188, achten Sie also bei der Bereitstellung auf die BaseAddress-Adresse in der Konfiguration.

2. Nginx auf Centos einrichten

Ich denke, jeder nutzt Nginx oft, gehen Sie einfach auf die offizielle Website und laden Sie die neueste Version herunter [nginx-1.13.6 ]: http://nginx.org/en/download.html, nach dem Herunterladen handelt es sich um eine reguläre Installation von Sanbanaxe! ! !

[root@localhost nginx-1.13.6]# ./configure --prefix=/usr/myapp/nginx

[root@localhost nginx-1.13.6]# make && make install

Suchen Sie dann die conf-Datei im Nginx-Installationsverzeichnis und ändern Sie die nginx.conf-Konfiguration darin.

[root@localhost nginx]# cd conf

[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


Die detaillierte Konfiguration ist wie folgt: Das Gewicht wird nach der Methode 1:5 aufgerufen kann online suchen.

#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  &#39;$remote_addr - $remote_user [$time_local] "$request" &#39;    #                 
         &#39;$status $body_bytes_sent "$http_referer" &#39;    #                  &#39;
         "$http_user_agent" "$http_x_forwarded_for"&#39;;   
          #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&#39;s document root        # concurs
				with nginx&#39;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;   
             #    }    #} }


3. Clientseitiger Programmaufbau

《1》 Das erste ist, 192.168.23.190 zuzuordnen Gehen Sie zum lokalen Host. Da der Dienst nicht für Dritte bereitgestellt wird, ist es sehr einfach, einen Host hinzuzufügen.

192.168.23.190 cluster.com



《2》 Dann fügt das Client-Programm die Dienstreferenz, den Code, hinzu ist wie folgt:


  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? ? ?



Sehen Sie, ist das nicht cool? Ich muss nur über Cluster.com auf den Dienst zugreifen. Nginx gibt mir automatisch eine komplexe Entzerrung, was in unserer Entwicklung die sehr vereinfachte komplexe WCF-Entzerrung ist.


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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn