16 圖 | 實戰 Eureka 叢集搭建+服務註冊+呼叫

原文連結:https://mp。weixin。qq。com/s/z-lZlUEKyktNo0N9sv4y6Q

本篇會帶大家做一個

實戰案例

,涉及內容:

配置服務註冊到 Eureka 註冊中心。

服務 之間透過註冊的服務名來訪問。

本地如何搭建 Eureka 叢集。

本地如何搭建微服務叢集。

如何用 Ribbon 實現負載均衡。

16 圖 | 實戰 Eureka 叢集搭建+服務註冊+呼叫

目錄

一、基本原理

註冊 + 服務呼叫

先上原理圖:

16 圖 | 實戰 Eureka 叢集搭建+服務註冊+呼叫

下面說下原理圖中對應的場景:

場景

有一個訂單服務部署在一臺機器上,另外有兩個商品服務部署在一臺機器上,三個服務的埠都不一樣。

商品服務和訂單服務都將自己的地址資訊註冊到 Eureka,Eureka 把這些資訊都快取到登錄檔中。

當訂單服務想要呼叫商品服務時,其實是先從 eureka 上傳獲取商品服務的地址資訊。

訂單服務向兩個商品服務傳送 HTTP 請求。

服務宕機

當有一個商品服務宕機後,eureka 會把這個服務的註冊資訊移除掉,訂單服務也不會呼叫這個商品服務。

16 圖 | 實戰 Eureka 叢集搭建+服務註冊+呼叫

下面我們按照上面伺服器呼叫的場景來簡單使用下 Eureka。

需求:首先有一個訂單服務 OrderService,一個商品服務 ProductService, 訂單服務不知道商品服務的 IP 地址,只是知道商品服務的 的名字,訂單服務透過向 Eureka 註冊中心獲取到了商品服務的具體資訊 IP 地址,然後成功呼叫商品服務的地址 getProduct API。

二、建立 Eureka Server

總工會啟動 4 個微服務,如下圖所示:

16 圖 | 實戰 Eureka 叢集搭建+服務註冊+呼叫

首先建立一個 Eureka 服務。

前提條件:Spring Cloud 基於 Hoxton。SR10 版本,Spring Boot 基於 2。3。2。RELEASE。

啟動類

建立啟動類,Eureka Server 就是這個型別啟動的。

/** * @Author: 公眾號 | 悟空聊架構 * @Date: 2021/9/13 7:28 * @Site: www。passjava。cn * @Github: https://github。com/Jackson0714/eureka-learning */@SpringBootApplication@EnableEurekaServerpublic class EurekaServerApplication { public static void main(String[] args) { SpringApplication。run(EurekaServerApplication。class, args); }}

配置項

然後配置下 Eureka Server 的基本資訊。配置資訊可以放到 application。yml 檔案中。

server: port: 8761eureka: client: register-with-eureka: false fetch-registry: false

port

:Eureka Server 監聽的埠。

register-with-eureka

: 是否把自己註冊到 Eureka,單機情況下,不需要註冊自己。

fetch-registry

: 是否到 Euraka 服務員抓取註冊資訊。

pom。xml 檔案

首先需要配置 pom。xml 檔案,引入 Eureka 依賴。

org。springframework。cloud spring-cloud-starter org。springframework。cloud spring-cloud-starter-config org。springframework。cloud spring-cloud-starter-eureka org。springframework。cloud spring-cloud-starter-netflix-eureka-server

啟動

接下來啟動 Eureka Server 的控制檯。瀏覽器訪問 http://localhost:8761/ 就可以看到控制檯了。

因為還沒有服務註冊到 Eureka,所以控制檯中的服務列表是空的。

16 圖 | 實戰 Eureka 叢集搭建+服務註冊+呼叫

三、建立商品服務

application。yml 配置

商品服務對應的埠為 8006 和 8007,可以先啟動一個商品服務,然後修改埠後,再啟動另外一個商品服務。

server: port: 8006spring: application: name: ProductServiceeureka: instance: hostname: localhost client: serviceUrl: defaultZone: http://localhost:8761/eureka

Controller 類

定義了獲取商品的方法 API,提供給訂單服務呼叫。

/** * 訂單服務的介面 * */@RestControllerpublic class ProductServiceController { /** * 訂單服務 * @param name 商品名稱 * @return 測試返回商品名 */ @RequestMapping(value = “/product/{name}”, method = RequestMethod。GET) public String getProduct(@PathVariable(“name”) String name) { System。out。println(“商品服務被呼叫了”); return “order” + name; }}

啟動類

用來啟動商品服務。

/** * 商品服務 * @Author: 公眾號 | 悟空聊架構 * @Date: 2021/9/13 7:28 * @Site: www。passjava。cn * @Github: https://github。com/Jackson0714/eureka-learning */@SpringBootApplication@EnableEurekaClientpublic class ProductServiceApplication { public static void main(String[] args) { SpringApplication。run(ProductServiceApplication。class, args); }}

pom。xml 檔案

引入 Eureka Client 依賴。

org。springframework。boot spring-boot-starter-web org。springframework。cloud spring-cloud-starter-config org。springframework。cloud spring-cloud-starter-netflix-eureka-client

測試商品服務是否正常啟動

先按照 8006 埠啟動一個商品服務,然後按照 8007 埠啟動另外一個商品服務。

Eureka 控制檯可以看到兩個商品伺服器已啟動。

16 圖 | 實戰 Eureka 叢集搭建+服務註冊+呼叫

測試訪問商品服務

用 Postman 工具進行測試:

http://localhost:8006/getProduct/悟空聊架構專屬商品

返回結果:

16 圖 | 實戰 Eureka 叢集搭建+服務註冊+呼叫

四、建立訂單服務

訂單服務和商品服務的區別

多了一個 Ribbon 依賴。

訂單服務會呼叫商品服務。

org。springframework。cloud spring-cloud-starter-netflix-ribbon

訂單服務呼叫商品服務的 API

@RestController@Configurationpublic class OrderServiceController { @Bean @LoadBalanced public RestTemplate getRestTemplate() { return new RestTemplate(); } /** * 根據訂單 id 查詢商品資訊 * @param id 訂單 id * @return 商品服務返回的資料 */ @RequestMapping(value = “/order/{id}”, method = RequestMethod。GET) public String getOrder(@PathVariable(“id”) String id) { RestTemplate restTemplate = getRestTemplate(); return restTemplate。getForObject(“http://ProductService/product/” + id, String。class); }}

我們看到有一個 @LoadBalanced 註解,這裡做下說明:

RestTemplate 用來實現單個 http 請求的,加了 @LoadBalanced 註解後,就可以實現負載均衡。

測試

啟動訂單服務,IDEA 中可以看到訂單服務:

16 圖 | 實戰 Eureka 叢集搭建+服務註冊+呼叫

可以在 eureka 控制檯看到訂單服務在註冊列表上。

16 圖 | 實戰 Eureka 叢集搭建+服務註冊+呼叫

測試訪問訂單 API

http://localhost:9091/order/悟空聊架構專屬商品

測試結果:

16 圖 | 實戰 Eureka 叢集搭建+服務註冊+呼叫

說明訂單服務

OrderService

透過 Eureka 拿到了的商品服務

ProductService

的 URL 資訊,然後成功呼叫商品服務。如下 URl 所示,只知道商品服務的名字 ProductService,但是不知道具體的 IP 地址。

http://ProductService/product/

透過 Eureka 的登錄檔資訊獲取到了具體的 IP 地址。

192。168。10。197:ProductService:8007192。168。10。197:ProductService:8006

Eureka + 商品服務 + 訂單服務 的演示案例已經完成。

接下來我們看下怎麼把兩個 Eureka Server 組成 Eureka 叢集。

五、組成 Eureka 叢集

修改本地 hosts 配置

host 檔案新增兩臺 Eureka server 的地址對映,都為本地 localhost 地址

127。0。0。1 eureka-server1127。0。0。1 eureka-server2

修改 Eureka Server 配置

兩個服務互相向對方註冊,第一個 Eureka 開放 8761 埠,註冊到第二個 Eureka 的 8762 埠。

第一個 Eureka Server 的配置並啟動

server: port: 8761eureka: instance: hostname: eureka-server1 client: serviceUrl: defaultZone: http://eureka-server1:8762/eureka/

修改第二個 Eureka Server 的配置,並啟動

server: port: 8762eureka: instance: hostname: eureka-server2 client: serviceUrl: defaultZone: http://eureka-server2:8761/eureka/

16 圖 | 實戰 Eureka 叢集搭建+服務註冊+呼叫

訪問 http://localhost:8761/

可以看到兩個 Eureka Server。

16 圖 | 實戰 Eureka 叢集搭建+服務註冊+呼叫

訪問 http://localhost:8762/

可以看到兩個 Eureka Server。

16 圖 | 實戰 Eureka 叢集搭建+服務註冊+呼叫

根據上面的兩張圖,說明兩臺 Eureka Server 組成了一個叢集環境。

六、組成服務叢集

接下來將服務註冊到 Eureka 叢集上。另外因為我最開始用的商品服務的名字是 ServiceA,而不是 ProductService,所以案例中的截圖都是 ServiceA,訂單服務對應的是 ServiceB,不影響案例演示。

將服務 A 配置成註冊到 Eureka 叢集。在 defaultZone 配置中新增第二個 eureka 的服務地址。

server: port: 8006spring: application: name: ServiceAeureka: instance: hostname: localhost client: serviceUrl: defaultZone: http://localhost:8761/eureka,http://localhost:8762/eureka

然後啟動服務 A。

然後將服務 A 的 port 改為 8006 後,再次啟動一個服務 A,相當於部署了兩個服務 A,後續可以作為測試負載均衡的功能。

16 圖 | 實戰 Eureka 叢集搭建+服務註冊+呼叫

發現一個 Eureka 的問題,註冊列表總是重新整理不出最新的註冊資訊,重啟 Eureka 服務後就刷出來了。

接著我們把服務 A 的passjava 方法,打下日誌,後面觀察兩個服務 A 分別被服務 B 呼叫了幾次。

七、修改呼叫者的配置

將服務 B 配置成註冊到 Eureka 叢集。在 defaultZone 配置中新增第二個 eureka 的服務地址。

兩個 Eureka 服務中都有服務 B 的註冊資訊。

16 圖 | 實戰 Eureka 叢集搭建+服務註冊+呼叫

八、測試叢集呼叫

接下來測試兩個服務 A 組成微服務集群后,利用 Ribbon 負載均衡元件實現服務的負載均衡,說白了,就是兩個服務 A,分別被服務 B 平均呼叫了。

測試方法:多次重新整理瀏覽器,訪問服務 B 的 API,服務 B 會呼叫服務 A。如下圖所示:

http://localhost:9091/test/悟空

第一個服務 A 被服務 B 呼叫了 6 次:

16 圖 | 實戰 Eureka 叢集搭建+服務註冊+呼叫

第二個服務A 被服務 B 呼叫了 7 次:

16 圖 | 實戰 Eureka 叢集搭建+服務註冊+呼叫

根據上面的結果說明 Eurkea 叢集 + Ribbon + 微服務叢集的案例演示完成。

九、總結

本篇透過案例演示的方式,帶著大家練習瞭如下內容:

如何使用 Eureka 作為註冊中心。

如何將多個服務註冊到 Eureka 上。

透過使用 Eureka,服務間的呼叫不再需要知道對方的 IP 地址。

如何將兩個 Eureka Server 在本地組成 Eureka 叢集。

如何將多個服務註冊到 Eureka 叢集上。

如何將多個相同的服務組成微服務叢集。