「Chris Richardson 微服務(wù)系列」服務(wù)發(fā)現(xiàn)的可行方案以及實踐案例

編者的話|本文來自 Nginx 官方博客,是微服務(wù)系列的第四篇文章。第一篇介紹了微服務(wù)架構(gòu)的模式编矾,討論了使用微服務(wù)架構(gòu)的優(yōu)缺點;第二篇和第三篇描述了微服務(wù)架構(gòu)內(nèi)部的通訊機(jī)制馁害。這篇文章中窄俏,我們將會探討服務(wù)發(fā)現(xiàn)。

作者介紹:Chris Richardson碘菜,是世界著名的軟件大師凹蜈,經(jīng)典技術(shù)著作《POJOS IN ACTION》一書的作者,也是 cloudfoundry.com 最初的創(chuàng)始人忍啸,Chris Richardson 與 Martin Fowler仰坦、Sam Newman、Adrian Cockcroft 等并稱為世界十大軟件架構(gòu)師计雌。

image.png

Chris Richardson 所著所有文章已獨(dú)家授權(quán) DaoCloud 翻譯并刊載悄晃。

本系列包含 7 篇文章,介紹了微服務(wù)的設(shè)計凿滤、構(gòu)建和部署妈橄,并與傳統(tǒng)的單體架構(gòu)進(jìn)行了比較。本系列將分析微服務(wù)架構(gòu)的各種因素翁脆,你也將了解微服務(wù)架構(gòu)模型的優(yōu)劣眷蚓、是否適合你的項目,以及如何應(yīng)用反番。

Chris Richardson 微服務(wù)系列全 7 篇:

  1. 微服務(wù)架構(gòu)的優(yōu)勢與不足
  2. 使用 API 網(wǎng)關(guān)構(gòu)建微服務(wù)
  3. 深入微服務(wù)架構(gòu)的進(jìn)程間通信
  4. 服務(wù)發(fā)現(xiàn)的可行方案以及實踐案例
  5. 微服務(wù)的事件驅(qū)動數(shù)據(jù)管理
  6. 選擇微服務(wù)部署策略
  7. 將單體應(yīng)用改造為微服務(wù)

本期內(nèi)容:

為什么要使用服務(wù)發(fā)現(xiàn)?

假設(shè)我們寫的代碼會調(diào)用 REST API 或者 Thrift API 的服務(wù)沙热。為了完成一次請求,代碼需要知道服務(wù)實例的網(wǎng)絡(luò)位置(IP 地址和端口)罢缸。運(yùn)行在物理硬件上的傳統(tǒng)應(yīng)用中篙贸,服務(wù)實例的網(wǎng)絡(luò)位置是相對固定的;代碼能從一個偶爾更新的配置文件中讀取網(wǎng)絡(luò)位置枫疆。

對于基于云端的歉秫、現(xiàn)代化的微服務(wù)應(yīng)用而言,這卻是一大難題养铸,正如下圖所示雁芙。

Richardson-microservices-part4-1_difficult-service-discovery

服務(wù)實例的網(wǎng)絡(luò)位置都是動態(tài)分配的。由于擴(kuò)展钞螟、失敗和升級兔甘,服務(wù)實例會經(jīng)常動態(tài)改變,因此鳞滨,客戶端代碼需要使用更加復(fù)雜的服務(wù)發(fā)現(xiàn)機(jī)制洞焙。

服務(wù)發(fā)現(xiàn)有兩大模式:客戶端發(fā)現(xiàn)模式和服務(wù)端發(fā)現(xiàn)模式。我們先來了解客客戶端發(fā)現(xiàn)模式。

客戶端發(fā)現(xiàn)模式

使用客戶端發(fā)現(xiàn)模式時澡匪,客戶端決定相應(yīng)服務(wù)實例的網(wǎng)絡(luò)位置熔任,并且對請求實現(xiàn)負(fù)載均衡⊙淝椋客戶端查詢服務(wù)注冊表疑苔,后者是一個可用服務(wù)實例的數(shù)據(jù)庫;然后使用負(fù)載均衡算法從中選擇一個實例甸鸟,并發(fā)出請求惦费。

客戶端從服務(wù)注冊服務(wù)中查詢,其中是所有可用服務(wù)實例的庫抢韭⌒狡叮客戶端使用負(fù)載均衡算法從多個服務(wù)實例中選擇出一個,然后發(fā)出請求刻恭。

下圖顯示了這種模式的架構(gòu):

Richardson-microservices-part4-2_client-side-pattern

服務(wù)實例的網(wǎng)絡(luò)位置在啟動時被記錄到服務(wù)注冊表瞧省,等實例終止時被刪除。服務(wù)實例的注冊信息通常使用心跳機(jī)制來定期刷新鳍贾。

Netflix OSS 是客戶端發(fā)現(xiàn)模式的絕佳范例鞍匾。Netflix Eureka 是一個服務(wù)注冊表,為服務(wù)實例注冊管理和查詢可用實例提供了 REST API 接口贾漏。Netflix Ribbon 是 IPC 客戶端候学,與 Eureka 一起實現(xiàn)對請求的負(fù)載均衡藕筋。我們會在后面深入討論 Eureka纵散。

客戶端發(fā)現(xiàn)模式優(yōu)缺點兼有。這一模式相對直接隐圾,除了服務(wù)注冊外伍掀,其它部分無需變動。此外暇藏,由于客戶端知曉可用的服務(wù)實例蜜笤,能針對特定應(yīng)用實現(xiàn)智能負(fù)載均衡,比如使用哈希一致性盐碱。這種模式的一大缺點就是客戶端與服務(wù)注冊綁定把兔,要針對服務(wù)端用到的每個編程語言和框架,實現(xiàn)客戶端的服務(wù)發(fā)現(xiàn)邏輯瓮顽。

分析過客戶端發(fā)現(xiàn)后县好,我們來了解服務(wù)端發(fā)現(xiàn)。

服務(wù)端發(fā)現(xiàn)模式

另外一種服務(wù)發(fā)現(xiàn)的模式是服務(wù)端發(fā)現(xiàn)模式暖混,下圖展現(xiàn)了這種模式的架構(gòu):

客戶端通過負(fù)載均衡器向某個服務(wù)提出請求缕贡,負(fù)載均衡器查詢服務(wù)注冊表,并將請求轉(zhuǎn)發(fā)到可用的服務(wù)實例。如同客戶端發(fā)現(xiàn)晾咪,服務(wù)實例在服務(wù)注冊表中注冊或注銷收擦。

AWS Elastic Load Balancer(ELB)是服務(wù)端發(fā)現(xiàn)路由的例子,ELB 通常均衡來自互聯(lián)網(wǎng)的外部流量谍倦,也可用來負(fù)載均衡 VPC(Virtual private cloud)的內(nèi)部流量塞赂。客戶端使用 DNS 通過 ELB 發(fā)出請求(HTTP 或 TCP)剂跟,ELB 在已注冊的 EC2 實例或 ECS 容器之間負(fù)載均衡减途。這里并沒有單獨(dú)的服務(wù)注冊表,相反曹洽,EC2 實例和 ECS 容器注冊在 ELB鳍置。

HTTP 服務(wù)器與類似 NGINX PLUS 和 NGINX 這樣的負(fù)載均衡起也能用作服務(wù)端的發(fā)現(xiàn)均衡器。Graham Jenson 的 Scalable Architecture DR CoN: Docker, Registrator, Consul, Consul Template and Nginx 一文就描述如何使用 Consul Template 來動態(tài)配置 NGINX 反向代理送淆。Consul Template 定期從 Consul Template 注冊表中的配置數(shù)據(jù)中生成配置文件税产;文件發(fā)生更改即運(yùn)行任意命令。在這篇文章中偷崩,Consul Template 生成 nginx.conf 文件辟拷,用于配置反向代理,然后運(yùn)行命令阐斜,告訴 NGINX 重新加載配置文件衫冻。在更復(fù)雜的實現(xiàn)中,需要使用 HTTP API 或 DNS 來動態(tài)配置 NGINX Plus谒出。

Kubernetes 和 Marathon 這樣的部署環(huán)境會在每個集群上運(yùn)行一個代理隅俘,將代理用作服務(wù)端發(fā)現(xiàn)的負(fù)載均衡器◇栽客戶端使用主機(jī) IP 地址和分配的端口通過代理將請求路由出去为居,向服務(wù)發(fā)送請求。代理將請求透明地轉(zhuǎn)發(fā)到集群中可用的服務(wù)實例杀狡。

服務(wù)端發(fā)現(xiàn)模式兼具優(yōu)缺點蒙畴。它最大的優(yōu)點是客戶端無需關(guān)注發(fā)現(xiàn)的細(xì)節(jié),只需要簡單地向負(fù)載均衡器發(fā)送請求呜象,這減少了編程語言框架需要完成的發(fā)現(xiàn)邏輯膳凝。并且如上文所述,某些部署環(huán)境免費(fèi)提供這一功能恭陡。這種模式也有缺點蹬音。除非負(fù)載均衡器由部署環(huán)境提供,否則會成為一個需要配置和管理的高可用系統(tǒng)組件子姜。

服務(wù)注冊表

服務(wù)注冊表是服務(wù)發(fā)現(xiàn)的核心部分祟绊,是包含服務(wù)實例的網(wǎng)絡(luò)地址的數(shù)據(jù)庫楼入。服務(wù)注冊表需要高可用而且隨時更新∧脸椋客戶端能夠緩存從服務(wù)注冊表中獲取的網(wǎng)絡(luò)地址嘉熊,然而,這些信息最終會過時扬舒,客戶端也就無法發(fā)現(xiàn)服務(wù)實例阐肤。因此,服務(wù)注冊表會包含若干服務(wù)端讲坎,使用復(fù)制協(xié)議保持一致性孕惜。

如前所述,Netflix Eureka 是服務(wù)注冊表的上好案例晨炕,為注冊和請求服務(wù)實例提供了 REST API衫画。服務(wù)實例使用 POST 請求來注冊網(wǎng)絡(luò)地址,每三十秒使用 PUT 請求來刷新注冊信息瓮栗。注冊信息也能通過 HTTP DELETE 請求或者實例超時來被移除削罩。以此類推,客戶端能夠使用 HTTP GET 請求來檢索已注冊的服務(wù)實例费奸。

Netflix 通過在每個 AWS EC2 域運(yùn)行一個或者多個 Eureka 服務(wù)實現(xiàn)高可用性弥激。每個 Eureka 服務(wù)器都運(yùn)行在擁有彈性 IP 地址的 EC2 實例上。DNS TEXT 記錄被用來保存 Eureka 集群配置愿阐,后者包括可用域和 Eureka 服務(wù)器的網(wǎng)絡(luò)地址列表微服。Eureka 服務(wù)在啟動時會查詢 DNS 去獲取 Eureka 集群配置,確定同伴位置缨历,以及給自己分配一個未被使用的彈性 IP 地址以蕴。

Eureka 客戶端,包括服務(wù)和服務(wù)客戶端戈二,查詢 DNS 去發(fā)現(xiàn) Eureka 服務(wù)的網(wǎng)絡(luò)地址舒裤≡剩客戶端首選同一域內(nèi)的 Eureka 服務(wù)觉吭。然而,如果沒有可用服務(wù)仆邓,客戶端會使用其它可用域中的 Eureka 服務(wù)鲜滩。

其它的服務(wù)注冊表包括:

  • etcd – 高可用、分布式节值、一致性的鍵值存儲徙硅,用于共享配置和服務(wù)發(fā)現(xiàn)。Kubernetes 和 Cloud Foundry 是兩個使用 etcd 的著名項目搞疗。
  • consul – 發(fā)現(xiàn)和配置的服務(wù)嗓蘑,提供 API 實現(xiàn)客戶端注冊和發(fā)現(xiàn)服務(wù)。Consul 通過健康檢查來判斷服務(wù)的可用性。
  • Apache ZooKeeper – 被分布式應(yīng)用廣泛使用的高性能協(xié)調(diào)服務(wù)桩皿。Apache ZooKeeper 最初是 Hadoop 的子項目豌汇,現(xiàn)在已成為頂級項目。

此外泄隔,如前所強(qiáng)調(diào)拒贱,像 Kubernetes、Marathon 和 AWS 并沒有明確的服務(wù)注冊佛嬉,相反逻澳,服務(wù)注冊已經(jīng)內(nèi)置在基礎(chǔ)設(shè)施中。

了解了服務(wù)注冊的概念后暖呕,現(xiàn)在了解服務(wù)實例如何在注冊表中注冊斜做。

服務(wù)注冊的方式

如前所述湾揽,服務(wù)實例必須在注冊表中注冊和注銷钝腺。注冊和注銷有兩種不同的方法艳狐。方法一是服務(wù)實例自己注冊毫目,也叫自注冊模式(self-registration pattern);另一種是采用管理服務(wù)實例注冊的其它系統(tǒng)組件箱蟆,即第三方注冊模式空猜。

自注冊方式

當(dāng)使用自注冊模式時辈毯,服務(wù)實例負(fù)責(zé)在服務(wù)注冊表中注冊和注銷谆沃。另外仪芒,如果需要的話耕陷,一個服務(wù)實例也要發(fā)送心跳來保證注冊信息不會過時啃炸。下圖描述了這種架構(gòu):

Netflix OSS Eureka 客戶端是非常好的案例卓舵,它負(fù)責(zé)處理服務(wù)實例的注冊和注銷掏湾。Spring Cloud 能夠執(zhí)行包括服務(wù)發(fā)現(xiàn)在內(nèi)的各種模式,使得利用 Eureka 自動注冊服務(wù)實例更簡單筑公,只需要給 Java 配置類注釋 @EnableEurekaClient匣屡。

自注冊模式優(yōu)缺點兼?zhèn)淠吹印K鄬唵味焓浚瑹o需其它系統(tǒng)組件掉盅。然而趾痘,它的主要缺點是把服務(wù)實例和服務(wù)注冊表耦合永票,必須在每個編程語言和框架內(nèi)實現(xiàn)注冊代碼。

另一個方案將服務(wù)與服務(wù)注冊表解耦合艰赞,被稱作第三方注冊模式肚吏。

第三方注冊模式

使用第三方注冊模式,服務(wù)實例則不需要向服務(wù)注冊表注冊狭魂;相反罚攀,被稱為服務(wù)注冊器的另一個系統(tǒng)模塊會處理。服務(wù)注冊器會通過查詢部署環(huán)境或訂閱事件的方式來跟蹤運(yùn)行實例的更改斋泄。一旦偵測到有新的可用服務(wù)實例,會向注冊表注冊此服務(wù)炫掐。服務(wù)管理器也負(fù)責(zé)注銷終止的服務(wù)實例魁莉。下面是這種模式的架構(gòu)圖募胃。

Registrator 是一個開源的服務(wù)注冊項目旗唁,它能夠自動注冊和注銷被部署為 Docker 容器的服務(wù)實例。Registrator 支持包括 etcd 和 Consul 在內(nèi)的多種服務(wù)注冊表痹束。

NetflixOSS Prana 是另一個服務(wù)注冊器,主要面向非 JVM 語言開發(fā)的服務(wù)祷嘶,是一款與服務(wù)實例一起運(yùn)行的并行應(yīng)用论巍。Prana 使用 Netflix Eureka 來注冊和注銷服務(wù)實例。

服務(wù)注冊器是部署環(huán)境的內(nèi)置組件郑现。由 Autoscaling Group 創(chuàng)建的 EC2 實例能夠自動向 ELB 注冊湃崩。Kubernetes 服務(wù)自動注冊并能夠被發(fā)現(xiàn)。

第三方注冊模式也是優(yōu)缺點兼具辛友。在第三方注冊模式中薄扁,服務(wù)與服務(wù)注冊表解耦合,無需為每個編程語言和框架實現(xiàn)服務(wù)注冊邏輯废累;相反邓梅,服務(wù)實例通過一個專有服務(wù)以中心化的方式進(jìn)行管理。它的不足之處在于邑滨,除非該服務(wù)內(nèi)置于部署環(huán)境日缨,否則需要配置和管理一個高可用的系統(tǒng)組件。

總結(jié)

在微服務(wù)應(yīng)用中掖看,服務(wù)實例的運(yùn)行環(huán)境會動態(tài)變化匣距,實例網(wǎng)絡(luò)地址也是如此面哥。因此,客戶端為了訪問服務(wù)必須使用服務(wù)發(fā)現(xiàn)機(jī)制毅待。

服務(wù)注冊表是服務(wù)發(fā)現(xiàn)的關(guān)鍵部分尚卫。服務(wù)注冊表是可用服務(wù)實例的數(shù)據(jù)庫,提供管理 API 和查詢 API尸红。服務(wù)實例使用管理 API 來實現(xiàn)注冊和注銷吱涉,系統(tǒng)組件使用查詢 API 來發(fā)現(xiàn)可用的服務(wù)實例。

服務(wù)發(fā)現(xiàn)有兩種主要模式:客戶端發(fā)現(xiàn)和服務(wù)端發(fā)現(xiàn)外里。在使用客戶端服務(wù)發(fā)現(xiàn)的系統(tǒng)中邑飒,客戶端查詢服務(wù)注冊表,選擇可用的服務(wù)實例级乐,然后發(fā)出請求疙咸。在使用服務(wù)端發(fā)現(xiàn)的系統(tǒng)中,客戶端通過路由轉(zhuǎn)發(fā)請求风科,路由器查詢服務(wù)注冊表并轉(zhuǎn)發(fā)請求到可用的實例撒轮。

服務(wù)實例的注冊和注銷也有兩種方式。一種是服務(wù)實例自己注冊到服務(wù)注冊表中贼穆,即自注冊模式题山;另一種則是由其它系統(tǒng)組件處理注冊和注銷,也就是第三方注冊模式故痊。

在一些部署環(huán)境中顶瞳,需要使用 Netflix Eureka、etcd愕秫、Apache Zookeeper 等服務(wù)發(fā)現(xiàn)來設(shè)置自己的服務(wù)發(fā)現(xiàn)基礎(chǔ)設(shè)施慨菱。而另一些部署環(huán)境則內(nèi)置了服務(wù)發(fā)現(xiàn)。例如戴甩,Kubernetes 和 Marathon 處理服務(wù)實例的注冊和注銷符喝,它們也在每個集群主機(jī)上運(yùn)行代理,這個代理具有服務(wù)端發(fā)現(xiàn)路由的功能甜孤。

HTTP 反向代理和 NGINX 這樣的負(fù)載均衡器能夠用做服務(wù)器端的服務(wù)發(fā)現(xiàn)均衡器协饲。服務(wù)注冊表能夠?qū)⒙酚尚畔⑼扑偷?NGINX,激活配置更新缴川,譬如使用 Cosul Template茉稠。NGINX Plus 支持額外的動態(tài)配置機(jī)制,能夠通過 DNS 從注冊表中獲取服務(wù)實例的信息把夸,并為遠(yuǎn)程配置提供 API而线。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子吞获,更是在濱河造成了極大的恐慌况凉,老刑警劉巖谚鄙,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件各拷,死亡現(xiàn)場離奇詭異,居然都是意外死亡闷营,警方通過查閱死者的電腦和手機(jī)烤黍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來傻盟,“玉大人速蕊,你說我怎么就攤上這事∧锔埃” “怎么了规哲?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長诽表。 經(jīng)常有香客問我唉锌,道長,這世上最難降的妖魔是什么竿奏? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任袄简,我火速辦了婚禮,結(jié)果婚禮上泛啸,老公的妹妹穿的比我還像新娘绿语。我一直安慰自己,他們只是感情好候址,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布吕粹。 她就那樣靜靜地躺著,像睡著了一般岗仑。 火紅的嫁衣襯著肌膚如雪昂芜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天赔蒲,我揣著相機(jī)與錄音泌神,去河邊找鬼。 笑死舞虱,一個胖子當(dāng)著我的面吹牛欢际,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播矾兜,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼损趋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了椅寺?” 一聲冷哼從身側(cè)響起浑槽,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤蒋失,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后桐玻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體篙挽,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年镊靴,在試婚紗的時候發(fā)現(xiàn)自己被綠了铣卡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡偏竟,死狀恐怖煮落,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情踊谋,我是刑警寧澤蝉仇,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站殖蚕,受9級特大地震影響轿衔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嫌褪,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一呀枢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧笼痛,春花似錦裙秋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至刻坊,卻和暖如春枷恕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谭胚。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工徐块, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人灾而。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓胡控,卻偏偏與公主長得像,于是被迫代替她去往敵國和親旁趟。 傳聞我的和親對象是個殘疾皇子昼激,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353

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