簡介
通過上一篇博客 Eureka詳解系列(一)--先談談負載均衡器 ,我們知道了 Eureka 是什么以及為什么要使用它,今天,我們開始研究如何使用 Eureka。
在此之前,先說明一點。網上幾乎所有關於 Eureka 的文章都是基於 Spring 的,但本文的例子不會有任何 Spring 的代碼,我盡量使用 Eureka 原生的 API,后面的源碼分析也是如此。因為 Spring 把 Eureka 藏得越好,我們研究起來就會越困難,畢竟我寫這個系列不是只為了學會怎么使用 Eureka,我們還要分析它的源碼。當然,實際項目中就沒必要這么搞了。
另外,這只是一個簡單的例子,只配置了幾個必備的參數,下篇博客會展開分析。
項目環境
os:win 10
jdk:1.8.0_231
eureka:1.10.11
tomcat:9.0.21
maven:3.6.3
使用例子
如何設計例子
通過 Eureka 的結構圖可以知道,我們需要分別搭建 Eureka Server、Eureka Client for application service、Eureka Client for application client 三個模塊。

我參考了官網的例子,並做了一點小改動,代碼和配置就不一一列出了,具體源碼見文末鏈接。
- eureka-server:作為 Eureka Server,它是一個獨立的 Web 服務,能夠處理 Eureka Client 的 rest 請求:注冊、續約、注銷服務,以及獲取服務的信息。它需要打包成 war 包運行在 tomcat 上。
- eureka-service:作為 application service,它需要向 Eureka Server 注冊自己,並監聽 Eureka Client 的消費請求。
- eureka-client:作為 application client,它需要從 Eureka Server 獲取 application service 的地址,然后訪問 application service。
如何運行例子
我們需要按照順序運行它們。
eureka-server
eureka-server 使用 jersey 作 Web 框架(jersey 和 struts2、springMVC 作用差不多,沒接觸過也不礙事),項目最終要打包成 war 包運行在 tomcat 上。項目的運行方法如下:
- 構建項目。使用
mvn clean package
將項目打包成 eureka.war。 - 將 eureka.war 拷貝到 ${CATALINA_HOME}/webapps 目錄下。
- 啟動 tomcat。通過 http://127.0.0.1:8080/eureka/ 可以訪問成功,這個時候,我們就可以使用 Eureka Client 往上面注冊服務了。另外,我們可以看到,Eureka Server 將自己注冊了上去(30s 內)。

補充一點,官方提供了基於 java 實現的 Eureka Client 來與 Eureka Server 進行交互,其實,我們也可以直接使用 rest 請求,例如,通過 http://127.0.0.1:8080/eureka/v2/apps 可以獲取所有的服務列表。當我們的客戶端不支持 java 時,這些接口將非常有用,具體接口可以參考官網。在項目中,我們查找包含javax.ws.rs.Path
注解的類,也可以找到這些接口。
eureka-service
eureka-service 的實現比較簡單,它先把自己注冊到 Eureka Server,然后一直監聽 application client 的消費,監聽到后,只進行簡單的交互后就直接關閉客戶端。代碼簡化如下:
// 創建ApplicationInfoManager對象(用來注冊、注銷當前實例)
ApplicationInfoManager applicationInfoManager = new ApplicationInfoManager(
new MyDataCenterInstanceConfig(), new EurekaConfigBasedInstanceInfoProvider(instanceConfig).get());
// 創建EurekaClient對象(用來獲取其他服務以及提供內部入口用來注冊、續約、和注銷當前實例)
EurekaClient eurekaClient = new DiscoveryClient(applicationInfoManager, new DefaultEurekaClientConfig());
// 設置當前實例狀態為STARTING
applicationInfoManager.setInstanceStatus(InstanceInfo.InstanceStatus.STARTING);
// 設置當前實例狀態為UP
applicationInfoManager.setInstanceStatus(InstanceInfo.InstanceStatus.UP);
// 和application client交互
// ······
// 關閉客戶端,同時也會注銷當前實例
eurekaClient.shutdown();
操作方法很簡單,只要運行ExampleEurekaService.main
方法就行(加上啟動參數:-Deureka.client.props=sample-eureka-service
)。當控制台出現"Service started and ready to process requests.."時,說明當前實例已經注冊到 Eureka Server,並且准備被消費。

eureka-client
eureka-client 項目的具體邏輯為:從 Eureka Server 上獲取到注冊表,然后和 application service 交互,得到響應后直接關閉客戶端。代碼簡化如下:
// 創建ApplicationInfoManager對象(用來注冊、注銷當前實例)
ApplicationInfoManager applicationInfoManager = new ApplicationInfoManager(
new MyDataCenterInstanceConfig(), new EurekaConfigBasedInstanceInfoProvider(instanceConfig).get());
// 創建EurekaClient對象(用來獲取其他服務以及提供內部入口用來注冊、續約、和注銷當前實例)
EurekaClient eurekaClient = new DiscoveryClient(applicationInfoManager, new DefaultEurekaClientConfig());
// 獲取指定服務的實例對象
InstanceInfo nextServerInfo = eurekaClient.getNextServerFromEureka(vipAddress, false);
// 和application service交互
// ······
// 關閉客戶端
eurekaClient.shutdown();
直接運行ExampleEurekaClient.main
就行(加上啟動參數-Deureka.client.props=sample-eureka-client
)。我們可以從控制台看到整個過程。

以上,通過一個簡單的例子,我們實現了將服務注冊到 Eureka Server 以及正常地消費它。這是非常“入門級”的例子,下篇博客我們再深入研究各種配置參數的作用。
最后,感謝閱讀。
參考資料
https://github.com/Netflix/eureka/wiki/Eureka-at-a-glance
本文為原創文章,轉載請附上原文出處鏈接:https://www.cnblogs.com/ZhangZiSheng001/p/14337985.html