一、前言
公司的項目基於阿里的Dubbo微服務框架開發。為了符合相關監管部門的安全要求,公司購買了華東1、華東2兩套異地服務器,一套是業務服務器,一套是災備服務器。准備在這兩套服務器上實現Dubbo的分布式服務,如下圖:
這里只羅列了部分服務器作為參考說明。其中 api 是消費者服務,driver 和 order 是 提供者服務。華東1 和 華東 2 分別是兩個局域網,局域網內可用內網通信。兩個局域網只能通過外網通信。
二、消費者分布式服務
消費者的分布式是通過 Nginx 配置負載均衡和反向代理實現的。我們把 Nginx 部署在華東1的 api 服務器上,Nginx的配置如下:
1、負載均衡
#gzip on; upstream tomcatServer { #華東1服務器走內網 server 192.168.27.101:8680 weight=10; #華東2服務器走外網 server 139.159.257.207:8680 weight=10; }
2、反向代理
# HTTPS server # server { listen 443 ssl; server_name api.gogo.cn; ssl_certificate /usr/local/certapi/api.pem; ssl_certificate_key /usr/local/certapi/api.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; proxy_connect_timeout 500; proxy_send_timeout 500; proxy_read_timeout 500; client_max_body_size 200m; location / { # root html; # index index.html index.htm; proxy_pass http://tomcatServer/; } }
三、提供者分布式服務
Dubbo 將 zookeeper 當作注冊表來實現微服務框架。zookeeper 其實已經幫我們做好了負載均衡,如上圖:我們把不同服務器上 driver、order 同時注冊到同一個zookeeper 中,當我們調用 driver、order 服務時,zookeeper 會在兩台服務器之間權衡分配,做負載均衡。在 applicationContext.xml 做如下配置...
服務提供者:
<!-- dubbo 配置 --> <dubbo:application name="ts_provider_order"/> <dubbo:registry address="${zookeeper.host}"/> <dubbo:protocol name="dubbo" port="-1"/> <dubbo:provider timeout="60000" retries="0" threadpool="cached" threads="1000" accepts="1000"/> <dubbo:consumer check="false"/> <dubbo:annotation package="com.soft.ts"/>
服務消費者:
<!-- dubbo 配置 --> <dubbo:application name="ts_admin"/> <dubbo:registry address="${zookeeper.host}" /> <dubbo:protocol name="dubbo" port="-1" /> <dubbo:consumer check="false" timeout="60000" retries="0"/> <dubbo:annotation package="com.soft.ts"/>
開始,由於 zookeeper 安裝在華東1, 我們把華東1的所有提供者服務都以內網的形式注冊到 zookeeper 中,整個華東1的服務是正常運行起來了!但是在部署華東2的服務時,發現華東2在調用華東1相關服務的時候,走的竟然是華東1的內網(自然走不通,報錯了)。查了相關資料,說要配置 /etc/hosts。好吧,那就配置吧:
1、服務器的主機名
2、配置 /etc/hosts
vim /etc/hosts
如上,在每台服務器配置上本機外網地址和主機名。
配置完 /etc/hosts 后,試着部署了華東2的服務,發現還是不行,調用華東1相關服務的時候走的竟然還是內網。咋辦嘞?
最后,沒辦法,把華東1的相關服務都以外網的形式注冊到 zookeeper 中。成功解決問題!
四、Linux 文件共享
實現分布式服務有個問題就是文件共享。比如我們系統中,將 api 所在的服務器作為圖片服務器,那么,華東1 和 華東 2 的圖片文件夾就要實現共享,只有這樣,訪問任意一個api服務才不會出現圖片路徑不存在的問題。
第一台服務器
1、安裝 rpcbind 與 nfs
yum install nfs-utils.x86_64 yum install rpcbind
2、編輯export寫入共享方的ip與目錄
vim /etc/exports
寫入:/home/wwwroot/upload 139.159.257.207(rw,sync,no_root_squash)
tips:rw 表示讀寫;sync 表示隨時寫入同步;no_root_squash 表示如果用戶是root,則對該目錄具有root權限。
3、啟動rpcbind與nfs
service rpcbind start
service nfs start
第二台服務器
1、安裝nfs
yum install nfs-utils
2、執行掛載命令
mount -t nfs -o rw 139.159.250.7:/home/wwwroot/upload/ /home/wwwroot/upload/