springCloud(F版)(4)——zuul叢集及頂層負載均衡
上一篇博文我們引入了zuul路由閘道器實現了對不同生產者服務叢集的路由轉發。不過真正系統釋出時有以下問題:
1.zuul裡的配置檔案會暴露我們所有介面的資訊,放在頂層不合適
2.畢竟落實了路由分發和過濾器功能,當介面很多的時候也是可能宕機的
其他考慮應該還有很多,我只是簡單理解了一下。下面優化一下我上一個博文裡的系統結構圖,將來zuul叢集化實現高可用,另外放一個頂層的負載均衡去訪問下面的zuul叢集。
專案原始碼和可執行jar包已上傳到百度雲盤備份:連結:https://pan.baidu.com/s/1QrfJbNUk9WAbRKf5ApoB7Q 密碼:375p
其實改造很簡單,打包上一個博文裡的zuul工程,執行兩個做成路由叢集,再建立一個zuul工程去專門做頂層的負載均衡。
一、mvn打包上一個博文中做好的zuul工程:
打包方法參考我之前的博文:https://blog.csdn.net/qq_15903671/article/details/81938934
二、執行zuul叢集測試一下:
打包好之後開啟Eureka server和兩個生產者服務叢集,指令上我前面的博文裡找吧。然後啟動我們新的zuul叢集:
命令列進入工程根目錄的target目錄,輸入指令 java -jar **.jar --server.port=8751
再開一個命令列進入相同路徑,輸入指令 java -jar **.jar --server.port=8752
不要貼上我的指令。。。手敲。。。不然會有莫名其妙的字元出現在空格的位置,導致指令引數報錯。其實配置檔案裡Eureka server什麼的也都寫死了,本地測試的時候如果按我教程上寫的8761啟動server不會報錯,要是你DIY了註冊中心埠,或者改了生產者服務叢集的name,那麼這裡的啟動指令怕是要多敲好多字了。強迫症的話研究一下怎麼把配置檔案外接吧,我後續也會專門寫博文教程去學習配置檔案的問題。
如果沒報錯的話,那麼恭喜你,一個zuul路由叢集已經在註冊中心註冊了。
三、再建立一個zuul工程去專門做頂層的負載均衡:
建立過程跟之前的zuul工程一樣我就不截圖了,命名叫balance,也放到testSpringCloud下(還是為了父pom.xml的引入)。
pom.xml和入口類**application.java引入依賴跟上一個博文一樣,我就不贅述了。
修改配置檔案application.properties,內容如下:
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
server.port: 8750
spring.application.name=balance
zuul.routes.client1.path=/balance/**
zuul.routes.client1.service-id=service-zuul
編譯執行,瀏覽器輸入 http://localhost:8750/balance/client1/hi?name=qftest&token=test 試試效果吧(反覆重新整理)。
由於zuul中我們寫了token校驗,會有一個ok的輸出,我們可以在控制檯看到兩個zuul輪詢的響應輸出情況。
至此,我們得到了一個高可用的路由閘道器叢集,一個頂層負載均衡,進一步完善了我們的系統結構。
為了測試一下我們的系統結構在分散式環境中的效果,我特意弄了四臺筆記本做了一個簡單的叢集環境。
第一臺專門做eureka server註冊中心,埠8761
第二臺執行service-client1:8762、service-client2:8764、service-zuul:8751
第三臺執行service-client1:8763、service-client2::8765、service-zuul:8752
第四臺專門做頂層負載均衡,埠8750
註冊中心顯示效果如圖:
可以看到我們一個小型的叢集部署完成,所有系統註冊成功。下面訪問頂層負載均衡測試一下效果,瀏覽器輸入:
http://10.48.4.236:8750/balance/client1/hi?name=qftest&token=test
當然,IP和後面的介面都可以自己DIY,只要你開了相應的service介面就好。分散式部署的時候我的程式出了很大的bug,那就是註冊中心裡全是我的機器名而非ip,當zuul去註冊中心取servic-client*的時候拿到的是對應介面的機器名+埠。。。蛋疼了,無法訪問。。。
解決方法其實很簡單,讓註冊中心知道你所有的service的ip就好,重新啟動所有的service(client1和2還有zuul),啟動的java -jar 指令最後面補一個配置引數進去--eureka.instance.prefer-ip-address=true,意思是把ip也註冊進去。當然了,強迫症可以修改你的原始碼,在配置檔案application.properties中把eureka.instance.prefer-ip-address=true寫進去,就OK了。