【Spring Cloud】之 Eureka

王廷雲的部落格發表於2020-10-04

Eureka 簡介


服務治理

Spring Cloud 封裝了 Netflix 公司開發的 Eureka 模組來實現服務治理。

在傳統的 rpc 遠端呼叫框架中,管理每個服務與服務之間依賴關係比較複雜,管理比較複雜,所以需要使用服務治理,管理服務與服務之間的依賴關係,可以實現服務呼叫、負載均衡、容錯等,實現服務發現與註冊

服務註冊與發現

Eureka 採用了 CS 的設計架構,Eureka Server 作為服務註冊功能的伺服器,它是服務註冊中心。而系統中的其他微服務,使用 Eureka Client 客戶端連線到 Eureka Server 並維持心跳連線。這樣系統的維護人員就可以通過 Eureka Server 來監控系統各個微服務是否執行正常。

在服務註冊與發現中,有一個註冊中心,當服務啟動時會把自己當前的服務資訊,比如服務通訊地址等以別名的方式註冊到註冊中心去,而另一個服務則可以以該別名的方式去註冊中心上獲取實際的服務通訊地址,然後實現本地 RPC 呼叫遠端 RPC。遠端呼叫框架的的核心設計思想在於註冊中心,因為註冊中心管理每個服務與服務之間的依賴關係。

在這裡插入圖片描述

Eureka 兩大元件

Eureka 包含兩個元件:Eureka ServerEureka Client

  • Eureka Server:提供服務註冊。各個微服務節點通過配置啟動後,會在 Eureka Server 中進行註冊,這樣 Eureka Server 中的服務登錄檔中將會儲存所有可用服務節點的資訊,服務節點的資訊可以在潔面中直觀看到。
  • Eureka Client:可以通過註冊中心進行訪問的 Java 客戶端,用於簡化 Eureka Server 的互動,其具備一個內建的、使用輪詢(round-robin)負載演算法的負載均衡器。在應用啟動後,客戶端將會想 Eureka Server 傳送心跳(預設週期為30秒)。如果 Eureka Server 在多個心跳週期內沒有接收到某個節點的心跳,Eureka Server 將會從服務登錄檔中把這個服務節點移除(預設90秒)。

構建單機 Eureka


建立 Eureka Server 服務註冊中心

1、建立微服務模組(Module)

2、引入 pom 依賴

<!--eureka-server-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

注意:Eureka 依賴有兩個版本 1.x2.x

  • 1.x 老版本中服務端和客戶端都使用同一個依賴包:

    <!--eureka-server-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>
    
  • 2.x 新版中把服務端和客戶端的依賴分開來了:

    <!--eureka-server-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    
    <!--eureka-client-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    

3、修改 yml 檔案配置資訊

server:
  port: 7001
  
eureka:
  instance:
    hostname: localhost # eureka 服務端的例項名稱
  client:
  	# false 表示不向註冊中心註冊自己
    register-with-eureka: false  
    # false 表示自己端就是註冊中心,我的職責就是維護服務例項,並不需要去檢索服務
    fetch-registry: false  
    service-url:
      # 設定與 Eureka Server 互動的地址,查詢服務和註冊服務需要依賴這個地址
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

4、修改主啟動類

在 SpringBoot 主啟動類中新增 @EnableEurekaServer 註解

修改完後啟動服務,然後訪問配置檔案中的服務地址:localhost:7001/eureka/ 即可看到 Eureka 服務註冊中心頁面。


建立 Eureka Client 客戶端

1、建立微服務模組(Module)

2、引入 pom 依賴

<!--eureka-client-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

3、修改 yml 檔案配置資訊

server:
  port: 8001

spring:
  application:
    # 服務名稱,註冊中心將使用這個名稱
    name: cloud-service-1
    
eureka:
  client:
    # 表示是否將自己註冊進 Eureka Server 預設為 true
    register-with-eureka: true  
    # 是否從 EurekaServer 抓取已有的註冊資訊,預設為true。單節點無所謂,叢集必須設定為 true 才能配合ribbon 使用負載均衡
    fetch-registry: true  
    service-url:
      # Eureka Server 服務地址
      defaultZone: http://localhost:7001/eureka

4、修改主啟動類

在 SpringBoot 主啟動類中新增 @EnableEurekaClient@EnableDiscoveryClient 註解,其中 @EnableEurekaClient 是專門用於 Eureka 的,而 @EnableDiscoveryClient 是所有微服務發現都要用的。


構建 Eureka 叢集


微服務 RPC 遠端呼叫最核心的就是:高可用。為了避免單機突然故障而導致服務不可用,我們需要搭建 Eureka 註冊中心叢集,實現負載均衡 + 故障容錯。

搭建 Eureka Server 叢集

Eureka Server 叢集的原理就是互相註冊、相互守望,說白了就是多臺機器的 Eureka Server 可以互相訪問並共享註冊資訊。

假如有兩臺單機版的 Eureka Server 微服務模組,想要叢集需要修改其 yml 配置資訊。

機器1的配置資訊:

server:
	port: 7001
spring:
	application:
	name: cloud-eureka-service-1
eureka:
	instance:
		hostname: eureka7001.com
	client:
		register-with-eureka: false
		fetch-registry: false
    	service-url:
    		# 註冊到另一臺 Eureka Server 中
			defaultZone: http://eureka7002.com:7002/eureka/

機器2的配置資訊:

server:
	port: 7002
spring:
	application:
	name: cloud-eureka-service-2
eureka:
	instance:
		hostname: eureka7002.com
	client:
		register-with-eureka: false
		fetch-registry: false
    	service-url:
    		# 註冊到另一臺 Eureka Server 中
			defaultZone: http://eureka7001.com:7001/eureka/

Eureka Serve 叢集搭建好啟動並可以訪問之後需要修改客戶端的服務註冊地址為:

eureka:
  client:
    register-with-eureka: true  
    fetch-registry: true  
    service-url:
      # Eureka Server 叢集服務地址
      defaultZone: http://eureka7001.com:7001/eureka, http://eureka7002.com:7002/eureka

客戶端註冊好後,叢集的 Eureka Serve 註冊中心的註冊列表都可以看到該服務。


搭建 Eureka Client 客戶端叢集

所謂 Eureka Client 客戶端叢集,指的是多個提供相同的功能的微服務通過註冊中心集合在一起,比如有5臺機器都是提供支付服務的,然後把這5臺機器叢集註冊到註冊中心,當遠端呼叫該服務的時,註冊中心就會通過負載均衡演算法去呼叫其中一臺機器服務介面。

構建 Eureka Client 服務叢集需要修改微服務面模組中的 yml 配置檔案內容如下:

# 設定服務埠
server:
  port: 8001

# 設定微服務名稱
spring:
  application:
    name: cloud-payment-service

# 配置 eureka 
eureka:
  client:
    register-with-eureka: true
    fetchRegistry: true
    service-url:
      # 註冊中心服務地址,叢集版
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka 
  instance:
  	  # 設定叢集服務的例項名稱
      instance-id: payment8001
      # 訪問路徑可以顯示IP地址
      prefer-ip-address: true     

這裡需要注意的是,叢集中的每個 Eureka Client 需要使用同一個服務名稱,埠可以不一樣,註冊到註冊中心時也需要使用註冊中心的叢集地址。

當 Eureka Client 都成功叢集到註冊中心時,註冊中心就會看到服務列表的 cloud-payment-service 服務下有多個例項服務,我們可以通過 eureka.instance.instance-id 來設定服務例項名稱,通過 eureka.instance.prefer-ip-address 設定點選服務例項時可以顯示服務的IP地址。

在這裡插入圖片描述

測試 Eureka Client 服務叢集呼叫

我們使用 RestTemplate 來進行服務呼叫:

// 建立 RestTemplate 例項
@Configuration
public class ApplicationContextConfig
{
    @Bean
    @LoadBalanced // 提供負載均衡能力
    public RestTemplate getRestTemplate()
    {
        return new RestTemplate();
    }
}

// 遠端呼叫服務時只需要填寫註冊中心的服務名即可
@RestController
@Slf4j
public class OrderController
{
    // 遠端呼叫的服務名
    public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";

    @Resource
    private RestTemplate restTemplate;

    @GetMapping("/consumer/payment/create")
    public CommonResult<Payment> create(Payment payment)
    {
        return restTemplate.postForObject(PAYMENT_URL +"/payment/create",payment,CommonResult.class);
    }
}

注意:要遠端呼叫其它服務,自己本身也要註冊到註冊中心去。

相關文章