本文介紹如何搭建高可用 Eureka 集群,並解決該過程中遇到的一些坑。本文算是 Eureka 系列文章的第一篇,後面會繼續探索基于 Docker 的 Eureka 集群搭建、灰度發布、金絲雀發布、AB測試以及藍綠部署,從而做到無縫的升級更新服務。
首先,我解釋下所謂的灰度發布、金絲雀發布、AB測試、藍綠部署。
所謂灰度發布,是指先發布新版本,但是流量不直接切到該節點,而是先把測試人員的流量切到該節點,然後進行測試,如果沒問題,便可以把所有流量切到新節點,我們就以最簡單的系統來舉個例子。假設某電商系統要升級,我們先在 另一個(相對目前運行的系統)端口部署新版本,然後在 nginx(或者別的負載均衡)裏配置將測試賬號的流量切到該節點,如果測試OK 沒問題,則把所有流量切到新系統。
金絲雀發布,我個人理解和灰度發布一致,國內外叫法不一樣的緣故吧,如有誤,歡迎糾正。
AB測試則是線上的系統不同用戶看到的功能不一樣,比如A用戶看到A功能,B用戶看到B功能,然後分析數據,最後確定到底A功能好還是B功能好。
藍綠部署則是有兩組服務器,比如A和B,發布前,流量先都切到A,然後發布B,之後流量切到B。
其實,藍綠發布和灰度發布很想象,但是前者保留了A,意味著可以隨時回退,且回退很容易,而灰度發布則不容易回退喽。在實際場景下,建議灰度發布和藍綠發布相結合。可以用兩組 docker 來實現,雖然是雙倍資源占用,但是 docker 你可以在發布後停止,這樣則僅占用存儲空間,也談不上浪費。好了,正文開始:
創建 Spring boot 項目
首先,我們用 idea 新建一個項目,左側點擊 Spring Initializr 然後 Next 填入相關信息,然後繼續 Next,左側點擊 Web 右側勾選 Spring Web Starter,接著 左側點擊 Spring Cloud Discovery 右側勾選 Eureka Server 最後繼續 Next 完成項目的創建。
接著找到 入口類,比如 EurekaApplication ,添加注解:@EnableEurekaServer 以及 @EnableDiscoveryClient 然後修改 application.properties
修改 application.properties 文件
1、修改 application.properties 文件如下:
spring.profiles.active=node1 spring.profiles.include=default
2、新增 application-default.properties 文件如下:
server.port=6161 spring.application.name=eureka-server eureka.client.register-with-eureka=true eureka.client.fetch-registry=true eureka.instance.prefer-ip-address=false
3、新增 application-node1.properties 文件如下:
server.port=6161 eureka.instance.hostname=eureka-server1 eureka.client.serviceUrl.defaultZone=http://eureka-server3:6163/eureka/,http://eureka-server2:6162/eureka/
4、新增 application-node2.properties 文件如下:
server.port=6162 eureka.instance.hostname=eureka-server2 eureka.client.serviceUrl.defaultZone=http://eureka-server1:6161/eureka/,http://eureka-server3:6163/eureka/
5、新增 application-node3.properties 文件如下:
server.port=6163 eureka.instance.hostname=eureka-server3 eureka.client.serviceUrl.defaultZone=http://eureka-server1:6161/eureka/,http://eureka-server2:6162/eureka/
現在,我們可以打包了,打包後在終端裏分別執行:
java -jar ./target/eureka-0.0.1-SNAPSHOT.jar –spring.profiles.active=node1 java -jar ./target/eureka-0.0.1-SNAPSHOT.jar –spring.profiles.active=node2 java -jar ./target/eureka-0.0.1-SNAPSHOT.jar –spring.profiles.active=node3
6、hosts 文件裏 新增如下幾行
127.0.0.1 eureka-server1 127.0.0.1 eureka-server2 127.0.0.1 eureka-server3
現在 你可以打開浏覽器訪問:http://localhost:6161/ 或者 http://localhost:6162/ 然後多刷新幾下,然後查看 General Info 下面的 registered-replicas 以及 available-replicas 另外還有 unavailable-replicas, 看下 available-replicas 裏面是否有另外兩個節點。
遇到的問題,available-replicas 爲空,unavailable-replicas 裏的信息與 registered-replicas 一樣:
講道理,按我給的配置不應該出現這個問題,但是我遇到過這個問題,主要是要確保:
1、各個節點 只能共享同一個 spring.application.name 或 eureka.instance.appname,不能 node1 裏是 spring.application.name=eureka-server1 而 node2 裏是 spring.application.name=eureka-server2,這樣子是不行,你只能在默認的 配置裏寫入 spring.application.name=eureka-server,或者 eureka.instance.appname=eureka-server 這兩個值必須是各個節點共享的。
2、每個節點都必須配置 eureka.instance.hostname 且 eureka.client.serviceUrl.defaultZone 裏面需要配置除了自身外的其他節點信息,多個節點間用逗號隔開,另外,hostname 不能用 localhost,比如這裏,我分別用了 eureka-server1 、eureka-server2 以及 eureka-server3
3、另外也看到說要配置: eureka.instance.prefer-ip-address=false 但是新版裏已經是默認的 false 了,不過,配置爲 true 的確有問題。
4、同樣的,看到說要配置:eureka.client.fetch-registry=true 以及 eureka.client.register-with-eureka=true 不過,最新版本裏也是默認爲 true,且我已經試過,如果改爲 false 的確會出問題。
5、最後,一定要解析域名,你也可以在 hosts 文件裏指定死。