背景
服務的客戶端采用客戶端服務發(fā)現(xiàn)或者服務端服務發(fā)現(xiàn)來確定發(fā)送請求的實例地址赃绊。
問題
客戶端服務發(fā)現(xiàn) 里的客戶端和 / 或者 服務端服務發(fā)現(xiàn) 里的路由如何知道服務的可用實例羡榴?
限制
- 每個服務實例通過一個單獨的地址(主機和端口)暴露一個遠程API,比如 HTTP / REST忠售,或者 Thrift 等等
- 服務實例的數(shù)量和地址動態(tài)改變。虛擬機和容器通常分配一個動態(tài)IP地址卦方。比如泰佳,EC2 Autoscaling Group基于負載調整實例數(shù)量。
解決方案
實現(xiàn)服務注冊中心逝她,它是服務,服務實例和地址的數(shù)據庫近刘。服務實例啟動時注冊到注冊中心臀晃,終止時取消注冊。服務客戶端和路由查詢服務注冊中心积仗,找出可用的服務實例寂曹。服務注冊中心也許調用服務實例的心跳檢查API來驗證它是否可以處理請求
示例
微服務示例應用是采用了客戶端服務發(fā)現(xiàn)的示例應用。它用Scala編寫隆圆,使用了Spring Boot 和 Spring Cloud作為 微服務基架渺氧。他們提供了各種各樣的能力,包括Netflix Eureka服務注冊中心
Eureka Server是個小型的Spring Boot應用:
@SpringBootApplication
@EnableEurekaServer
public class EurekaServer {
public static void main(String[] args) {
new SpringApplicationBuilder(EurekaServer.class).web(true).run(args);
}
}
采用Docker部署:
eureka:
image: java:openjdk-8u91-jdk
working_dir: /app
volumes:
- ./eureka-server/build/libs:/app
command: java -jar /app/eureka-server.jar --server.port=8761
ports:
- "8761:8761"
其他服務注冊中心的例子(或者通常用來作為服務注冊的技術)包括:
一些系統(tǒng)白华,比如Kubernetes贩耐,Marathon 和 AWS ELB 擁有隱式的服務注冊中心。
結果
服務注冊中心模式包含以下優(yōu)勢:
- 服務客戶端和路由可以發(fā)現(xiàn)服務實例的地址
也有如下弊端:
除非服務注冊中心內置到基礎設施潮太,否則它是另外一個基礎組件,需要被安裝更鲁,配置和管理。此外漂坏,服務注冊中心是個關鍵的系統(tǒng)組件缀壤。雖然客戶端應該緩存服務注冊中心提供的數(shù)據,但是如果服務注冊中心掛掉筋夏,這些數(shù)據最終會過期图呢。因此,服務注冊中心必須高可用蛤织。
你必須掘洞服務實例如何注冊到服務注冊中心。有兩個選擇:
服務注冊中心的客戶端必須知道服務注冊中心的地址摊鸡。服務注冊中心實例必須部署到固定和已知的IP地址∈窃客戶端將配置這些IP地址猎提。
比如,Netflix Eureka 的服務實例通常采用彈性IP地址部署疙教◎揪妫可能的彈性IP地址池采用屬性文件或通過DNS配置。當Eureka實例啟動肯夏,它咨詢配置,決定用哪個可用的彈性IP地址烁兰。Eureka客戶端通常配置彈性IP地址池徊都。
相關模式
- 客戶端服務發(fā)現(xiàn) 和 服務端服務發(fā)現(xiàn) 產生了服務注冊中心的需求
- 自注冊 和 第三方注冊 是服務實例能夠注冊到服務注冊中心的不同方式
- 健康檢查API - 服務注冊中心調用服務實例的健康檢查API,檢查它是否能處理請求