前情概要:微服務(wù)化改造系列之一:總覽
服務(wù)注冊中心概述
這篇文章是微服務(wù)化改造系列的第二篇稚晚,主題是服務(wù)注冊中心崇堵。作為微服務(wù)架構(gòu)最基礎(chǔ)也是最重要的組件之一,服務(wù)注冊中心本質(zhì)上是為了解耦服務(wù)提供者和服務(wù)消費者客燕。對于任何一個微服務(wù)鸳劳,原則上都應存在或者支持多個提供者,這是由微服務(wù)的分布式屬性決定的也搓。更進一步赏廓,為了支持彈性擴縮容特性,一個微服務(wù)的提供者的數(shù)量和分布往往是動態(tài)變化的傍妒,也是無法預先確定的幔摸。因此,原本在單體應用階段常用的靜態(tài)LB機制就不再適用了颤练,需要引入額外的組件來管理微服務(wù)提供者的注冊與發(fā)現(xiàn)既忆,而這個組件就是服務(wù)注冊中心。
設(shè)計或者選型一個服務(wù)注冊中心,首先要考慮的就是服務(wù)注冊與發(fā)現(xiàn)機制尿贫〉缦保縱觀當下各種主流的服務(wù)注冊中心解決方案,大致可歸為三類:
- 應用內(nèi):直接集成到應用中庆亡,依賴于應用自身完成服務(wù)的注冊與發(fā)現(xiàn)匾乓,最典型的是Netflix提供的Eureka
- 應用外:把應用當成黑盒,通過應用外的某種機制將服務(wù)注冊到注冊中心又谋,最小化對應用的侵入性拼缝,比如Airbnb的SmartStack,HashiCorp的Consul
- DNS:將服務(wù)注冊為DNS的SRV記錄彰亥,嚴格來說咧七,是一種特殊的應用外注冊方式,SkyDNS是其中的代表
注1:對于第一類注冊方式任斋,除了Eureka這種一站式解決方案继阻,還可以基于ZooKeeper或者Etcd自行實現(xiàn)一套服務(wù)注冊機制,這在大公司比較常見废酷,但對于小公司而言顯然性價比太低瘟檩。
注2:由于DNS固有的緩存缺陷,本文不對第三類注冊方式作深入探討澈蟆。
除了基本的服務(wù)注冊與發(fā)現(xiàn)機制墨辛,從開發(fā)和運維角度,至少還要考慮如下五個方面:
- 測活:服務(wù)注冊之后趴俘,如何對服務(wù)進行測活以保證服務(wù)的可用性睹簇?
- 負載均衡:當存在多個服務(wù)提供者時,如何均衡各個提供者的負載寥闪?
- 集成:在服務(wù)提供端或者調(diào)用端太惠,如何集成注冊中心?
- 運行時依賴:引入注冊中心之后疲憋,對應用的運行時環(huán)境有何影響垛叨?
- 可用性:如何保證注冊中心本身的可用性,特別是消除單點故障柜某?
以下就圍繞上述幾個方面嗽元,簡單分析一下Eureka,SmartStack喂击,Consul的利弊剂癌。
Eureka
從設(shè)計角度來看,Eureka可以說是無懈可擊翰绊,注冊中心佩谷、提供者旁壮、調(diào)用者邊界清晰,通過去中心化的集群支持保證了注冊中心的整體可用性谐檀,但缺點是Eureka屬于應用內(nèi)的注冊方式抡谐,對應用的侵入性太強,且只支持Java應用桐猬。
SmartStack
SmartStack可以說是三種方案中最復雜的麦撵,涉及了ZooKeeper、HAProxy溃肪、Nerve和Synapse四種異構(gòu)組件免胃,對運維提出了很高的要求。它最大的好處是對應用零侵入惫撰,且適用于任意類型的應用羔沙。
Consul
Consul本質(zhì)上屬于應用外的注冊方式,但可以通過SDK簡化注冊流程厨钻。而服務(wù)發(fā)現(xiàn)恰好相反扼雏,默認依賴于SDK,但可以通過Consul Template(下文會提到)去除SDK依賴夯膀。
最終方案
最終我們選擇了Consul作為服務(wù)注冊中心的實現(xiàn)方案诗充,主要原因有兩點:
- 最小化對已有應用的侵入性,這也是貫穿我們整個微服務(wù)化改造的原則之一
- 降低運維的復雜度棍郎,Consul Agent既可以運行在服務(wù)器模式,又可以運行在客戶端模式
Consul Template
上文提到使用Consul银室,默認服務(wù)調(diào)用者需要依賴Consul SDK來發(fā)現(xiàn)服務(wù)涂佃,這就無法保證對應用的零侵入性。所幸通過Consul Template蜈敢,可以定時從Consul集群獲取最新的服務(wù)提供者列表并刷新LB配置(比如nginx的upstream)辜荠,這樣對于服務(wù)調(diào)用者而言,只需要配置一個統(tǒng)一的服務(wù)調(diào)用地址即可抓狭。改造后的調(diào)用關(guān)系如下:
Spring Cloud Consul
由于我們選用了Spring Boot作為統(tǒng)一的微服務(wù)實現(xiàn)框架伯病,很自然的,可以利用Spring Cloud提供的Consul組件進一步簡化服務(wù)注冊流程否过,省去額外的服務(wù)提供端的Consul配置午笛。