1. 程式人生 > >Eureka詳解系列(二)--如何使用Eureka(原生API,無Spring)

Eureka詳解系列(二)--如何使用Eureka(原生API,無Spring)

# 簡介 通過上一篇部落格 [Eureka詳解系列(一)--先談談負載均衡器](https://www.cnblogs.com/ZhangZiSheng001/p/14313051.html) ,我們知道了 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 三個模組。 我參考了[官網的例子](https://github.com/Netflix/eureka/tree/master/eureka-examples),並做了一點小改動,程式碼和配置就不一一列出了,具體原始碼見文末連結。 ![zzs_eureka_13](https://img2020.cnblogs.com/blog/1731892/202101/1731892-20210128090350396-141344343.png) 1. eureka-server:作為 Eureka Server,它是一個獨立的 Web 服務,能夠處理 Eureka Client 的 rest 請求:註冊、續約、登出服務,以及獲取服務的資訊。它需要打包成 war 包執行在 tomcat 上。 2. eureka-service:作為 application service,它需要向 Eureka Server 註冊自己,並監聽 Eureka Client 的消費請求。 3. eureka-client:作為 application client,它需要從 Eureka Server 獲取 application service 的地址,然後訪問 application service。 ## 如何執行例子 我們需要按照順序執行它們。 ### eureka-server eureka-server 使用 jersey 作 Web 框架(jersey 和 struts2、springMVC 作用差不多,沒接觸過也不礙事),專案最終要打包成 war 包執行在 tomcat 上。專案的執行方法如下: 1. 構建專案。使用`mvn clean package`將專案打包成 eureka.war。 2. 將 eureka.war 拷貝到 ${CATALINA_HOME}/webapps 目錄下。 3. 啟動 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 時,這些介面將非常有用,具體介面可以參考[官網](https://github.com/Netflix/eureka/wiki/Eureka-REST-operations)。在專案中,我們查詢包含`javax.ws.rs.Path`註解的類,也可以找到這些介面。 ### eureka-service eureka-service 的實現比較簡單,它先把自己註冊到 Eureka Server,然後一直監聽 application client 的消費,監聽到後,只進行簡單的互動後就直接關閉客戶端。程式碼簡化如下: ```java // 建立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----》這個時候會向Eureka Server註冊自己 applicationInfoManager.setInstanceStatus(InstanceInfo.InstanceStatus.UP); // 和application client互動 // ······ // 關閉客戶端,同時也會登出當前例項 eurekaClient.shutdown(); ``` 操作方法很簡單,只要執行`ExampleEurekaService.main`方法就行。當控制檯出現"_Service started and ready to process requests.._"時,說明當前例項已經註冊到 Eureka Server,並且準備被消費。
### eureka-client eureka-client 專案的具體邏輯為:從 Eureka Server 上獲取到登錄檔,然後和 application service 互動,得到響應後直接關閉客戶端。程式碼簡化如下: ```java // 建立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`就行。我們可以從控制檯看到整個過程。
以上,通過一個簡單的例子,我們實現了將服務註冊到 Eureka Server 以及正常地消費它。這是非常“入門級”的例子,下篇部落格我們再深入研究各種配置引數的作用。 最後,感謝閱讀。 # 參考資料 https://github.com/Netflix/eureka/wiki/Eureka-at-a-glance > 相關原始碼請移步:[https://github.com/ZhangZiSheng001/eureka-demo](https://github.com/ZhangZiSheng001/eureka-demo) >本文為原創文章,轉載請附上原文出處連結:[https://www.cnblogs.com/ZhangZiSheng001/p/14337985.html](https://www.cnblogs.com/ZhangZiSheng001/p/14337985