【Spring Cloud H 版教程】第二篇:註冊中心組件 Eureka 之入門

1.概述

Eureka 是 Netflix 開源的註冊中心組件,用於集成到 Spring Boot 應用程序。開發者們使用該組件只需要添加一些簡單的配置就可以快速啓用,構建出大型分佈式微服務系統。一個複雜的分佈式微服務系統通常會由成百上千個 Spring Boot 應用程序組成,如果嘗試手動配置每個程序的服務註冊與發現,是非常苦難的,並且擴展性很低,所以服務發現是微服務體系結構的不可缺少的一部分。

Eureka 是用一種 CS 架構,分爲 Eureka Server(服務端、註冊中心) 和 Eureka Client(客戶端)。微服務通過嵌入 Eureka 客戶端向 Eureka 服務端註冊,註冊完成之後各個服務之間就可以相互發現,發起遠程調用。客戶端向 Eureka 註冊時,它將提供有關自身的元數據,例如主機,端口,運行狀況指示器 URL,主頁和其他詳細信息。 Eureka 註冊中心接收每一個客戶端服務的心跳數據, 默認 Eureka 客戶端也就是微服務,每隔 30 秒會主動發送一個服務續約的心跳數據,如果 Eureka 註冊中心在 90 秒內沒有收到服務的續約,就會認爲該服務已經不可用(宕機、關閉),主動將服務信息刪除,讓其下線。Eureka 結構圖如下:
圖片: https://uploader.shimo.im/f/77u5K5i9DbPo2s7E.png

2.Eureka 服務端

Eureka 服務端本身也是一個 Spring Boot 應用程序,爲了讓 Eureka 集成到我們的 Spring Boot 應用程序,我們需要在 POM 中加入 spring-cloud-starter-netflix-eureka-server 的依賴:

<!--spring boot 相關依賴-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- Eureka 服務端依賴-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

由於 JDK 11 刪除了 Eureka 服務端依賴的 JAXB 模塊。所以如果你使用的 JDK 版本爲 JDK 11 ,則必須在 POM 文件中加入以下依賴項:

<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
</dependency>

由於 Eureka 包含了服務端和客戶端,對於單機模式下,爲了避免 Eureka 因執行自我註冊等客戶端行爲而導致的出錯,我們在 application.yml 文件配置 eureka 時,通常需要關閉這些客戶端行爲:

server:
  port: 7001

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false #關閉客戶端行爲
    fetchRegistry: false #關閉客戶端行爲
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

爲了啓用 Eureka 服務端我們需要在應用程序啓動類使用註解 @EnableEurekaServer 進行聲明:

@EnableEurekaServer //啓用Eureka服務端
@SpringBootApplication
public class EurekaMain7001 {
    public static void main(String[] args) {
        SpringApplication.run(EurekaMain7001.class,args);
    }
}

啓動 Eureka 服務端程序之後,可以在瀏覽器輸入地址 http://localhost:7001 打開 Eureka 管理臺:

圖片: https://uploader.shimo.im/f/xaVp32FRgYswcgC9.png

3.Eureka客戶端

Spring Boot 應用程序爲了集成 Eureka 客戶端,我們需要在 POM 中加入 spring-cloud-starter-netflix-eureka-client 依賴:

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

在配置文件 application.yml 文件中加入連接 Eureka 服務端相關配置:

server:
  port: 8088

spring:
  application:
    name: cloud-eureka-client

#連接Eureka註冊中心
eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://localhost:7001/eureka

客戶端程序啓動類需要加入 @EnableDiscoveryClient 或者 @EnableEurekaClient ,啓用 Eureka 客戶端:

@SpringBootApplication
@EnableDiscoveryClient //啓用Eureka客戶端
public class EurekaClientMain8088 {
    public static void main(String[] args) {
        SpringApplication.run(EurekaClientMain8088.class,args);
    }
}

啓動程序可以在控制檯看到服務註冊到 Eureka 的相關日誌:

2020-04-19 17:04:07.199  INFO 56748 --- [           main] o.s.c.n.e.s.EurekaServiceRegistry        : Registering application CLOUD-EUREKA-CLIENT with eureka with status UP
2020-04-19 17:04:07.199  INFO 56748 --- [           main] com.netflix.discovery.DiscoveryClient    : Saw local status change event StatusChangeEvent [timestamp=1587287047199, current=UP, previous=STARTING]
2020-04-19 17:04:07.199  INFO 56748 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient    : DiscoveryClient_CLOUD-EUREKA-CLIENT/PC-20180401RVMG:cloud-eureka-client:8088: registering service...

再次刷新 Eureka 服務端管理臺可以看到註冊上來的服務:
圖片: https://uploader.shimo.im/f/btmxSMGWe08mzdzr.png

4.其他說明

我們使用 Spring Boot 應用程序集成 Eureka 客戶端的時候,既可以使用 @EnableDiscoveryClient 又可以使用 @EnableEurekaClient ,並且使用方式都是相同的,那麼他們有什麼區別呢?
Spring Cloud 定義了服務發現 discovery service 的標準,其他第三方註冊中心組件只需要實現該標準,就可以具備成爲 Spring Cloud 註冊中心的能力,例如 eureka、consul、zookeeper、nacos 等。@EnableDiscoveryClient 是 Spring Cloud 標準的服務發現註解,而 @EnableEurekaClient 是 netflix eureka 自己的服務發現註解,從他們所在的 jar 包就可以看出區別:@EnableDiscoveryClient 基於 spring-cloud-commons , 而 @EnableEurekaClient 基於spring-cloud-netflix。由於 netflix eureka 實現了該標準所以使用上並沒有多大的區別。推薦使用@EnableDiscoveryClient 註解,因爲它是 Spring Cloud 官方的標準註解,可以讓 Spring Cloud 客戶端程序自由地切換註冊中心,而不需要修改啓動類的服務發現註解。

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章