註冊中心可以說是微服務架構中的”通訊錄“,它記錄了服務和服務地址的映射關係。在分佈式架構中,服務會註冊到這裏,當服務需要調用其它服務時,就這裏找到服務的地址,進行調用。
1、註冊中心的主要作用
服務註冊中心(下稱註冊中心)是微服務架構非常重要的一個組件,在微服務架構裏主要起到了協調者的一個作用。註冊中心一般包含如下幾個功能:
1.1 服務發現:
- 服務註冊/反註冊:保存服務提供者和服務調用者的信息
- 服務訂閱/取消訂閱:服務調用者訂閱服務提供者的信息,最好有實時推送的功能
- 服務路由(可選):具有篩選整合服務提供者的能力。
1.2 服務配置:
- 配置訂閱:服務提供者和服務調用者訂閱微服務相關的配置
- 配置下發:主動將配置推送給服務提供者和服務調用者
1.3 服務健康檢測
- 檢測服務提供者的健康情況
2、常見的註冊中心
2.1 Zookeeper
zookeeper它是一個分佈式服務框架,是Apache Hadoop 的一個子項目,它主要是用來解決分佈式應用中經常遇到的一些數據管理問題,如:統一命名服務、狀態同步服務、集羣管理、分佈式應用配置項的管理等。簡單來說zookeeper=文件系統+監聽通知機制。
2.2 Eureka
Eureka是在Java語言上,基於Restful Api開發的服務註冊與發現組件,Springcloud Netflix中的重要組件
2.3 Consul
Consul是由HashiCorp基於Go語言開發的支持多數據中心分佈式高可用的服務發佈和註冊服務軟件,採用Raft算法保證服務的一致性,且支持健康檢查。
2.4 Nacos
Nacos是一個更易於構建雲原生應用的動態服務發現、配置管理和服務管理平臺。簡單來說 Nacos 就是註冊中心 + 配置中心的組合,提供簡單易用的特性集,幫助我們解決微服務開發必會涉及到的服務註冊與發現,服務配置,服務管理等問題。Nacos 還是 Spring Cloud Alibaba 組件之一,負責服務註冊與發現。
2.5 各註冊中心組件的對比
組件名 |
語言 |
CAP |
一致性算法 |
服務健康檢查 |
對外暴露接口 |
Eureka |
Java |
AP |
無 |
可配支持 |
HTTP |
Consul |
Go |
CP |
Raft |
支持 |
HTTP/DNS |
Zookeeper |
Java |
CP |
Paxos |
支持 |
客戶端 |
Nacos |
Java |
AP |
Raft |
支持 |
HTTP |
3 Eureka
3.1 Eureka概述
Eureka是Netflix開發的服務發現框架,SpringCloud將它集成在自己的子項目spring-cloud-netflix中,實現SpringCloud的服務發現功能。
上圖簡要描述了Eureka的基本架構,由3個角色組成:
- 1、Eureka Server:提供服務註冊和發現
- 2、Service Provider:服務提供方,將自身服務註冊到Eureka,從而使服務消費方能夠找到
- 3、Service Consumer:服務消費方,從Eureka獲取註冊服務列表,從而能夠消費服務
3.2 Eureka的交互流程與原理
- Application Service 相當於本書中的服務提供者,Application Client相當於服務消費者;
- Make Remote Call,可以簡單理解爲調用RESTful API;
- us-east-1c、us-east-1d等都是zone,它們都屬於us-east-1這個region;
由圖可知,Eureka包含兩個組件:Eureka Server 和 Eureka Client,它們的作用如下:
- Eureka Client是一個Java客戶端,用於簡化與Eureka Server的交互;
- Eureka Server提供服務發現的能力,各個微服務啓動時,會通過Eureka Client向Eureka Server進行註冊自己的信息(例如網絡信息),Eureka Server會存儲該服務的信息;
- 微服務啓動後,會週期性地向Eureka Server發送心跳(默認週期爲30秒)以續約自己的信息。如果Eureka Server在一定時間內沒有接收到某個微服務節點的心跳,Eureka Server將會註銷該微服務節點(默認90秒);
- 每個Eureka Server同時也是Eureka Client,多個Eureka Server之間通過複製的方式完成服務註冊表的同步;
- Eureka Client會緩存Eureka Server中的信息。即使所有的Eureka Server節點都宕掉,服務消費者依然可以使用緩存中的信息找到服務提供者。
- 綜上,Eureka通過心跳檢測、健康檢查和客戶端緩存等機制,提高了系統的靈活性、可伸縮性和可用
性。
4 使用Eureka的步驟(示例)
(1)搭建Eureka Server;
1.創建工程:創建子模塊shop_eureka_server
2.導入座標
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
3.配置application.yml
server:
port: 8001
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
registerWithEureka: 是否將自己註冊到Eureka服務中,本身就是所有無需註冊
fetchRegistry : 是否從Eureka中獲取註冊信息
serviceUrlEureka: 客戶端與Eureka服務端進行交互的地址
4.配置啓動類
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
EnableEurekaServer : 激活Eureka Server端配置
5. 打開瀏覽器訪問http://localhost8001即可進入EurekaServer內置的管理控制檯,顯示效果如下
(2)將服務提供者註冊到EurekaServer上;
引入EurekaClient的座標
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-commons</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
2.修改application.yml添加EurekaServer的信息
eureka:
client:
serviceUrl: # eureka server的路徑
defaultZone: http://localhost:8001/eureka/
instance:
prefer-ip-address: true #使用ip註冊
3.修改啓動類,添加服務發現與支持(可選)
@SpringBootApplication
//@EnableDiscoveryClient
//@EnableEurekaClient
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class, args);
}
}
注:從Spring Cloud Edgware版本開始, @EnableDiscoveryClient 或@EnableEurekaClient 可省略。只需加上相關依賴,並進行相應配置,即可將微服務註冊到服務發現組件上。
(3)服務消費者通過註冊中心獲取服務列表,並調用。
在程序中可以使用DiscoveryClient 獲取指定微服務的所有元數據信息:示例:
@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
public class RestTemplateTest {
@Autowired
private DiscoveryClient discoveryClient;
@Test
public void test() {
//根據微服務名稱從註冊中心獲取相關的元數據信息
List<ServiceInstance> instances = discoveryClient.getInstances("shopservice-
product");
for (ServiceInstance instance : instances) {
System.out.println(instance);
}
}
}
5 Eureka中的元數據
- Eureka的元數據有兩種:標準元數據和自定義元數據。
- 標準元數據:主機名、IP地址、端口號、狀態頁和健康檢查等信息,這些信息都會被髮布在服務註冊表中,用於服務之間的調用。
- 自定義元數據:可以使用eureka.instance.metadata-map配置,符合KEY/VALUE的存儲格式。這些元數據可以在遠程客戶端中訪問。