前言
在微服務架構中,服務的注冊與發(fā)現(xiàn)是至關重要的一環(huán)。為了實現(xiàn)這一目標,Eureka 注冊中心應運而生。在本篇文章中,我們將深入理解 Eureka 注冊中心的原理,以及探討服務的注冊與發(fā)現(xiàn)機制。
在微服務的協(xié)作中,服務之間的遠程調(diào)用是常見的需求。然而,使用傳統(tǒng)的 RestTemplate 遠程調(diào)用方式存在一些問題,例如耦合度高、維護困難等。為了解決這些問題,我們將探討如何利用 Eureka 注冊中心來優(yōu)雅地進行服務的注冊與發(fā)現(xiàn),從而更好地構建微服務架構。
接下來,我們將逐步深入探討 Eureka 注冊中心的原理、搭建 Eureka 服務、服務的注冊與發(fā)現(xiàn)等關鍵內(nèi)容。希望通過閱讀本文,可以幫助我們更全面地理解微服務架構中 Eureka 的作用以及如何靈活運用它來構建高效可靠的分布式系統(tǒng)。
一、微服務調(diào)用出現(xiàn)的問題
在微服務架構中,服務之間的遠程調(diào)用是常見的需求。然而,隨著系統(tǒng)的復雜性增加,服務調(diào)用也帶來了一些問題和挑戰(zhàn)。
1.1 服務消費者如何獲取服務提供者的地址信息?
在微服務架構中,服務提供者的地址信息通常是動態(tài)的,可能隨時發(fā)生變化,例如服務的擴容、縮容、遷移等情況。因此,服務消費者需要一種機制來獲取服務提供者的地址信息,以確保能夠正確地發(fā)起遠程調(diào)用。
解決方案:服務注冊與發(fā)現(xiàn)
- 服務提供者在啟動時將自己的地址信息注冊到服務注冊中心,包括主機名、端口號等信息。
- 服務消費者通過查詢服務注冊中心來獲取服務提供者的地址信息,從而可以動態(tài)地發(fā)起調(diào)用。
1.2 如果有多個服務提供者,消費者該如何選擇?
在實際應用中,可能會存在多個提供相同服務的服務提供者,這時服務消費者需要選擇一個合適的提供者來發(fā)起調(diào)用。選擇的依據(jù)可以包括負載均衡、性能指標、健康狀態(tài)等因素。
解決方案:負載均衡
- 負載均衡是一種策略,用于在多個服務提供者之間分配請求,以達到均衡負載的目的。
- 常見的負載均衡策略包括輪詢、隨機、加權輪詢、加權隨機等,不同策略適用于不同的場景。
1.3 消費者如何得知服務提供者的健康狀態(tài)?
在微服務架構中,服務提供者的健康狀態(tài)對于服務消費者是非常重要的信息。如果一個服務提供者出現(xiàn)了故障或不可用,服務消費者需要避免向其發(fā)起請求,以確保系統(tǒng)的穩(wěn)定性和可靠性。
解決方案:健康檢查與容錯機制
- 健康檢查是一種監(jiān)測服務提供者健康狀態(tài)的機制,通常由服務注冊中心來執(zhí)行。
- 服務消費者可以根據(jù)健康檢查的結果來判斷服務提供者是否可用,從而決定是否發(fā)起調(diào)用。
- 容錯機制可以幫助服務消費者處理遠程調(diào)用時可能出現(xiàn)的故障,例如超時、重試、降級等。
其中,Eureka 就是是一種服務注冊與發(fā)現(xiàn)的解決方案,它通過服務注冊中心來解決了微服務調(diào)用中的一些關鍵問題。
二、什么是 Eureka
Eureka 是 Netflix 提供的一款開源的服務注冊與發(fā)現(xiàn)框架,用于構建基于微服務架構的分布式系統(tǒng)。它解決了在微服務架構中,服務的動態(tài)注冊、發(fā)現(xiàn)和負載均衡的問題,是構建可伸縮和高可用性微服務的重要工具之一。
2.1 Eureka 的核心概念
- 服務注冊
在微服務架構中,服務提供者在啟動時將自己的信息注冊到 Eureka 注冊中心,包括服務名稱、網(wǎng)絡地址等。這樣,Eureka 注冊中心就知道了系統(tǒng)中有哪些服務是可用的。
- 服務發(fā)現(xiàn)
服務消費者可以通過查詢 Eureka 注冊中心獲取可用服務的信息,從而決定向哪些服務發(fā)起調(diào)用。Eureka 注冊中心維護了一個服務實例列表,包括每個服務的網(wǎng)絡地址。
- 心跳與健康檢查
Eureka 注冊中心會定期向服務提供者發(fā)送心跳請求,以檢測服務是否仍然可用。如果一個服務在一定時間內(nèi)未發(fā)送心跳,Eureka 將其標記為不可用。這就實現(xiàn)了對服務健康狀態(tài)的監(jiān)控。
- 負載均衡
Eureka 客戶端集成了 Ribbon 負載均衡器,可以在多個服務提供者之間實現(xiàn)負載均衡。通過使用 Ribbon,服務消費者可以選擇一個合適的服務提供者來發(fā)起調(diào)用。
Eureka 的優(yōu)勢
-
簡化了服務調(diào)用: Eureka 提供了簡潔的 API,使得服務的注冊、發(fā)現(xiàn)和調(diào)用變得非常容易。
-
高可用性: Eureka 支持服務注冊中心的集群部署,通過相互注冊來保證注冊中心的高可用性。
-
負載均衡: 集成了 Ribbon 負載均衡器,可實現(xiàn)對多個服務提供者的請求分配,提高系統(tǒng)的性能和穩(wěn)定性。
-
動態(tài)擴展: Eureka 支持服務的動態(tài)注冊和注銷,適應服務實例的動態(tài)變化。
-
健康檢查: 通過心跳和健康檢查,Eureka 能夠及時發(fā)現(xiàn)不可用的服務實例,確保服務的高可用性。
總體而言,Eureka 是一個功能強大的服務注冊與發(fā)現(xiàn)框架,為構建微服務架構提供了可靠的基礎設施支持。
2.2 Eureka 的解決微服務調(diào)用問題的方案
-
服務消費者如何獲取服務提供者的地址信息?
- Eureka 注冊中心: 服務提供者在啟動時將自己的地址信息注冊到 Eureka 注冊中心。服務消費者可以通過查詢 Eureka 注冊中心獲取服務提供者的地址信息。
-
如果有多個服務提供者,消費者該如何選擇?
- 負載均衡: Eureka 支持負載均衡,服務消費者可以使用負載均衡策略來選擇一個合適的服務提供者。Eureka 客戶端集成了 Ribbon 負載均衡器,可方便地實現(xiàn)負載均衡。
-
消費者如何得知服務提供者的健康狀態(tài)?
- 健康檢查: Eureka 注冊中心會定期對服務提供者進行健康檢查,如果一個服務提供者出現(xiàn)故障,Eureka 將其標記為不可用。服務消費者在查詢服務列表時可以過濾掉不可用的服務提供者,確保只選擇健康的服務。
綜上所述,Eureka 提供了服務注冊與發(fā)現(xiàn)的機制,同時集成了負載均衡和健康檢查等功能,有效地解決了微服務調(diào)用中的關鍵問題。通過使用 Eureka,微服務架構中的服務調(diào)用變得更加靈活、可靠、具有高可用性。
三、Eureka 的原理
Eureka 是一個由 Netflix 提供的服務注冊與發(fā)現(xiàn)框架,通過 eureka-server
和 eureka-client
兩部分協(xié)同工作,實現(xiàn)了微服務架構中服務的動態(tài)注冊、發(fā)現(xiàn)、負載均衡和健康檢查等功能。下面我們將深入了解 Eureka 的工作原理。
3.1 Eureka 的核心組件
3.1.1 eureka-server
-
服務注冊中心:
eureka-server
充當服務的注冊中心,負責接收服務提供者注冊信息并維護注冊表。 -
服務注冊表: 服務提供者在啟動時向
eureka-server
注冊自己的信息,包括服務名稱、網(wǎng)絡地址等,形成服務注冊表。 -
健康檢查:
eureka-server
定期向服務提供者發(fā)送心跳,通過健康檢查來維護服務的健康狀態(tài)。
3.1.2 eureka-client
-
服務提供者: 微服務中的各個服務模塊通過
eureka-client
向eureka-server
注冊自己的服務。 -
服務消費者: 微服務中的服務消費者通過
eureka-client
從eureka-server
獲取可用服務的信息,實現(xiàn)服務的發(fā)現(xiàn)。 -
負載均衡:
eureka-client
集成了 Ribbon 負載均衡器,可以在多個服務提供者之間實現(xiàn)負載均衡,提高系統(tǒng)的性能和可靠性。
3.2 Eureka 的工作流程
Eureka 的工作流程可用下圖表示:
-
服務注冊階段:
-
服務提供者啟動時,通過
eureka-client
向eureka-server
注冊自己的服務信息。 -
注冊包括服務名稱、網(wǎng)絡地址等,服務提供者成為服務注冊表的一部分。
-
-
服務發(fā)現(xiàn)階段:
-
服務消費者通過
eureka-client
向eureka-server
發(fā)送服務發(fā)現(xiàn)請求。 -
eureka-server
返回可用服務的信息,包括服務名稱和對應的網(wǎng)絡地址。 -
服務消費者根據(jù)負載均衡策略選擇一個服務提供者。
-
-
健康檢查與維護:
-
eureka-server
定期向服務提供者發(fā)送心跳,檢查服務的健康狀態(tài)。 -
如果一個服務提供者長時間未發(fā)送心跳,
eureka-server
將其標記為不可用。 -
不可用的服務將在服務注冊表中被移除,保持服務注冊表的準確性。
-
通過上述流程,Eureka 實現(xiàn)了服務的動態(tài)注冊與發(fā)現(xiàn),保障了微服務架構的高可用性和彈性擴展能力。Eureka 的原理設計使得微服務之間的調(diào)用更加靈活和可靠。
四、搭建 Eureka 服務
在 Spring Cloud Demo 代碼中搭建 Eureka 服務的步驟如下:
- 創(chuàng)建項目,引入
spring-cloud-starter-netflix-eureka-server
的依賴
<!-- eureka 服務端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
- 編寫啟動類,添加
@EnableEurekaServer
注解
@EnableEurekaServer // 開啟 EurekaServer 自動裝配
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
- 添加
application.yml
文件,編寫下面的配置
server:
port: 10086
spring:
application:
name: eurekaservice # 服務的名稱
eureka:
client:
service-url: # eureka 的地址信息
defaultZone: http://127.0.0.1:10086/eureka/ # eureka 也是一個微服務,因此啟動的時候也會將自己注冊進 eureka 中(為集群起作用)
完成上述所有的步驟之后就可以運行EurekaApplication
啟動類了,然后就可以訪問地址:http://localhost:10086/
。
如果此時出現(xiàn)的頁面如下,就說明搭建 Eureka 服務成功了:
其中Instances currently registered with Eureka
下顯示的就是當前在 Eureka 中注冊的服務。
五、注冊服務
5.1 注冊 user-service 服務
將 user-service
服務注冊到 EurekaServer 中的步驟如下:
- 在
user-service
項目的pom.xml
中引入spring-cloud-starter-netflix-eureka-client
依賴
<!-- eureka 客戶端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- 在
application.yml
文件,編寫下面的配置
spring:
application:
name: userservice
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka/
此時我們發(fā)現(xiàn)這個配置和上面搭建 EurekaServer 時的配置基本相同,其原因就是 Eureka 在啟動的時候也會將自己注冊到 EurekaServer 中,而這個配置的作用就是將指定的服務(通過application name
區(qū)分)注冊到defaultZone
對應地址的 EurekaServer 中。
5.2 注冊 order-service 服務
- 在
order-service
項目的pom.xml
中引入spring-cloud-starter-netflix-eureka-client
依賴
<!-- eureka 客戶端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- 在
application.yml
文件,編寫下面的配置
spring:
application:
name: orderservice
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka/
此時,啟動user-service
和 order-service
服務,再次訪問http://localhost:10086/
就可以發(fā)現(xiàn)成功將服務注冊到 EurekaServer 中了:
5.3 同一個服務啟動多個實例
另外,在IDEA中,我們可以同時啟動一個服務的多個實例,只需要保證不同實例的端口號不要發(fā)生沖突即可。
例如,此時我還想增加兩個user-service
服務的實例,步驟如下:
-
右鍵點擊
UserApplication
,然后選擇Copy Configuration
進行復制 -
然后進行如下設置
-Dserver.port=8082
表明為這個配置重新設置端口號為 8082,可以按照相同的方式,再復制一個配置。
啟動這兩個實例,然后再次訪問http://localhost:10086/
:
此時就可以發(fā)現(xiàn)user-service
新增的兩個實例的服務也成功注冊到了 EurekaServer 中。
六、服務的發(fā)現(xiàn)
把服務注冊到 EurekaServer 之后,要做的就是實現(xiàn)服務的拉取了,EurekaServer 中服務的拉取是基于服務名稱
來獲取服務的列表,然后再對服務列表做負載均衡
選擇出一個服務。
此時我們想要 order-service
能夠拉取到 EurekaServer 中注冊的 user-service
服務,需要進行以下操作:
- 修改
order-service
的代碼,修改訪問的 url 路徑,用服務名代替 IP和端口
public Order queryOrderById(Long orderId) {
// 1. 查詢訂單
Order order = orderMapper.findById(orderId);
// 2. 查詢用戶
// 2.1 構建查詢用戶的 url
String url = "http://userservice/user/" + order.getUserId();
// 2.2 使用 RestTemplate 遠程調(diào)用查詢用戶
User user = restTemplate.getForObject(url, User.class);
// 3. 封裝 user 信息
order.setUser(user);
// 4.返回
return order;
}
此處就使用 userservice
服務名來代替 user-service
服務的 IP 和端口號了。
- 對
order-service
服務的啟動類OrderApplication
中的RestTemplate
添加@LoadBalanced
負載均衡注解
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
/**
* 創(chuàng)建 RestTemplate 并注冊到 Spring 容器
*/
@LoadBalanced // 負載均衡
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
至此,重新啟動 order-service
服務,便能成功從 EurekaServer 中訪問到 user-service
提供的服務了。
此時清空三個 user-service
服務實例的日志記錄,然后在瀏覽器中連續(xù)查詢?nèi)斡唵涡畔ⅲ?/p>
文章來源:http://www.zghlxwxcb.cn/news/detail-720844.html
由此可得知,三個實例各種承擔了一次服務的請求,說明此時負載均衡所采用的策略是輪詢的方式。文章來源地址http://www.zghlxwxcb.cn/news/detail-720844.html
到了這里,關于【Spring Cloud】深入理解 Eureka 注冊中心的原理、服務的注冊與發(fā)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!