很多情況下基于wcf的復(fù)雜均衡都首選zookeeper,這樣可以擁有更好的控制粒度,但zk對c# 不大友好,實現(xiàn)起來相對來說比較麻煩,實際情況下,如果
你的負(fù)載機(jī)制粒度很粗糙的話,優(yōu)先使用nginx就可以搞定,既可以實現(xiàn)復(fù)雜均衡,又可以實現(xiàn)雙機(jī)熱備,以最小的代碼量實現(xiàn)我們的業(yè)務(wù),下面具體分享下。
一:準(zhǔn)備的材料
? 1. 話不多說,一圖勝千言,圖中的服務(wù)器都是采用vmware虛擬化,如下圖:
《1》 三臺windows機(jī)器 ,兩個WCF的windows服務(wù)器承載(192.168.23.187,192.168.23.188),一臺Client的服務(wù)器(192.168.23.1)
《2》 一臺Centos機(jī)器,用來承載web復(fù)雜均衡nginx(192.168.23.190)。
《3》在所有的Client的Hosts文件中增加host映射:【192.168.23.190 cluster.com】,方便通過域名的形式訪問nginx所在服務(wù)器的ip地址。
二:環(huán)境搭建
1. WCF程序
? ? 既然是測試,肯定就是簡單的程序,代碼就不完全給出了。
?
《1》 HomeService實現(xiàn)類代碼如下(輸出當(dāng)前server的ip地址,方便查看):
?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("當(dāng)前?request?由?server={0}?返回",?ip);? ?????????} ??????? ?????}
?
《2》 App.Config代碼
?<?xml version="1.0" encoding="utf-8" ?>? ?<configuration>? ???<startup>? ?????<supportedruntime></supportedruntime>? ??</startup>? ???<system.servicemodel>? ?????<behaviors>? ???????<servicebehaviors>? ?????????<behavior> ???????????<servicemetadata></servicemetadata> ???????????<servicedebug></servicedebug> ?????????</behavior> ???????</servicebehaviors> ?????</behaviors> ?????<services> ???????<service> ?????????<endpoint> ???????????<identity> ?????????????<dns></dns> ???????????</identity> ?????????</endpoint> ?????????<endpoint></endpoint> ?????????<host> ???????????<baseaddresses> ?????????????<add></add> ???????????</baseaddresses> ?????????</host> ???????</service> ?????</services> ???</system.servicemodel> ?</configuration>
?
因為windows的兩臺機(jī)器的ip地址是192.168.23.187,192.168.23.188,所以部署的時候注意一下config中的baseAddress地址。
?
2. centos上的nginx搭建
? ? nginx我想大家用的還是比較多的,去官網(wǎng)下載最新的就好【nginx-1.13.6】:http://nginx.org/en/download.html,下載之后,就是常規(guī)的三板斧安裝!!!
[root@localhost nginx-1.13.6]# ./configure –prefix=/usr/myapp/nginx
[root@localhost nginx-1.13.6]# make && make install
? ?
? ? 然后在nginx的安裝目錄下面找到conf文件,修改里面的nginx.conf 配置。
[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
?
? ? 詳細(xì)配置如下,注意下面“標(biāo)紅”的地方,權(quán)重按照1:5的方式進(jìn)行調(diào)用,關(guān)于其他的配置,大家可以在網(wǎng)上搜一下就可以了。
#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;????????????#設(shè)置主機(jī)頭和客戶端真實地址,以便服務(wù)器獲取客戶端真實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;??? ?????????????#????}????#}?}
?
?3. client端的程序搭建
《1》 第一件事就是將?192.168.23.190 映射到本機(jī)的host中去,因為服務(wù)不提供給第三方使用,所以加host還是很輕松的。
192.168.23.190 cluster.com
?
《2》 然后就是client端程序添加服務(wù)引用,代碼如下:
??class?Program ????{? ?????????static?void?Main(string[]?args)? ????????{? ?????????????for?(int?i?=?0;?i?<p>?</p><p>最后來執(zhí)行以下程序,看看1000次循環(huán)中,是不是按照權(quán)重1:5 的方式對后端的wcf進(jìn)行調(diào)用的???</p><p>?</p><p>看到?jīng)]有,是不是很牛逼,我只需要通過cluster.com進(jìn)行服務(wù)訪問,nginx會自動給我復(fù)雜均衡,這就是我們開發(fā)中非常簡單化的wcf復(fù)雜均衡。</p>