學(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-server
和 spring-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.enabled
和spring.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-server
和 spring-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)注,感謝~)