SpringCloud2020替換Netflix套件實踐一

SpringCloud2020替換Netflix套件實踐一

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個工程:

SpringCloud2020替換Netflix套件實踐一

b-server透過OpenFeign呼叫a-server,內容都很簡單,主要是看這些元件的配置和使用。

只涉及一些核心用法和配置引數,更多更詳細的可以參看別的資料和官方文件。

Eureka Server&Client

我說Eureka簡單,就體現在下面:

SpringCloud2020替換Netflix套件實踐一

SpringCloud2020替換Netflix套件實踐一

SpringCloud2020替換Netflix套件實踐一

接著是微服務的配置:

SpringCloud2020替換Netflix套件實踐一

多了一個用於監控的actuator,有了這個,在Eureka控制檯上點選註冊的服務,就能看到一些監控資訊。

SpringCloud2020替換Netflix套件實踐一

SpringCloud2020替換Netflix套件實踐一

至此,我們的微服務就能在Eureka上註冊了。

Docker打包&釋出

將工程打包成jar,同級目錄編寫Dockerfile檔案,內容:

FROM openjdk:8VOLUME /tmpADD a-server。jar app。jarENTRYPOINT [“java”,“-Djava。security。egd=file:/dev/。/urandom”,“-jar”,“/app。jar”]

如圖:

SpringCloud2020替換Netflix套件實踐一

在此目錄下執行構建命令:

docker build -t leo。org/aserver 。

別忽略了最後一個

“.”

映象就有了:

SpringCloud2020替換Netflix套件實踐一

接著依次執行就可以了,但是問題也就來了。

透過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