Eureka註冊中心

2023-02-05 18:00:52

Eureka註冊中心

Eureka是充當一個分配者的角色。
為每一個服務註冊分類,然後有服務A需要呼叫服務B的時候,eureka就分配多個服務B中的一個響應給服務A

前置知識:提供者和消費者

在服務呼叫關係中,會有兩個不同的角色:

服務提供者:一次業務中,被其它微服務呼叫的服務。(提供介面給其它微服務)

服務消費者:一次業務中,呼叫其它微服務的服務。(呼叫其它微服務提供的介面)

但是,服務提供者與服務消費者的角色並不是絕對的,而是相對於業務而言。服務既可以是服務提供者,也可以是服務消費者

Eureka工作原理和作用

注意:
①一個微服務,既可以是服務提供者,又可以是服務消費者,因此eureka將服務註冊、服務發現等功能統一封裝到eureka-client端

②Eureka和Nacos都有的兩個細節功能:
I、服務消費者需要找userservice名的服務,Euraka就會將以userservice命名的伺服器埠以列表(快取列表)的形式返回給消費者,這樣消費者就不需要一直存取Euraka造成伺服器壓力。但同時為了保證userservice命名的服務有變化時消費者拉取資訊的準確性,所以Euraka每30s更新列表並返回給消費者。
II、服務提供者都需要心跳檢測,讓Euraka和Nacos知道該提供者還活著。(Nacos心跳檢測更頻繁)

假如我們的服務提供者user-service部署了多個範例,如圖:

大家思考幾個問題:

  • order-service在發起遠端呼叫的時候,該如何得知user-service範例的ip地址和埠?
  • 有多個user-service範例地址,order-service呼叫時該如何選擇?
  • order-service如何得知某個user-service範例是否依然健康,是不是已經宕機?

這些問題都需要利用SpringCloud中的註冊中心來解決,其中最廣為人知的註冊中心就是Eureka,其結構如下:

問題1:order-service如何得知user-service範例地址?

獲取地址資訊的流程如下:

  • user-service服務範例啟動後,將自己的資訊註冊到eureka-server(Eureka伺服器端)。這個叫服務註冊

  • eureka-server儲存服務名稱到服務範例地址列表的對映關係

    由於有這個↑的緣故,所以http請求路徑中埠號寫成服務名稱就可以存取對應的服務

    (由於同一個名的服務有多個埠,最後就由負載均衡決定請求去哪個伺服器埠)

  • order-service根據服務名稱,拉取範例地址列表。這個叫服務發現或服務拉取

問題2:order-service如何從多個user-service範例中選擇具體的範例?

  • order-service從範例列表中利用負載均衡演演算法選中一個範例地址,向該範例地址發起遠端呼叫

問題3:order-service如何得知某個user-service範例是否依然健康,是不是已經宕機?

  • user-service會每隔一段時間(預設30秒)向eureka-server發起請求,報告自己狀態,稱為心跳
  • 當超過一定時間沒有傳送心跳時,eureka-server會認為微服務範例故障,將該範例從服務列表中剔除
  • order-service拉取服務時,就能將故障範例排除了

搭建Eureka

三步驟:

1. 搭建註冊中心EurekaServer

首先大家註冊中心伺服器端:eureka-server,這必須是一個獨立的微服務。
(實際是Eureka自己註冊到Eureka中)

1.1引入依賴

引入SpringCloud為eureka提供的starter依賴:

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

1.2組態檔

編寫一個application.yml檔案,內容如下:

server:
  port: 10086	#當前服務佔用的埠號
spring:
  application:
    name: eureka-server	#eureka服務的服務名稱
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka #eureka的地址資訊

1.3啟動類

給eureka-server服務編寫一個啟動類,一定要新增一個@EnableEurekaServer註解,開啟eureka的註冊中心功能:

package cn.itcast.eureka;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

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

1.4啟動服務

啟動微服務,然後在瀏覽器存取:http://127.0.0.1:10086

啟動成功的介面:

2. 服務註冊

user-service註冊到eureka-server中去

2.1引入依賴

在user-service的pom檔案中,引入下面的eureka-client依賴:

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

2.2組態檔

在user-service中,修改application.yml檔案,新增服務名稱、eureka地址:

server:
  port: 8081 #當前服務佔用的埠號
spring:
  application: 
    name: userservice #設定user-service服務的服務名稱
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka #註冊到哪個eureka地址

2.3啟動多個user-service範例

為了演示一個服務有多個範例的場景,我們新增一個SpringBoot的啟動設定,再啟動一個user-service。

首先,複製原來的user-service啟動設定:

然後,在彈出的視窗中,填寫資訊:

現在,SpringBoot視窗會出現兩個user-service啟動設定:

不過,第一個是8081埠,第二個是8082埠。

啟動兩個user-service範例:

檢視eureka-server管理頁面:

3. 服務發現

我們將order-service的邏輯修改:向eureka-server拉取user-service的資訊,實現服務發現。

3.1 引入依賴

在order-service的pom檔案中,引入下面的eureka-client依賴:

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

3.2 組態檔

在order-service中,修改application.yml檔案,新增服務名稱、eureka地址:

server:
  port: 8080 #當前服務佔用的埠號
spring:
  application:
    name: orderservice #設定user-service服務的服務名稱
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka #eureka的地址資訊

3.3 服務拉取與負責均衡

我們要去eureka-server中拉取user-service服務的範例列表,並且實現負載均衡。

  • 加負責均衡註解
    在order-service的OrderApplication中,給RestTemplate這個Bean新增一個@LoadBalanced註解:

  • 修改存取服務路徑
    修改order-service服務中的cn.itcast.order.service包下的OrderService類中的queryOrderById方法。修改存取的url路徑,用服務名代替ip、埠:

    spring會自動幫助我們從eureka-server端,根據userservice這個服務名稱,獲取範例列表,而後完成負載均衡。