SpringCloud入門(三)Eureka 註冊中心

努力--坚持發表於2024-10-03

一、Eureka註冊中心簡介
假如我們的服務提供者user-service部署了多個例項,如圖:

問題:

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

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

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

- user-service服務例項啟動後,將自己的資訊註冊到eureka-server(Eureka服務端)。這個叫服務註冊
- eureka-server儲存服務名稱到服務例項地址列表的對映關係
- order-service根據服務名稱,拉取例項地址列表。這個叫服務發現或服務拉取


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

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


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

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


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

Eureka的結構和作用:

1)消費者該如何獲取服務提供者具體資訊?
-服務提供者啟動時向eureka註冊自己的資訊
-eureka儲存這些資訊
-消費者根據服務名稱向eureka拉取提供者資訊
2)如果有多個服務提供者,消費者該如何選擇?
-服務消費者利用負載均衡演算法,從服務列表中挑選一個
3)消費者如何感知服務提供者健康狀態?
-服務提供者會每隔30秒向EurekaServer傳送心跳請求,報告健康狀態
-eureka會更新記錄服務列表資訊,心跳不正常會被剔除
-消費者就可以拉取到最新的資訊

在Eureka架構中,微服務角色有兩類:


-1)EurekaServer:服務端,註冊中心
記錄服務資訊;心跳監控
-2)EurekaClient:客戶端
Provider:服務提供者,例如案例中的 user-service
註冊自己的資訊到EurekaServer;每隔30秒向EurekaServer傳送心跳
consumer:服務消費者,例如案例中的 order-service
根據服務名稱從EurekaServer拉取服務列表;基於服務列表做負載均衡,選中一個微服務後發起遠端呼叫。

二、使用Eureka
使用Eureka註冊中心步驟包括:

步驟一、搭建服務註冊中心; 搭建EurekaServer
步驟二、服務註冊;將user-service,order-service都註冊到Eureka
步驟三、服務發現;在order-service中完成服務拉取,然後透過負載均衡挑選一個服務,實現遠端呼叫。

一、搭建服務註冊中心; 搭建EurekaServer

首先大家註冊中心服務端:eureka-server,這必須是一個獨立的微服務

步驟1、在cloud-demo父工程下,建立一個子模組:

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


建立eureka-server服務

步驟2、引入eureka依賴,引入SpringCloud為eureka提供的starter依賴:


步驟3、編寫啟動類

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

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

步驟4、編寫配置檔案

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

server:
  port: 10086
spring:
  application:
    name: eureka-server
eureka:
  client:
    service-url: 
      defaultZone: http://127.0.0.1:10086/eureka


步驟5、啟動服務
啟動微服務,然後在瀏覽器訪問:http://127.0.0.1:10086

看到下面結果就是成功了:

配置成功。

二、服務註冊;將user-service註冊到Eureka

下面,我們將user-service註冊到eureka-server中去。

步驟1、引入依賴

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

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

步驟2、配置檔案

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

spring:
  application:
    name: userservice
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka


步驟3、啟動多個user-service例項

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

首先,複製原來的user-service啟動配置:然後,在彈出的視窗中,填寫資訊:現在,SpringBoot視窗會出現兩個user-service啟動配置:


啟動兩個user-service例項:
檢視eureka-server管理頁面:

和我預期的一樣,配置成功。


三、服務發現;在order-service中完成服務拉取,然後透過負載均衡挑選一個服務,實現遠端呼叫。

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


步驟1、引入依賴

服務發現、服務註冊統一都封裝在eureka-client依賴,因此這一步與服務註冊時一致。
在order-service的pom檔案中,引入下面的eureka-client依賴:

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


步驟2、配置檔案
服務發現也需要知道eureka地址,因此第二步與服務註冊一致,都是配置eureka資訊:

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

spring:
  application:
    name: orderservice
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka

步驟3、服務拉取和負載均衡
最後,我們要去eureka-server中拉取user-service服務的例項列表,並且實現負載均衡。不過這些動作不用我們去做,只需要新增一些註解即可。

在order-service的OrderApplication中,給RestTemplate這個Bean新增一個@LoadBalanced註解:

    /**
     * 建立RestTemplate並注入Spring容器
     * @return
     */
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }


修改order-service服務中的cn.it.order.service包下的OrderService類中的queryOrderById方法。修改訪問的url路徑,用服務名代替ip、埠:(Eureka使用的是http://userservice/user/)

public Order queryOrderById(Long orderId) {
        // 1.查詢訂單
        Order order = orderMapper.findById(orderId);
        // 2.利用RestTemplate發起http請求,查詢使用者
        // 2.1.url路徑
        String url = "http://userservice/user/" + order.getUserId();
        // 2.2.傳送http請求,實現遠端呼叫
        User user = restTemplate.getForObject(url, User.class);
        // 3.封裝user到Order
        order.setUser(user);
        // 4.返回
        return order;
    }


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

步驟4、測試配置

1.重啟orderservice(orderapplication),2. 清空userservice(userapplication)console日誌,

3.訪問orderservice,即訪問localhost:8080/order/101 , localhost:8080/order/102

配置成功。

備註:

Eureka配置中心檢視:EurekaServer Orderservice UserService(2)一共四個服務。

相關文章