微服務的注冊與發現(基於Eureka)


一.微服務架構

服務提供者、服務消費者、服務發現組件這三者之間的關系:

  • 各個微服務在啟動時,將自己的網絡地址等信息注冊到服務發現組件中,服務發現組件會存儲這些信息。
  • 服務消費者可從服務發現組件查詢服務提供者的網絡地址,並使用該地址調用服務提供者的接口。
  • 各個微服務與服務發現組件使用一定機制(例如心跳)通信。服務發現組件如長時間無法與某微服務實例通信,就會注銷該實例。
  • 微服務網絡地址變更時,會重新注冊到服務發現組件。使用這種方式,服務消費者就無需人工修改提供者的網絡地址了。

綜上,服務發現組件應具備以下功能

  • 服務注冊表:是服務發現組件的核心,它用來紀錄各個微服務的信息。
  • 服務注冊與發現:服務注冊是指微服務啟動時,將自己的信息注冊到服務發現組件上的過程。服務發現是指查詢可用微服務列表及其網絡地址的機制。
  • 服務檢查:服務發現組件使用一定機制定時檢測已注冊的服務,如發現某實例長時間無法訪問,就會從服務注冊表中一出該實例

二.Eureka簡介

Eureka是Netflix開源的服務發現組件,本身是一個基於REST的服務。它包含Servcr和Client兩部分。

  • Eureka Server用作服務注冊服務器,提供服務發現的能力,各個微服務啟動時,會向Eureka Server注冊自己的信息(例如IP、端口、微服務名稱等),Eureka Server會存儲這些信息。
  • Eureka Client是一個java客戶端,用來簡化與服務器的交互,作為輪詢負載均衡器,並提供服務的故障切換支持。
  • 微服務啟動后,會周期性(默認30秒)地向Eureka Server發送心跳以續約自己的“租期”。
  • 如果Eureka Server在一定時間內沒有接收到某個微服務實例的心跳,Eureka Server將會注銷該實例(默認90秒)
  • 默認情況下,Eureka Server同時也是Eureka Client。多個Eureka Server實例,互相之間通過復制的方式,來實現服務注冊表中數據的同步。
  • Eureka Client會緩存服務注冊表中的信息。這種方式有一定的優勢——首先,微服務無須每次請求都查詢Eureka Server,從而降低了Eureka Server的壓力;其次,及時Eureka Server所有節點宕掉,服務消費者依然可以使用緩存中的信息找到服務提供者並完成調用。

綜上所述,Eureka通過心跳檢查、客戶端緩存等機制,提高了系統的靈活性、可伸縮性和可用性。

編寫Eureka Server

1.創建一個maven工程,添加以下依賴

 

2.application.yml配置

server:
    port:8761
eureka:
    client:
        registerWithEureka:false
        fetchRegistry:false
        serviceUrl:
            defaultZone:http://localhost:8761/eureka/

配置解釋:

  eureka.client.registerWithEureka:表示是否將自己注冊到Eureka Server,默認為true。由於當前應用就是Eureka Server,故而設置為false。

  eureka.client.fetchRegistry:表示是否從Eureka Server獲取注冊信息,默認為true。因為這是一個單點的Eureka Server,不需要同步其他的Eureka Server節點的數據,故而設置為false。

  eureka.client.serviceUrl.defalseZone:設置與Eureka Server交互的地址,查詢服務和注冊服務都需要依賴這個地址,多個地址可用,用,分割。

3.編寫啟動類,在啟動類上添加@EnableEurekaServer注解,聲明這是一個Eureka Server。

ok搞定,啟動后,訪問http://localhost:8761/

將微服務注冊到Eureka Server上(服務提供者/服務消費者)

1.服務提供者和服務消費者注冊到Eureka Server,pom.xml添加依賴

2.application.yml添加配置

其中,spring.application.name用於指定注冊到Eureka Server上的應用名稱;

eureka.instance.perfer-ip-address = true表示將自己的IP注冊到Eureka Server。如不配置該屬性或將其設置為false,則表示注冊微服務所在操作系統的hostname到Eureka Server。

3.編寫啟動類,在啟動類上配置@EnableDiscoveryClient注解,聲明這是一個Eureka Client。

@EnableDiscoveryClient
@SpringBootApplication
public class ProviderUserApplication{
     public static void main(String[] args){
            SpringApplication.run(ProviderUserApplication.class,args);
    }
}   

也可以使用@EnableEurekaClient注解替代@EnableDiscoveryClient。在Spring Cloud中服務發現組件又多種選擇,例如Zookeeper、Consul等。@EnableDiscoveryClient為各種服務組件提供了支持,該注解是spring-cloud-commons項目的注解,是一個高度抽象。

4.測試

總結:Eureka Client會定時連接Eureka Server,獲取服務注冊表中的信息並緩存在本地。微服務在消費遠程API時總是使用本地緩存中的數據。因此一般來說即使Eureka Server發生宕機,也不會影響到服務之間的調用。

Eureka Server做注冊中心;服務提供者、服務調用者都是一個Eureka Client,兩者通過注冊中心來感知彼此。

 


免責聲明!

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



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