在 2021-10-17 dubbogo 基礎(chǔ)使用 中,介紹了如何用 go 寫一個(gè)部署到 zookeeper 的 dubbo 服務(wù),這次編寫一個(gè) go 語言的 dubbo 調(diào)用端。并且支持同時(shí)連接到多個(gè) zookeeper ,根據(jù)需要調(diào)用不同 zk 上的同一個(gè)服務(wù)
創(chuàng)新互聯(lián)制作網(wǎng)站網(wǎng)頁找三站合一網(wǎng)站制作公司,專注于網(wǎng)頁設(shè)計(jì),成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、外貿(mào)營(yíng)銷網(wǎng)站建設(shè),網(wǎng)站設(shè)計(jì),企業(yè)網(wǎng)站搭建,網(wǎng)站開發(fā),建網(wǎng)站業(yè)務(wù),680元做網(wǎng)站,已為1000多家服務(wù),創(chuàng)新互聯(lián)網(wǎng)站建設(shè)將一如既往的為我們的客戶提供最優(yōu)質(zhì)的網(wǎng)站建設(shè)、網(wǎng)絡(luò)營(yíng)銷推廣服務(wù)!
這里我們部署兩個(gè) zookeeper ,端口號(hào)分別是 2181 和 2182
這里我們配置了兩個(gè) UserService 的引用,并且設(shè)置了不同的別名。指定了每個(gè)引用連接各自的 zk .
注意,這里 service.UserService 為服務(wù)提供方的接口,我們直接繼承他
服務(wù)1 的日志如下:
服務(wù)2 的日志如下:
github-dubbogodemo
一、服務(wù)注冊(cè)中心的由來
假如沒有服務(wù)注冊(cè)中心,我們會(huì)干些什么事情呢?
在傳統(tǒng)行業(yè)的項(xiàng)目架構(gòu)中以下的方案最為常見了:
這種架構(gòu)開發(fā)、部署都是最簡(jiǎn)單的,一般適用于中小企業(yè)訪問量并不是太多的情況下,各個(gè)系統(tǒng)服務(wù)一臺(tái)機(jī)器就搞定了。系統(tǒng)之間的調(diào)用也是拿到對(duì)方的IP+PORT直接連接。
接下來可能因?yàn)閼?yīng)用B開始訪問量大了,單臺(tái)機(jī)器已經(jīng)不能滿足我們的需求,于是一些反向代理工具應(yīng)運(yùn)而出,其中比較常見的有Apache、Nigix,架構(gòu)演變?yōu)椋?/p>
相比之前的應(yīng)用B的單臺(tái)機(jī)器訪問,這種nginx代理的方式減輕了服務(wù)器的壓力,但是可能會(huì)出現(xiàn)Nginx掛了,那么整個(gè)服務(wù)也不可用,于是又來了這么一套架構(gòu):
這樣看方案算是完美了吧。然后事情并不是想象的那么一帆風(fēng)順,這還只是應(yīng)用A調(diào)用一個(gè)應(yīng)用B,如果應(yīng)用A調(diào)用的可能是應(yīng)用B、C、D、E...,這種完全就不知道他后面到底還想干嘛,這種架構(gòu)看似可以,但是絕對(duì)會(huì)累死運(yùn)維的(nginx的配置將會(huì)非?;靵y,直接導(dǎo)致運(yùn)維不干了)。
服務(wù)注冊(cè)中心干些什么事情呢?
上面提到的那種靠人力(主要是運(yùn)維干的事情)比較繁瑣,還不好維護(hù),有這么幾點(diǎn)不方便:應(yīng)用服務(wù)的地址變了、雙十一搞活動(dòng)服務(wù)器新增等等。那么我們可以有這么的一種架構(gòu):
服務(wù)注冊(cè)中心主要是維護(hù)各個(gè)應(yīng)用服務(wù)的ip+port列表,并保持與各應(yīng)用服務(wù)的通訊,在一定時(shí)間間隔內(nèi)進(jìn)行心跳檢測(cè),如果心跳不能到達(dá)則對(duì)服務(wù)IP列表進(jìn)行剔除,并同時(shí)通知給其它應(yīng)用服務(wù)進(jìn)行更新。同樣要是有新增的服務(wù)進(jìn)來,應(yīng)用服務(wù)會(huì)向注冊(cè)中心進(jìn)行注冊(cè),服務(wù)注冊(cè)中心將通知給其它應(yīng)用進(jìn)行更新。每個(gè)應(yīng)用都有需要調(diào)用對(duì)應(yīng)應(yīng)用服務(wù)的地址列表,這樣在進(jìn)行調(diào)用時(shí)只要處理客戶負(fù)載雜均衡即可。
二、微服務(wù)注冊(cè)中心
1.Zookeeper
ZooKeeper是一個(gè)分布式的,開放源碼的分布式應(yīng)用程序協(xié)調(diào)服務(wù),是Google的Chubby一個(gè)開源的實(shí)現(xiàn),是Hadoop和Hbase的重要組件。它是一個(gè)為分布式應(yīng)用提供一致性服務(wù)的軟件,提供的功能包括:配置維護(hù)、域名服務(wù)、分布式同步、組服務(wù)等。
上面的話直接摘抄百度百科的內(nèi)容,國(guó)內(nèi)很多公司做分布式開發(fā)最初的選型大部分都是采用dubbo框架。dubbo框架注冊(cè)中心主要使用zookeeper。zookeeper服務(wù)端與客戶端的底層通訊為netty。zookeeper采用CAP理論中的CP,一般集群部署最少需要3臺(tái)機(jī)器。
2.Euraka
先來看一下euraka的架構(gòu)圖:
Register:服務(wù)注冊(cè)
當(dāng)Eureka客戶端向Eureka Server注冊(cè)時(shí),它提供自身的元數(shù)據(jù),比如IP地址、端口,運(yùn)行狀況指示符URL,主頁等。
Renew:服務(wù)續(xù)約
Eureka客戶會(huì)每隔30秒發(fā)送一次心跳來續(xù)約。 通過續(xù)約來告知Eureka Server該Eureka客戶仍然存在,沒有出現(xiàn)問題。 正常情況下,如果Eureka Server在90秒沒有收到Eureka客戶的續(xù)約,它會(huì)將實(shí)例從其注冊(cè)表中刪除。 建議不要更改續(xù)約間隔。
Fetch Registries:獲取注冊(cè)列表信息
Eureka客戶端從服務(wù)器獲取注冊(cè)表信息,并將其緩存在本地??蛻舳藭?huì)使用該信息查找其他服務(wù),從而進(jìn)行遠(yuǎn)程調(diào)用。該注冊(cè)列表信息定期(每30秒鐘)更新一次。每次返回注冊(cè)列表信息可能與Eureka客戶端的緩存信息不同, Eureka客戶端自動(dòng)處理。如果由于某種原因?qū)е伦?cè)列表信息不能及時(shí)匹配,Eureka客戶端則會(huì)重新獲取整個(gè)注冊(cè)表信息。 Eureka服務(wù)器緩存注冊(cè)列表信息,整個(gè)注冊(cè)表以及每個(gè)應(yīng)用程序的信息進(jìn)行了壓縮,壓縮內(nèi)容和沒有壓縮的內(nèi)容完全相同。Eureka客戶端和Eureka 服務(wù)器可以使用JSON / XML格式進(jìn)行通訊。在默認(rèn)的情況下Eureka客戶端使用壓縮JSON格式來獲取注冊(cè)列表的信息。
Cancel:服務(wù)下線
Eureka客戶端在程序關(guān)閉時(shí)向Eureka服務(wù)器發(fā)送取消請(qǐng)求。 發(fā)送請(qǐng)求后,該客戶端實(shí)例信息將從服務(wù)器的實(shí)例注冊(cè)表中刪除。該下線請(qǐng)求不會(huì)自動(dòng)完成,它需要調(diào)用以下內(nèi)容:
DiscoveryManager.getInstance().shutdownComponent();
Eviction 服務(wù)剔除
在默認(rèn)的情況下,當(dāng)Eureka客戶端連續(xù)90秒沒有向Eureka服務(wù)器發(fā)送服務(wù)續(xù)約,即心跳,Eureka服務(wù)器會(huì)將該服務(wù)實(shí)例從服務(wù)注冊(cè)列表刪除,即服務(wù)剔除。
自我保護(hù)機(jī)制:
既然Eureka Server會(huì)定時(shí)剔除超時(shí)沒有續(xù)約的服務(wù),那就有可能出現(xiàn)一種場(chǎng)景,網(wǎng)絡(luò)一段時(shí)間內(nèi)發(fā)生了 異常,所有的服務(wù)都沒能夠進(jìn)行續(xù)約,Eureka Server就把所有的服務(wù)都剔除了,這樣顯然不太合理。所以,就有了 自我保護(hù)機(jī)制,當(dāng)短時(shí)間內(nèi),統(tǒng)計(jì)續(xù)約失敗的比例,如果達(dá)到一定閾值,則會(huì)觸發(fā)自我保護(hù)的機(jī)制,在該機(jī)制下, Eureka Server不會(huì)剔除任何的微服務(wù),等到正常后,再退出自我保護(hù)機(jī)制。自我保護(hù)開關(guān)(eureka.server.enableself-preservation: false)
3.Consul
consul推薦的架構(gòu)圖:
Consul不像Euraka的部署那么簡(jiǎn)單,他是go語言開發(fā)的,需要運(yùn)維單獨(dú)部署,有提供java的客戶端連接,采用的是CAP的CP。
4.Nacos
Euraka是Spring Cloud Netflix早期版本中推薦使用的,后來euraka1.0版本不再維護(hù),euraka2.0已經(jīng)閉源,導(dǎo)致很多新項(xiàng)目基于Spring Cloud Netflix 開發(fā)的選型變遷為Consul.
Nacos是阿里開源的服務(wù)注冊(cè)中心,它可以與spring cloud aliaba集成使用。
Nacos的官方介紹:
Nacos 致力于幫助您發(fā)現(xiàn)、配置和管理微服務(wù)。Nacos 提供了一組簡(jiǎn)單易用的特性集,幫助您實(shí)現(xiàn)動(dòng)態(tài)服務(wù)發(fā)現(xiàn)、服務(wù)配置管理、服務(wù)及流量管理。
Nacos 幫助您更敏捷和容易地構(gòu)建、交付和管理微服務(wù)平臺(tái)。 Nacos 是構(gòu)建以“服務(wù)”為中心的現(xiàn)代應(yīng)用架構(gòu)(例如微服務(wù)范式、云原生范式)的服務(wù)基礎(chǔ)設(shè)施。
Nacos 地圖
Nacos 生態(tài)圖
如 Nacos 全景圖所示,Nacos 無縫支持一些主流的開源生態(tài),例如
Spring Cloud
Apache Dubbo and Dubbo Mesh TODO
Kubernetes and CNCF TODO
三、服務(wù)注冊(cè)與發(fā)現(xiàn)技術(shù)選型
以下是來自網(wǎng)上的一個(gè)分享:
除了上述的幾種以外,筆者更推薦使用Nacos作為服務(wù)注冊(cè)中心。
推薦理由:
Nacos服務(wù)注冊(cè)表結(jié)構(gòu)Mapnamespace, Mapgroup::serviceName, Service采用多層次Map結(jié)構(gòu),控制的顆粒度更細(xì),支持金絲雀模式發(fā)布,心跳同步機(jī)制也更快速,服務(wù)更新更及時(shí)。
近幾年誕生了很多微服務(wù)框架,比如JAVA的Spring Cloud、Dubbo;Golang的GoKit和GoMicro以及NodeJs的Seneca。幾乎每種主流語言都有其對(duì)應(yīng)的微服務(wù)框架。
Go在微服務(wù)框架中有其獨(dú)特的優(yōu)勢(shì),至于優(yōu)勢(shì)在哪,自行g(shù)oogle。
1、GoKit框架
這是一個(gè)工具包的集合,可以幫助攻城獅構(gòu)建強(qiáng)大、可靠和可維護(hù)的微服務(wù)。提供了用于實(shí)現(xiàn)系統(tǒng)監(jiān)控和彈性模式組件的庫(kù),例如日志、跟蹤、限流、熔斷等。
基于這個(gè)框架的應(yīng)用程序架構(gòu)由三個(gè)主要的部分組成:
傳輸層:用于網(wǎng)絡(luò)通信,服務(wù)通常使用HTTP或者gRPC等網(wǎng)絡(luò)傳輸協(xié)議,或者使用NATS等發(fā)布訂閱系統(tǒng)相互通信。
接口層:是服務(wù)器和客戶端的基本構(gòu)建塊。每個(gè)對(duì)外提供的接口方法都會(huì)定義為一個(gè)Endpoint,一遍在服務(wù)器和客戶端之間進(jìn)行網(wǎng)絡(luò)通信,每個(gè)端點(diǎn)使用傳輸層通過HTTP或gRPC等具體通信模式對(duì)外提供服務(wù)
服務(wù)成:具體的業(yè)務(wù)邏輯實(shí)現(xiàn)
2、GoMicro框架
這是一個(gè)基于Go語言實(shí)現(xiàn)的插件化RPC微服務(wù)框架。提供了服務(wù)發(fā)現(xiàn)、負(fù)載均衡、同步傳輸、異步通信以及事件驅(qū)動(dòng)等機(jī)制,嘗試簡(jiǎn)化分布式系統(tǒng)之間的通信,讓開發(fā)者更專注于自身業(yè)務(wù)邏輯的開發(fā)。
GoMicro的設(shè)計(jì)哲學(xué)是可插拔的架構(gòu)理念,提供了可快速構(gòu)建系統(tǒng)的組件,并且可以根據(jù)自身的需求對(duì)GoMicro提供的默認(rèn)實(shí)現(xiàn)進(jìn)行定制。所有插件都可在倉(cāng)庫(kù)github.com/micro/go-plugins 中找到。
互聯(lián)網(wǎng)架構(gòu)下,大部分系統(tǒng)已經(jīng)轉(zhuǎn)型分布式。其中服務(wù)注冊(cè)發(fā)現(xiàn)中心,分布式服務(wù)中非常重要的組成部分。按需選擇合適的注冊(cè)中心,也變的尤為重要。
Eureka是SpringCloud全家桶中非常重要的一個(gè)組件,主要是實(shí)現(xiàn)服務(wù)的注冊(cè)和發(fā)現(xiàn)。Eureka做到了CAP理論中的AP,強(qiáng)調(diào)服務(wù)的高可用性。實(shí)現(xiàn)中分Eureka Server和Eureka Client兩部分。
Eureka客戶端會(huì)向Eureka注冊(cè)中心注冊(cè)為服務(wù),并通過心跳來更新它的服務(wù)租約。同時(shí)也可以從服務(wù)端查詢當(dāng)前注冊(cè)的服務(wù)信息并把他們緩存到本地并周期性的刷新服務(wù)狀態(tài)。若服務(wù)集群出現(xiàn)分區(qū)故障時(shí),Eureka會(huì)轉(zhuǎn)入自動(dòng)保護(hù)模式,允許分區(qū)故障的節(jié)點(diǎn)繼續(xù)提供服務(wù);若分區(qū)故障恢復(fù),集群中其他分區(qū)會(huì)把他們的狀態(tài)再次同步回來。
SpringCloud對(duì)其做了非常好的集成封裝,是官方推薦的注冊(cè)中心。
Zookeeper是大數(shù)據(jù)Hadoop中的一個(gè)分布式調(diào)度組件,強(qiáng)調(diào)數(shù)據(jù)一致性和擴(kuò)展性,可用于服務(wù)的注冊(cè)和發(fā)現(xiàn)。她是dubbo中默認(rèn)的服務(wù)注冊(cè)中心,也是目前使用最廣泛的分布式服務(wù)發(fā)現(xiàn)組件。注重CAP理論中的CP。
Consul是一個(gè)高可用的分布式服務(wù)注冊(cè)中心,由HashiCorp公司推出,Golang實(shí)現(xiàn)的開源共享的服務(wù)工具。Consul在分布式服務(wù)注冊(cè)與發(fā)現(xiàn)方面有自己的特色,解決方案更加“一站式”,不再需要依賴其他工具。
1、通過HTTP接口和DNS協(xié)議調(diào)用API存儲(chǔ)鍵值對(duì),使服務(wù)注冊(cè)和服務(wù)發(fā)現(xiàn)更容易;
2、支持 健康 檢查,可以快速的告警在集群中的操作
3、支持key/value存儲(chǔ)動(dòng)態(tài)配置
4、支持任意數(shù)量的區(qū)域
ETCD是一個(gè)高可用的分布式鍵值數(shù)據(jù)庫(kù),可用于共享配置、服務(wù)的注冊(cè)和發(fā)現(xiàn)。ETCD采用Raft一致性算法,基于Go語言實(shí)現(xiàn)。ETCD作為后起之秀,又非常大的優(yōu)勢(shì)。
1、基于HTTP+JSON的API,使用簡(jiǎn)單;
2、可選SSL客戶認(rèn)證機(jī)制,更安全;
3、單個(gè)實(shí)例支持每秒千次寫操作,快速。
4、采用Raft一致性算法保證分布式。
網(wǎng)站標(biāo)題:dubbogo語言 dubbo怎么寫
文章分享:http://chinadenli.net/article2/hpsgoc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、Google、ChatGPT、營(yíng)銷型網(wǎng)站建設(shè)、虛擬主機(jī)、網(wǎng)站改版
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)