微服務(wù)注冊最全詳解(圖文全面總結(jié))
微服務(wù)注冊是微服務(wù)的核心組件,常見的有:ZooKeeper,Consul,Nacos,Eureka...等等,下面我就重點來詳解微服務(wù)注冊@mikechen
微服務(wù)注冊
服務(wù)注冊指的是將自身服務(wù)信息注冊到注冊中心,服務(wù)信息包括:服務(wù)所在主機IP、服務(wù)的端口號Port、暴露服務(wù)協(xié)議等信息。
如下圖所示:
圖片
Service B 把自己注冊到注冊中心,這就叫 服務(wù)注冊。
服務(wù)注冊作用
服務(wù)注冊就是維護一個登記簿,它管理系統(tǒng)內(nèi)所有的服務(wù)地址。
當(dāng)新的服務(wù)啟動后,它會向登記簿交待自己的地址信息,服務(wù)的依賴方直接向登記簿要服務(wù)地址就行了。
同時服務(wù)注冊還要負責(zé)一件事情,服務(wù)狀態(tài)的維護,假如一個服務(wù)突然down掉,它應(yīng)該能夠感知,并把down掉的服務(wù)摘掉,然后主動或被動的把這個信息告知服務(wù)消費方。
服務(wù)注冊實現(xiàn)
服務(wù)注冊有兩種形式:客戶端注冊和代理注冊。
1.客戶端注冊
客戶端注冊是服務(wù)自己要負責(zé)注冊與注銷的工作,當(dāng)服務(wù)啟動后注冊線程向注冊中心注冊,當(dāng)服務(wù)下線時注銷自己。
圖片
這種方式的缺點是注冊注銷邏輯與服務(wù)的業(yè)務(wù)邏輯耦合在一起,如果服務(wù)使用不同語言開發(fā),那需要適配多套服務(wù)注冊邏輯。
2.代理注冊(第三方注冊)
代理注冊也叫第三方注冊,指的是一個單獨的代理服務(wù)負責(zé)注冊與注銷。
當(dāng)服務(wù)提供者啟動后以某種方式通知代理服務(wù),然后代理服務(wù)負責(zé)向注冊中心發(fā)起注冊工作。
圖片
第三方注冊的優(yōu)點非常明顯,就是服務(wù)跟服務(wù)注冊表是分離的,不需要為每種編程語言和架構(gòu)完成服務(wù)注冊邏輯,替代的,服務(wù)實例是通過一個集中化管理的服務(wù)進行管理的。
這種方式的缺點是多引用了一個代理服務(wù),并且代理服務(wù)需要配置管理一個高可用的系統(tǒng)。
微服務(wù)注冊框架
當(dāng)下用于服務(wù)注冊的工具非常多ZooKeeper,Consul,Etcd, 還有Netflix家的Eureka等等。
1.ZooKeeper
這里服務(wù)注冊的實現(xiàn)會運用Zookeeper的watch機制來實現(xiàn)。
比如:客戶端注冊監(jiān)聽他關(guān)心的目錄節(jié)點,當(dāng)目錄節(jié)點發(fā)生變化(數(shù)據(jù)改變、被刪除、子目錄節(jié)點增加刪除)時,Zookeeper會通知客戶端。
client端會對某個znode建立一個watcher事件,當(dāng)該znode發(fā)生變化時,zk會主動通知watch這個znode的client,然后client根據(jù)znode的變化來做出業(yè)務(wù)上的改變等。
如下圖所示:
圖片
2.Consul
Consul 是 HashiCorp 公司推出的開源工具,用于實現(xiàn)分布式系統(tǒng)的服務(wù)發(fā)現(xiàn)與配置。
Consul架構(gòu),如下圖所示:
圖片
圖片上 datacenter 分成上下兩個部分, 但是這兩個部分又不是完全隔離的,他們之間通過 WAN GOSSIP 進行報文交互。
3.Etcd
Etcd是使用Go語言開發(fā)的一個開源的、高可用的分布式key-value存儲系統(tǒng),可以用于配置共享和服務(wù)的注冊和發(fā)現(xiàn)。
Etcd架構(gòu)如下圖所示:
圖片
從 架構(gòu)圖中我們可以看到etcd 主要分為四個部分:
- HTTP Server
用于處理用戶發(fā)送的 API 請求,以及其它 Etcd節(jié)點的同步與心跳信息請求。
- Store
用于處理 Etcd支持的各類功能的事務(wù),包括數(shù)據(jù)索引、節(jié)點狀態(tài)變更、監(jiān)控與反饋、事件處理與執(zhí)行等等。
- Raft
Raft 是強一致性算法的具體實現(xiàn),是 Etcd的核心。
- WAL
Write Ahead Log,預(yù)寫日志系統(tǒng),是 Etcd的數(shù)據(jù)存儲方式,Etcd就通過 WAL 進行持久化存儲,這個與MySQL持久化存儲機制類似。
Write-Ahead Logging 是數(shù)據(jù)庫中一種高效的日志算法,對于非內(nèi)存數(shù)據(jù)庫而言,磁盤I/O操作是數(shù)據(jù)庫效率的一大瓶頸。
在相同的數(shù)據(jù)量下,采用WAL日志的數(shù)據(jù)庫系統(tǒng)在事務(wù)提交時,磁盤寫操作只有傳統(tǒng)的回滾日志的一半左右,大大提高了數(shù)據(jù)庫磁盤I/O操作的效率,從而提高了數(shù)據(jù)庫的性能。
4.Eureka
Eureka 作為 Spring Cloud 微服務(wù)框架的注冊中心,與之對應(yīng)的是 Dubbo 框架的ZooKeeper。
Eureka基本架構(gòu),如下圖所示:
上圖簡要描述了Eureka的基本架構(gòu),由3個角色組成:
1.Service Provider: 暴露服務(wù)的服務(wù)提供方。
2)Service Consumer:調(diào)用遠程服務(wù)的服務(wù)消費方。
3)EureKa Server: 服務(wù)注冊中心和服務(wù)發(fā)現(xiàn)中心。
不論使用那種工具,服務(wù)注冊一定是要確保高可用的,否則重則的是所有的服務(wù)都沒法調(diào)用,輕則新的服務(wù)不能上線,所以一般都會考慮本地有緩存服務(wù)地址等方案。