Spring Cloud 之服務(wù)發(fā)現(xiàn)注冊 Eureka

學(xué)習(xí)目標(biāo)

在之前的文章中我們學(xué)習(xí)了 Spring Cloud Config,不知道小伙伴理解了多少,今天我們學(xué)習(xí)一下 Eureka,有些小伙伴問我現(xiàn)在在生產(chǎn)環(huán)境中已經(jīng)很少使用 Spring Cloud Config 和 Eureka 了,為什么還要寫這方面的博客,這里我說明一下,由于我也會剛剛接觸微服務(wù),所以想把 Spring Cloud 生態(tài)圈里的技術(shù)大體都看一看,多了解一些,對以后學(xué)習(xí) Consul、Apollo 等中間件都會有較好的幫助,所以我這里依舊使用了 Spring Boot 1.x 版本進行學(xué)習(xí),之后也會切換到 2.x 版本,好了,廢話不多說,來看看今天的內(nèi)容吧。


服務(wù)發(fā)現(xiàn)/注冊

1)服務(wù)發(fā)現(xiàn):在計算機網(wǎng)絡(luò)中,一種自動發(fā)現(xiàn)設(shè)備或者服務(wù)的技術(shù),通過服務(wù)發(fā)現(xiàn)協(xié)議(Service Discovery Protocol)實現(xiàn)。
2)服務(wù)注冊:在計算機網(wǎng)絡(luò)中,為了更好的治理多個設(shè)備或者服務(wù),這些設(shè)備或者服務(wù)主動或者被動注冊到管理中心,以便服務(wù)被發(fā)現(xiàn)和消費。
3)常見的注冊中心有:

  • Apache Zookeeper
  • Netflix Eureka
  • Consul

4)這里我們要說的是 Spring Cloud Netflix Eureka,Eureka 是有 Netflix 公司發(fā)明的服務(wù)發(fā)現(xiàn)中間件,包括服務(wù)發(fā)現(xiàn)服務(wù)器和客戶端。
核心組件:

  • Eureka Server
  • Eureka Client

Eureka Server

服務(wù)端 Eureka Server:是 Eureka Client 的注冊服務(wù)中心,管理所有注冊服務(wù)、以及其實例信息和狀態(tài)。

創(chuàng)建 spring-cloud-chapter-4-eureka-server 項目

1)上圖中選擇依賴我們添加了 org.springframework.cloud:spring-cloud-starter-eureka-server

2)激活 Eureka Server:@EnableEurekaServer

package top.alanshelby.springcloudchapter4eurekaserver;

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

@SpringBootApplication
@EnableEurekaServer
public class SpringCloudChapter4EurekaServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringCloudChapter4EurekaServerApplication.class, args);
    }
}

3)調(diào)整 Eureka 服務(wù)器配置 application.properties

spring.application.name=spring-cloud-eureka-server
server.port=9090
management.security.enabled = false

此時啟動項目會報如下錯誤,運行效果是沒問題的:

com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: connect
Caused by: java.net.ConnectException: Connection refused: connect

問題原因:Eureka Server 既是注冊服務(wù)器也是客戶端,默認(rèn)情況它也需要配置注冊中心地址,這里它自己是注冊中心,沒有其它可連接的注冊中心,它自己也沒有必要注冊到自己上面。我們訪問 http://localhost:9090/health 鏈接,會找到下面的線索:
description: "Eureka discovery client has not yet successfully connected to a Eureka server"
大致意思是:Eureka 客戶端還沒有成功連接到 Eureka 注冊中心

該問題可通過配置解決,所有我們在 application.properties 配置文件中添加如下配置:

# Spring Cloud Eureka 服務(wù)器做為注冊中心,通常情況下不需要再注冊到其它注冊中心
# 同時,他也不需要去獲取客戶端額信息
# 取消向注冊中心注冊
eureka.client.registerWithEureka = false
# 取消向注冊中心獲取注冊信息(服務(wù)實例的信息)
eureka.client.fetchRegistry = false

我們重新啟動服務(wù)端項目,查看控制臺輸出的日志會發(fā)現(xiàn)已經(jīng)沒有報錯信息了。

擴展:上面配置文件中的屬性我是用了駝峰的寫法(registerWithEureka),而 idea 這個 IDE 代碼提示的是使用"-"分割(register-with-eureka),有些小伙伴會有點疑問,在這里說明一下,在 Spring Boot 中,這幾種配置文件的寫法都是可以的。這里我們搜索一下 org.springframework.boot.bind.RelaxedNames 這個類,里面有一個枚舉類 org.springframework.boot.bind.RelaxedNames.Manipulation,可以解釋這個問題,這里就不再展開講解了,感興趣的小伙伴自己看一下代碼。


Eureka Client

客戶端 Eureka Client:為當(dāng)前服務(wù)提供注冊、同步、查找服務(wù)以及其實例信息或狀態(tài)等能力。

創(chuàng)建 spring-cloud-chapter-4-eureka-client 項目

1)依賴:org.springframework.cloud:spring-cloud-starter-eureka

2)激活:@EnableDiscoveryClient 或者 @EnableEurekaClient

package top.alanshelby.springcloudchapter4eurekaclient;

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

@SpringBootApplication
@EnableEurekaClient
//@EnableDiscoveryClient
public class SpringCloudChapter4EurekaClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringCloudChapter4EurekaClientApplication.class, args);
    }
}

3)調(diào)整 Eureka Client 配置 application.properties

spring.application.name = spring-cloud-eureka-client
server.port = 8080
management.security.enabled = false

啟動項目會有和 Eureka Server 同樣的錯誤,這里就不再重復(fù)提供錯誤信息了,在上面我們也說到了錯誤原因是找不到可以注冊的 Eureka Server,對于客戶端來說,配置好對應(yīng)的注冊中心就可以了。

4)再次調(diào)整 Eureka Client 配置 application.properties

# Spring Cloud Eureka 客戶端注冊到 Eureka 服務(wù)器
eureka.client.serviceUrl.defaultZone = http://localhost:9090/eureka

重啟項目,我們查看一下 Eureka Server 的信息,瀏覽器訪問:http://localhost:9090/,可以看到我們的客戶端已經(jīng)注冊到了注冊中心上,Application 就對應(yīng)我們客戶端中配置的 spring.application.name,這樣我們就把客戶端的問題解決了。

擴展:配置參數(shù)

# 調(diào)整狀態(tài)頁面
eureka.instance.status-page-url-path = /status
# 調(diào)整健康檢查頁面
eureka.instance.health-check-url-path = /health

這里以調(diào)整狀態(tài)頁面為例說明一下:
在啟動類中添加 status 映射,如下所示:

@SpringBootApplication
@EnableEurekaClient
//@EnableDiscoveryClient
@RestController
public class SpringCloudChapter4EurekaClientApplication {
    public static void main(String[] args) {...}

    @GetMapping("/status")
    public String status() {
        return "<h1>200</h1>";
    }
}

啟動項目,訪問 http://localhost:9090/,看到下圖標(biāo)紅信息,點擊后即可跳轉(zhuǎn)到我們自定義的 status 映射,該訪問路徑默認(rèn)為 http://USER-2EN10OPDKM:8080/info。


Spring Cloud Config 整合 Eureka

對于 Spring Cloud Config 工程我們使用 https://zhuanlan.zhihu.com/p/63972057(Spring Cloud 之配置服務(wù)器(下)配置刷新) 中的 spring-cloud-chapter-3-config-server,我們將其更名為 spring-cloud-chapter-4-config-server,修改時要將啟動類以及 pom.xml 中的對應(yīng)信息進行修改,即共有以下三個項目(注:項目可從文末碼云地址中查看):

  • spring-cloud-chapter-4-eureka-server
    • spring.application.name=spring-cloud-eureka-server
    • server.port=9090
  • spring-cloud-chapter-4-config-server
    • spring.application.name=spring-cloud-config-server
    • server.port=7070
  • spring-cloud-chapter-4-eureka-client
    • spring.application.name=spring-cloud-eureka-client
    • server.port=8080

這里我們畫一下圖來看看這三個項目之間的關(guān)系:


可以看出這里的 Config Server 做為了 Eureka Server 的客戶端,將自己注冊到了 Eureka Server 上,Eureka Client 也注冊到了 Eureka Server 上,同時 Eureka Client 也充當(dāng) Config Client,而 Config Client 則會注冊到 Config Server 上。這里我們一步步進行演示,如何將 Spring Cloud Config 整合到 Eureka。

1、調(diào)整 spring-cloud-config-server 成為 Eureka 客戶端

1)在 pom.xml 中引入 spring-cloud-starter-eureka 客戶端的 Maven 依賴

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

2)激活 Eureka 客戶端
在啟動類中添加 @EnableDiscoveryClient 注解,激活 Eureka 客戶端。

@SpringBootApplication
@EnableConfigServer
@EnableDiscoveryClient
public class SpringCloudChapter4ConfigServerApplication {
    public static void main(String[] args) {...}
}

3)調(diào)整 spring-cloud-config-server 應(yīng)用配置(application.properties),這里將端口改為了 7070

spring.application.name = spring-cloud-config-server
server.port = 7070
management.security.enabled = false

# 配置服務(wù)器遠(yuǎn)程 Git 倉庫(GitHub)
spring.cloud.config.server.git.uri = https://github.com/AlanShelby/blogs-temporary.git

# 強制更新
spring.cloud.config.server.git.force-pull = true

# 配置 Eureka 客戶端
# spring-cloud-config-server 注冊到 Eureka 服務(wù)器
eureka.client.serviceUrl.defaultZone = http://localhost:9090/eureka

經(jīng)過以上三個步驟,該 spring-cloud-config-server 就具備 Eureka Client 的能力了。我們依次啟動 spring-cloud-chapter-4-eureka-serverspring-cloud-chapter-4-config-server,訪問 Eureka Server: http://localhost:9090/ 查看,可以看到 spring-cloud-config-server 已經(jīng)注冊到了 spring-cloud-eureka-server 上。

2、調(diào)整 spring-cloud-eureka-client 成為 Config 客戶端

從上面的架構(gòu)圖可以看出,spring-cloud-eureka-client 既是 Eureka 的客戶端,也是 Config 的客戶端,下面我們添加一些配置,讓 spring-cloud-eureka-client 成為 Config 的客戶端。
1)在 pom.xml 中引入 spring-cloud-starter-config 客戶端的 Maven 依賴

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>

2)在 classpath 下創(chuàng)建 bootstrap.properties 配置文件,并添加如下配置:

# Spring Cloud Eureka 客戶端注冊到 Eureka 服務(wù)器
# 注意:當(dāng)前應(yīng)用需要提前獲取應(yīng)用信息,那么將 Eureka 的配置信息提前至 bootstrap.properties 文件
# 原因:bootstrap 上下文是 Spring Boot 上下文的父上下文,它是最先加載的,因此需要最優(yōu)先加載 Eureka 注冊信息
eureka.client.serviceUrl.defaultZone = http://localhost:9090/eureka

# 配置客戶端應(yīng)用關(guān)聯(lián)的應(yīng)用,該配置是可選的,如果不配置,采用 spring.application.name
spring.cloud.config.name = blogstemp
# 關(guān)聯(lián) profile
spring.cloud.config.profile = prod
# 關(guān)聯(lián) label
spring.cloud.config.label = master
# 激活 Config 服務(wù)器發(fā)現(xiàn)
spring.cloud.config.discovery.enabled = true
# 配置 Config 服務(wù)器的應(yīng)用名稱(ServerId)
spring.cloud.config.discovery.service-id = SPRING-CLOUD-CONFIG-SERVER

注意:這里沒有使用之前文章中使用的屬性 spring.cloud.config.uri,而是使用了 spring.cloud.config.discovery.enabledspring.cloud.config.discovery.service-id 進行替代,使用 service-id 的形式,也就是我們在配置文件中配置的 spring.application.name 屬性,這兩種方式的區(qū)別在于,使用 spring.cloud.config.uri 配置是通過寫死地址的形式配置的,是 Config 客戶端直接去與 Config 服務(wù)端進行接觸,配置如下:
spring.cloud.config.uri = http://localhost:9090/
而使用 service-id 的形式,是 Config 客戶端通過 service-id 到 Eureka Server 上找到對應(yīng)的服務(wù),無需固定關(guān)聯(lián) uri,較為靈活。

3)檢驗效果
spring-cloud-chapter-4-eureka-serverspring-cloud-chapter-4-config-server 服務(wù)啟動的前提下,啟動 spring-cloud-eureka-client 服務(wù),通過瀏覽器訪問 http://localhost:8080/env 查看效果。


至此,關(guān)于 Eureka 的簡單使用就講解完了,下一文中會對 Eureka 的高可用進行講解,這是我的理解,各位看官如果有不同見解或文章中有錯誤,請不吝指正。
所用代碼碼云地址:https://gitee.com/AlanShelby/spring-cloud-chapter
知乎專欄地址:https://zhuanlan.zhihu.com/c_200981602
個人微信公眾號:AlanShelby(多多關(guān)注,感謝~)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容