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 版本進(jìn)行學(xué)習(xí)屡贺,之后也會切換到 2.x 版本,好了甩栈,廢話不多說,來看看今天的內(nèi)容吧玉转。


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

1)服務(wù)發(fā)現(xiàn):在計算機(jī)網(wǎng)絡(luò)中,一種自動發(fā)現(xiàn)設(shè)備或者服務(wù)的技術(shù)究抓,通過服務(wù)發(fā)現(xiàn)協(xié)議(Service Discovery Protocol)實現(xiàn)袭灯。
2)服務(wù)注冊:在計算機(jī)網(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)沒有報錯信息了。

擴(kuò)展:上面配置文件中的屬性我是用了駝峰的寫法(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,這樣我們就把客戶端的問題解決了冰悠。

擴(kuò)展:配置參數(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)信息進(jìn)行修改故河,即共有以下三個項目(注:項目可從文末碼云地址中查看):

  • 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 上。這里我們一步步進(jìn)行演示坎拐,如何將 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 進(jìn)行替代囱怕,使用 service-id 的形式,也就是我們在配置文件中配置的 spring.application.name 屬性娃弓,這兩種方式的區(qū)別在于,使用 spring.cloud.config.uri 配置是通過寫死地址的形式配置的台丛,是 Config 客戶端直接去與 Config 服務(wù)端進(jìn)行接觸,配置如下:
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 的高可用進(jìn)行講解,這是我的理解宁否,各位看官如果有不同見解或文章中有錯誤,請不吝指正慕匠。
所用代碼碼云地址:https://gitee.com/AlanShelby/spring-cloud-chapter
知乎專欄地址:https://zhuanlan.zhihu.com/c_200981602
個人微信公眾號:AlanShelby(多多關(guān)注,感謝~)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末台谊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子锅铅,更是在濱河造成了極大的恐慌,老刑警劉巖盐须,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡屉凯,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進(jìn)店門悠砚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人灌旧,你說我怎么就攤上這事∈嗵” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵衡蚂,是天一觀的道長。 經(jīng)常有香客問我毛甲,道長,這世上最難降的妖魔是什么玻募? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮七咧,結(jié)果婚禮上叮叹,老公的妹妹穿的比我還像新娘辈挂。我一直安慰自己衬横,他們只是感情好蜂林,可當(dāng)我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著噪叙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪睁蕾。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天子眶,我揣著相機(jī)與錄音,去河邊找鬼臭杰。 笑死,一個胖子當(dāng)著我的面吹牛渴杆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播磁奖,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼比搭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起敢辩,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎戚长,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體同廉,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年锅劝,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蟆湖。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖诬垂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情伦仍,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布隧枫,位于F島的核電站,受9級特大地震影響谓苟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜涝焙,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望纱皆。 院中可真熱鬧芭商,春花似錦、人聲如沸铛楣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至岸浑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間矢洲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留责静,地道東北人。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓灾螃,卻偏偏與公主長得像,于是被迫代替她去往敵國和親腰鬼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內(nèi)容