Spring Cloud 2020版已經發布了,因為網飛Netflix套件進入維護期,替代方案也出來了,本著“就新不就舊”的原則,個人的知識結構也要更新,所有就有了下面的內容。
按照官方給出的推薦替代品,主要是:閘道器由
Gateway
替換Zuul,斷路器由
Resilience4j
和Sentinel替代Hystrix,負載均衡
LoadBalance
替換Ribbon。
還有例如從Feign衍生出來的OpenFeign等,替換註冊中心Eureka的Nacos、Consul等。
本文主要是想基於Spring Cloud 2020一些新的元件+Docker,組建一個輕量級的微服務Demo,總結一下學習成果,也適用於一些小型的微服務系統,簡單開發,簡單部署。
要是您的系統有千兒八百個微服務,就沒必要看了。
以下選型:
1、註冊中心依然用Eureka。選這個原因很簡單,就是簡單,且夠用。
2、REST客戶端OpenFeign。
3、負載均衡Spring Cloud LoadBalance。
4、斷路器Resilience4j。
5、閘道器Spring Cloud Gateway。
6、部署Docker+指令碼。
服務也簡單,畢竟是學習用,沒有上叢集(Eureka叢集配置《Eureka叢集配置》),沒有配置中心(個人感覺,小型系統,上配置中心麻煩大於好處),不涉及資料庫、Redis、MQ等(這些內容以前文章有寫)。只有4個工程:
b-server透過OpenFeign呼叫a-server,內容都很簡單,主要是看這些元件的配置和使用。
只涉及一些核心用法和配置引數,更多更詳細的可以參看別的資料和官方文件。
Eureka Server&Client
我說Eureka簡單,就體現在下面:
接著是微服務的配置:
多了一個用於監控的actuator,有了這個,在Eureka控制檯上點選註冊的服務,就能看到一些監控資訊。
至此,我們的微服務就能在Eureka上註冊了。
Docker打包&釋出
將工程打包成jar,同級目錄編寫Dockerfile檔案,內容:
FROM openjdk:8VOLUME /tmpADD a-server。jar app。jarENTRYPOINT [“java”,“-Djava。security。egd=file:/dev/。/urandom”,“-jar”,“/app。jar”]
如圖:
在此目錄下執行構建命令:
docker build -t leo。org/aserver 。
別忽略了最後一個
“.”
映象就有了:
接著依次執行就可以了,但是問題也就來了。
透過Docker容器執行的微服務去Eureka註冊的時候用的
不是IP,是容器ID
。當微服務跨容器,跨宿主機時,服務間OpenFeign是無法呼叫的。倒是可以用host來轉一下,把容器ID與IP對應起來,但是N多微服務都要維護host,太麻煩,新增容器都要同步更新,雖然可以將容器的host掛載到宿主機的一個檔案內,也是麻煩。如果上檔次一些,用k8s、Docker Swarm等倒是沒這些問題。
只是我本次就想簡單一點,輕量化,所以才有了下面的解決方案:
1、使用IP註冊
在所有的微服務配置檔案裡增加
eureka。instance。prefer-ip-address=true
表示微服務向Eureka註冊時候使用IP。
注意,這裡說的是使用IP,而不是顯示IP,現在Eureka控制檯上顯示的還是容器ID。
如果想顯示IP,則配置
eureka。instance。instance-id:${eureka。instance。ip-address}:${server。port}
但是因為我們使用了Docker,其註冊的IP是Docker的內部IP,17*,OpenFeign照樣訪問不了,就有了下面的處理方案。
2、註冊宿主機IP
eureka。instance。ip-address=宿主機IP
這樣註冊在Eureka,並提供給其他服務的IP就不是Docker內部的IP,而是宿主機對外提供服務的IP了。
但如果將宿主機IP寫死在配置檔案裡,一個微服務生成一個映象,當我們要基於此映象生成多個容器執行的時候,一般會部署在多個宿主機上,這個寫死的IP就很不合時宜了,所以改成用命令列賦值的辦法:
docker run -d ——name aserver1 ——expose=1001 -p 1001:1001 -e “EUREKA_INSTANCE_IP-ADDRESS=192。168。31。247” -e “SERVER_PORT=1001” -e “INFO_APP_NAME=aserver1” leo。org/aserverdocker run -d ——name aserver2 ——expose=1002 -p 1002:1002 -e “EUREKA_INSTANCE_IP-ADDRESS=192。168。31。248” -e “SERVER_PORT=1002” -e “INFO_APP_NAME=aserver2” leo。org/aserver
上面兩行命令,就分別在247、248兩臺宿主機上根據aserver映象部署了名為aserver1、aserver2兩個容器進行負載。
以上我們可以透過指令碼命令從git或svn上獲取最新程式碼,編譯打成jar,與Dockerfile配合生成映象,透過命令生成容器,這一系列的命令都可以做成sh指令碼,如果再搭配Jenkins,就可以實現自動構建、部署了。
預告:第二篇寫OpenFeign和Gateway,第三篇寫Resilience4j的CircuitBreaker、Bulkhead、RateLimiter