服務治理-> Spring Cloud Eureka


  • 服務治理->搭建服務注冊中心

    服務治理可以說是微服務架構中最為核心和基礎的模塊, 它主要用來實現各個微服務 實例的自動化注冊與發現。 為什么我們在微服務架構中那么需要服務治理模塊呢?微服務 系統沒有它會有什么不好的地方嗎?

    在最初開始構建微服務系統的時候可能服務並不多, 我們可以通過做一些靜態配置來 完成服務的調用。 比如,有兩個服務 A 和 B, 其中服務 A 需要調用服務 B 來完成一個業務 操作時, 為了實現服務 B 的高可用, 不論采用服務端負載均衡還是客戶端負載均衡, 都需 要手工維護服務 B 的具體實例清單。 但是隨着業務的發展, 系統功能越來越復雜, 相應的 微服務應用也不斷增加, 我們的靜態配置就會變得越來越難以維護。 並且面對不斷發展的業務, 我們的集群規模、 服務的位置 、 服務的命名等都有可能發生變化, 如果還是通過手 工維護的方式, 那么極易發生錯誤或是命名沖突等問題。 同時, 對於這類靜態內容的維護 也必將消耗大量的人力。

    為了解決微服務架構中的服務實例維護問題, 產生了大量的服務治理框架和產品。 這 些框架和產品的實現都圍繞着服務注冊與服務發現機制來完成對微服務應用實例的自動化管理。

    • 服務注冊:在服務治理框架中, 通常都會構建一個注冊中心, 每個服務單元向注冊 中心登記自己提供的服務, 將主機與端口號、 版本號、 通信協議等一些附加信息告 知注冊中心, 注冊中心按服務名分類組織服務清單。 比如, 我們有兩個提供服務A 的進程分別運行於 192.168.0.100:8000和192.168.0.101:8000位置上, 另外還有三個 提供服務B的進程分別運行千192.168.0.100:9000 、 192.168.0.101:9000、 192.168.0.102:9000位置上。 當這些進程均啟動, 並向注冊中心注冊自己的服務之后, 注冊中心就會維護類似下面的一個服務清單。 另外, 服務注冊中心還需要以心跳的方式去監測清單中的服務是否可用, 若不可用 需要從服務清單中剔除, 達到排除故障服務的效果。

   服務名                                                              位置 

   服務A                                 192.168.0.100:8000、192.168.0.101:8000

   服務B                         192.168.0.100:9000、192.168.0.101:9000、192.168.0.102:9000

 

    • 服務發現:由於在服務治理框架下運作, 服務間的調用不再通過指定具體的實例地 址來實現, 而是通過向服務名發起請求調用實現。 所以, 服務調用方在調用服務提 供方接口的時候, 並不知道具體的服務實例位置。 因此, 調用方需要向服務注冊中 心咨詢服務, 並獲取所有服務的實例清單, 以實現對具體服務實例的訪問。 比如, 現有服務C希望調用服務A, 服務C就需要向注冊中心發起咨詢服務請求, 服務注 冊中心就會將服務A的位置清單返回給服務C, 如按上例服務A的情況,C便獲得 了服務A的兩個可用位置 192.168.0.100:8000和192.168.0.101:8000。 當服務C要發起調用的時候, 便從該清單中以某種輪詢策略取出一 個位置來進行服 務調用, 這就是后續我們將會介紹的客戶端負載均衡。 這里我們只是列舉了一種簡 單的服務治理邏輯, 以方便理解服務治理框架的基本運行思路。 實際的框架為了性 能等因素, 不會采用每次都向服務注冊中心獲取服務的方式, 並且不同的應用場景 在緩存和服務剔除等機制上也會有一些不同的實現策略。

   Spring Cloud Eureka, 使用Netflix Eureka來實現服務注冊與發現, 它既包含了服務端組件,也包含了客戶端組件,並且服務端與客戶端均采用Java編寫,所以Eureka主要適用 於通過Java實現的分布式系統,或是與NM兼容語言構建的系統。但是, 由於Eureka服 務端的服務治理機制提供了完備的RESTfulAPL所以它也支持將非Java語言構建的微服 務應用納入Eureka的服務治理體系中來。只是在使用其他語言平台的時候,需要自己來實 現Eureka的客戶端程序。不過慶幸的是,在目前幾個較為流行的開發平台上,都已經有了 一些針對Eureka 注冊中心的客戶端實現框架, 比如.NET平台的 Steeltoe、 Node.js 的 eureka-js-client等。

    Eureka服務端,我們也稱為服務注冊中心。 它同其他服務注冊中心一樣,支持高可用 配置。它依托於強一致性提供良好的服務實例可用性,可以應對多種不同的故障場景。 如 果Eureka以集群模式部署,當集群中有分片出現故障時,那么Eureka就轉入自我保護模 式。它允許在分片故障期間繼續提供服務的發現和注冊,當故障分片恢復運行時, 集群中 的其他分片會把它們的狀態再次同步回來。以在AWS 上的實踐為例, Netflix推薦每個可 用的區域運行一個Eureka服務端,通過它來形成集群。不同可用區域的服務注冊中心通過 異步模式互相復制各自的狀態,這意味着在任意給定的時間點每個實例關於所有服務的狀 態是有細微差別的。

    Eureka客戶端,主要處理服務的注冊與發現。客戶端服務通過注解和參數配置的方式, 嵌入在客戶端應用程序的代碼中,在應用程序運行時,Eureka客戶端向注冊中心注冊自身 提供的服務並周期性地發送心跳來更新它的服務租約。同時,它也能從服務端查詢當前注 冊的服務信息並把它們緩存到本地並周期性地刷新服務狀態。

    下面我們來構建一些簡單示例,學習如何使用Eureka構建注冊中心以及進行注冊與發 現服務。

搭建服務注冊中心

    首先,創建一個基礎的Spring Boot工程,命名為eureka-server, 並在pom.xml 中引入必要的依賴內容, 代碼如下:

<parent>        
    <groupId>org.springframework.boot</groupId>        
    <artifactId>spring-boot-starter-parent</artifactId>        
    <version>1.5.10.RELEASE</version>        
    <relativePath/> <!-- lookup parent from repository -->    
</parent>
 <dependency>          
     <groupId>org.springframework.cloud</groupId>           
     <artifactId>spring-cloud-starter-eureka-server</artifactId>           
     <version>1.4.4.RELEASE</version>        
 </dependency>
 <dependencyManagement>    
     <dependencies>            
         <dependency>                
             <groupId>org.springframework.cloud</groupId>                
             <artifactId>spring-cloud-dependencies</artifactId>                
             <version>Brixton.SR7</version>                
             <type>pom</type>                
             <scope>import</scope>            
         </dependency>        
     </dependencies>    
 </dependencyManagement>

 

通過@EnableEurekaServer 注解啟動一個服務注冊中心提供給其他應用進行對話。 這一步非常簡單, 只需在一個普通的 Spring Boot 應用中添加這個注解就能開啟此功能, 比 如下面的例子:

https://img2.mukewang.com/5b3075210001800107820526.jpg

    在默認設置下, 該服務注冊中心也會將自己作為客戶端來嘗試注冊它自己,所以我們 需要禁用它的客戶端注冊行為, 只需在 application.properties 中增加如下配置:

https://img.mukewang.com/5b308a540001042808990530.jpg

• eureka.client.register-with-eureka: 由於該應用為注冊中心,所以設置 為 false, 代表不向注冊中心注冊自己。

• eureka.client.fetch-registry: 由於注冊中心的職責就是維護服務實例, 它並不需要去檢索服務, 所以也設置為 false。

   在完成了上面的配置后,啟動應用並訪問 http://localhost: 8081/。可以看到Eureka 信息面板, 其中 Instances currently registered with Eureka 欄是空的, 說明該注冊中心還沒有注冊任何服務。

https://img3.mukewang.com/5b30c3410001fd4f18750971.jpg

  • 服務治理->注冊服務提供者

在完成了服務注冊中心的搭建之后,接下來我們嘗試將一個既有的 Spring Boot 應用加 入 Emeka 的服務治理體系中去。

  • 新建一個新的Spring Boot 項目

https://img2.mukewang.com/5b30cc9b0001e63204150329.jpg

  • 首先, 修改 pom.xml, 增加 Spring Cloud Eureka 模塊的依賴, 具體代 碼如下所示:

https://img1.mukewang.com/5b30ccdc0001e2eb07730761.jpg

  • 接着, 創建HelloContorller   , /hello 請求處理接口, 通過注入 DiscoveryClient對象, 在日志中打 印出服務的相關內容。

https://img3.mukewang.com/5b30cd8900017d1108500500.jpg

  • 然后, 在主類中通過加上 @EnableDiscoveryClient 注解, 激活 Eureka 中的 DiscoveryClient 實現(自動化配置, 創建 DiscoveryClient 接口針對 Eureka 客戶 端的 EurekaDiscoveryClient 實例), 才能實現上述 Controller 中對服務信息的輸出。

https://img4.mukewang.com/5b30cde30001cb3f07390496.jpg

  • 最后 ,我們需要在 application. yml 配置文件中, 通 過 spring. application.name屬性來為 服 務命名, 比如命名 為 hello-service。 再通過 eureka.client. serviceUrl.defaultZone屬性來指定服務注冊中心的地址, 這里 我們指定為之前構建的服務注冊中心地址, 完整配置如下所示:

https://img3.mukewang.com/5b30ce2300019e5005930339.jpg

訪問地址:http://localhost:8081/

https://img3.mukewang.com/5b30cf2c00016f6b10950082.jpg

 

https://img2.mukewang.com/5b30ce8300013a6618290903.jpg

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM