摘要:?阿里巴巴微服務(wù)開源項(xiàng)目Nacos于近期發(fā)布v0.5.0版本,該版本主要包括了DNS-basedService Discovery,對(duì)Java 11的支持,持續(xù)優(yōu)化Nacos產(chǎn)品用戶體驗(yàn),更深度的與Spring Cloud體系的網(wǎng)關(guān)集成等方面做了演進(jìn)。
阿里巴巴微服務(wù)開源項(xiàng)目Nacos于近期發(fā)布v0.5.0版本,該版本主要包括了DNS-basedService Discovery,對(duì)Java 11的支持,持續(xù)優(yōu)化Nacos產(chǎn)品用戶體驗(yàn),更深度的與Spring Cloud體系的網(wǎng)關(guān)集成等方面做了演進(jìn)。
一、發(fā)布 DNS-F
為了進(jìn)一步降低微服務(wù)多語言生態(tài)、異構(gòu)系統(tǒng)、Kubernetes體系的服務(wù)注冊(cè)與發(fā)現(xiàn)的實(shí)現(xiàn)成本,Nacosv0.5.0 發(fā)布了一款DNS-F客戶端,以便支持將注冊(cè)在Nacos上的服務(wù)以域名的方式暴露端點(diǎn),讓三方應(yīng)用方便的查閱及發(fā)現(xiàn)。
不同于Nacos的Client SDK服務(wù)發(fā)現(xiàn)模式,DNS-F 提供獨(dú)立于應(yīng)用進(jìn)程的Agent, 通過攔截應(yīng)用的域名解析請(qǐng)求,讓Nacos對(duì)應(yīng)用提供域名數(shù)據(jù)動(dòng)態(tài)推送更新、健康檢查、異常節(jié)點(diǎn)下線、以及統(tǒng)一的域名管理視圖等服務(wù)。
Nacos提供基于DNS 協(xié)議的服務(wù)發(fā)現(xiàn)能力,旨在幫助用戶解決三個(gè)方面的問題:
Kubernetes體系的服務(wù)發(fā)現(xiàn)
毫無疑問,Kubernetes體系的服務(wù)發(fā)現(xiàn)方案一直都是基于DNS的,Nacos DNS-F目前開源提供的版本,是在CoreDNS的基礎(chǔ)上提供了Nacos的plugin nacos-coredns-plugin,這樣打通了CoreDNS與Nacos服務(wù),這種實(shí)現(xiàn)方式為未來進(jìn)一步打通Kubernetes集群內(nèi)部的服務(wù)發(fā)現(xiàn)與應(yīng)用服務(wù)發(fā)現(xiàn)(如SpringCloud)提供了通路,為Nacos在未來幫助應(yīng)用以統(tǒng)一的視圖管理Kubernetes內(nèi)部和應(yīng)用自身的服務(wù)及域名提供了基礎(chǔ),從而幫助用戶簡(jiǎn)化基于kubernetes體系的微服務(wù)平臺(tái)的構(gòu)建與管理。
服務(wù)發(fā)現(xiàn)迄今仍然沒有標(biāo)準(zhǔn)協(xié)議
到目前為止,市面上的服務(wù)發(fā)現(xiàn)的解決方案有很多,僅在JavaSpring生態(tài)中,就有Zookeeper,Consul,Eureka,Nacos等解決方案,更不用說在其它的語言和框架中,Nacos通過提供DNS-F,可以讓用戶更容易地實(shí)現(xiàn)以DNS協(xié)議為基礎(chǔ)的服務(wù)發(fā)現(xiàn)(DNS-SD),而DNS協(xié)議是一個(gè)成熟的標(biāo)準(zhǔn)協(xié)議,可以有效的幫助用戶消除耦合到廠商私有服務(wù)發(fā)現(xiàn)API上的風(fēng)險(xiǎn)。
異構(gòu)及多語言系統(tǒng)的服務(wù)發(fā)現(xiàn)
在一個(gè)中大型企業(yè)中,傳統(tǒng)企業(yè)架構(gòu)要升級(jí)為云原生微服務(wù)架構(gòu),遺留系統(tǒng)和異構(gòu)系統(tǒng)的服務(wù)注冊(cè)與發(fā)現(xiàn)無疑是必須首要解決的問題。另外采用微服務(wù)架構(gòu)的一大承諾收益點(diǎn)也在于每個(gè)微服務(wù)本身可以獨(dú)立選擇語言棧,但是到目前為止沒有個(gè)一個(gè)服務(wù)發(fā)現(xiàn)產(chǎn)品能提供各種語言客戶端的100%的完全覆蓋。
以Zookeeper為例子,Zookeeper質(zhì)量比較好的客戶端僅有Java和C的客戶端,那么非這兩個(gè)語言體系的服務(wù)和系統(tǒng)就很難通過Zookeeper來注冊(cè)與發(fā)現(xiàn),而DNS天然是各種語言都支持的,使用DNS做服務(wù)發(fā)現(xiàn)對(duì)應(yīng)用的侵入非常的小,非常適合應(yīng)用往新微服務(wù)平臺(tái)上的遷移。
以阿里巴巴為例,基于DNS-F模式的服務(wù)發(fā)現(xiàn)已經(jīng)是阿里巴巴生產(chǎn)環(huán)境中的最重要方式之一,其對(duì)發(fā)現(xiàn)和打通像阿里媽媽、高德、優(yōu)酷和搜索等這樣的非Java語言體系的業(yè)務(wù)系統(tǒng)提供的服務(wù),起到了舉足輕重的作用。距離阿里巴巴內(nèi)部發(fā)布的第一個(gè)Python版本的DNS-F客戶端已經(jīng)過去5個(gè)年頭,而DNS-F的整體裝機(jī)使用量對(duì)所有內(nèi)部VIPServer各語言客戶端的占比已經(jīng)超過40%,可見其應(yīng)用之廣泛,而不用綁定在私有的VIPServerAPI上也是眾多業(yè)務(wù)線愿意優(yōu)先考慮DNS-F客戶端的首要原因。
DNS協(xié)議本身是為www而生,并非為服務(wù)發(fā)現(xiàn)而生,所以在協(xié)議上,用在服務(wù)發(fā)現(xiàn)場(chǎng)景下DNS依然有不少的小瑕疵需要在未來從協(xié)議層面解決,比如DNS緩存TTL收斂的問題,比如操作系統(tǒng)以及各語言對(duì)SRV Record字段的支持問題,DNS包大小限制的問題等等,但隨著Kubernetes以及微服務(wù)體系在各行業(yè)的深入應(yīng)用,可以說DNS協(xié)議已經(jīng)有為服務(wù)發(fā)現(xiàn)場(chǎng)景做進(jìn)一步向前演進(jìn)的必要,這方面阿里巴巴&Nacos會(huì)做持續(xù)的探索和推進(jìn)。
二、支持 Java 11
9月25日,Oracle 官方宣布Java 11正式發(fā)布,這是繼 Java 8 后的首個(gè)長(zhǎng)期支持版本,Java11 在諸如ZGC,TLS 1.3,新的算法密鑰協(xié)議,Lambda 局部變量語法支持,Standardize HTTPClient API 等不少方面做了改進(jìn),值得關(guān)注。
劃重點(diǎn)~?Github上給Nacos提issue是實(shí)現(xiàn)你的需求和想法的最佳手段!
Nacos支持Java 11, 主要是指2個(gè)方面:
Nacos支持運(yùn)行在Java11上
將Nacos源碼開發(fā)及構(gòu)建環(huán)境升級(jí)到Java11
所以,現(xiàn)在狀態(tài)是都已經(jīng)支持。
三、實(shí)現(xiàn)Spring CloudGateway的動(dòng)態(tài)路由
要實(shí)現(xiàn)微服務(wù)架構(gòu),微服務(wù)網(wǎng)關(guān)必不可少,Nacos 社區(qū)目前正在努力跟 Spring Cloud 的微服務(wù)網(wǎng)關(guān)做更多的打通與集成,Spring Cloud 中文社區(qū)創(chuàng)建者,《重新定義Spring Cloud實(shí)戰(zhàn)》的作者 @許進(jìn) 與近期貢獻(xiàn)了如何基于Spring Cloud Gateway與Nacos實(shí)現(xiàn)動(dòng)態(tài)路由能力的示例,毫無疑問,Spring Cloud Gateway作為所有請(qǐng)求流量的入口,在實(shí)際生產(chǎn)環(huán)境中為了保證高可靠和高可用,盡量避免重啟,需要實(shí)現(xiàn)Spring Cloud Gateway 動(dòng)態(tài)路由配置,等到這塊足夠成熟,會(huì)將其包含在Nacos的官方推薦實(shí)現(xiàn)中。
四、TTL & Health Status Aggregation
在Nacos之前的幾個(gè)版本中,用戶往往會(huì)在使用過程中產(chǎn)生疑惑,為什么注冊(cè)的實(shí)例已經(jīng)下線(宕掉)了,但是依然可以在Nacos控制臺(tái)上看到實(shí)例的信息。這源于SpringCloud以及Dubbo等服務(wù)體系中,Eureka或者Zookeeper都有自動(dòng)注銷實(shí)例的能力,而且將自動(dòng)注銷作為注冊(cè)中心的默認(rèn)行為。但其實(shí)當(dāng)服務(wù)的實(shí)例下線(宕掉)之后,注冊(cè)中心有兩種可能的行為,一個(gè)是將這個(gè)實(shí)例從服務(wù)下的實(shí)例列表中剔除出去,一個(gè)是保留該實(shí)例,只將實(shí)例狀態(tài)置為不健康。Eureka和Zookeeper等注冊(cè)中心,其實(shí)也支持持久化的實(shí)例注冊(cè),而Nacos只是將這種持久化的注冊(cè)設(shè)成了默認(rèn)的行為。
Nacos的服務(wù)發(fā)現(xiàn)模塊,是基于內(nèi)部的VIPServer演化而來。在VIPServer的主要場(chǎng)景中,服務(wù)是以域名的方式通過控制臺(tái)注冊(cè)到VIPServer的,并且VIPServer非常注重服務(wù)級(jí)別的元數(shù)據(jù)信息的定義帶來的靈活“軟負(fù)載”流量調(diào)度的能力,所以首要選擇的是服務(wù)及實(shí)例的元數(shù)據(jù)的持久性存儲(chǔ),弱化了服務(wù)的提供端持續(xù)向VIPServer服務(wù)端發(fā)送心跳的能力,所以前期并沒有將VIPServer 上報(bào)和匯聚實(shí)例健康狀態(tài)的功能放出來。之前版本的服務(wù)實(shí)例的健康檢查,必須由VIPServer服務(wù)端來主動(dòng)發(fā)起來完成。但是如Nacos開源之初規(guī)劃的那樣,Nacos會(huì)同時(shí)支持兩種模式。
對(duì)于復(fù)雜的云環(huán)境和網(wǎng)絡(luò)拓?fù)洵h(huán)境中(如 VPC、邊緣網(wǎng)絡(luò)等)服務(wù)的健康檢查,Nacos 提供了心跳上報(bào)模式和服務(wù)端主動(dòng)探測(cè)2種健康檢查模式。
所以隨著Nacos 0.5.0 版本的發(fā)布,我們很高興的宣布,Nacos已經(jīng)正式支持基于TTL的服務(wù)實(shí)例自動(dòng)注銷功能。這個(gè)功能一部分是響應(yīng)社區(qū)關(guān)于TTL功能的需求,更重要的一部分,這也是Nacos服務(wù)發(fā)現(xiàn)自然演進(jìn)的一個(gè)方向。
從 0.5.0 版本開始,用戶通過客戶端SDK注冊(cè)的實(shí)例,將默認(rèn)開啟TTL功能,實(shí)例會(huì)默認(rèn)每5秒向服務(wù)端發(fā)送一次心跳,如果Nacos服務(wù)端15秒內(nèi)沒有收到實(shí)例的心跳,則會(huì)將實(shí)例置為不健康,如果30秒沒有收到心跳,則會(huì)將直接將實(shí)例刪除。Nacos的TTL功能,補(bǔ)充了Nacos作為注冊(cè)中心在處理實(shí)例下線的另一種行為,通過靈活可動(dòng)態(tài)配置的參數(shù),用戶還可以根據(jù)實(shí)際的應(yīng)用場(chǎng)景任意切換使用這兩種行為中的一種。
Nacos的TTL功能雖然還處在實(shí)驗(yàn)性質(zhì),主要有以下特色:
進(jìn)一步無縫融入SpringCloud生態(tài)和Dubbo生態(tài)
Nacos在最初的規(guī)劃中,就已經(jīng)計(jì)劃能夠幫助存量用戶做無縫平滑遷移。而無縫平滑遷移除了注冊(cè)中心的功能的完整性,體驗(yàn)、性能、一些重要的認(rèn)知也能夠從老注冊(cè)中心接續(xù)過來。例如Eureka作為Spring Cloud里的主流注冊(cè)中心,其默認(rèn)行為就是會(huì)在沒有收到實(shí)例心跳90秒后,將實(shí)例自動(dòng)注銷。而 Dubbo 里用的比較多的Zookeeper,也會(huì)使用臨時(shí)節(jié)點(diǎn),依托于Session超時(shí)時(shí)間來實(shí)現(xiàn)TTL功能。這這兩種場(chǎng)景中,服務(wù)實(shí)例的注冊(cè)基本都是通過服務(wù)提供端(Provider)使用注冊(cè)中心客戶端來完成的。Nacos目前已經(jīng)提供了Spring Cloud體系的服務(wù)發(fā)現(xiàn)的完整解決方案,同時(shí)對(duì)Dubbo的適配和支持也會(huì)在最近的版本中釋放出來。
服務(wù)級(jí)別"元數(shù)據(jù)(metadata)"不會(huì)自動(dòng)注銷
Nacos支持服務(wù)、集群和實(shí)例多級(jí)別的元數(shù)據(jù)信息,與服務(wù)實(shí)例可以被自動(dòng)注銷相對(duì)的,服務(wù)本身的元數(shù)據(jù)信息不能隨著服務(wù)的下線而丟失,因?yàn)檫@些元數(shù)據(jù)通常是在創(chuàng)建服務(wù)時(shí)有人為設(shè)定上去的(例如負(fù)載均衡策略,權(quán)重規(guī)則,保護(hù)閾值等)。這意味著同一個(gè)服務(wù)的實(shí)例的上上下下,再注冊(cè)上來的時(shí)候,應(yīng)該依然保有服務(wù)原來設(shè)定的相關(guān)的元數(shù)據(jù)信息。
在Eureka或者Consul中,由于并不支持服務(wù)級(jí)別設(shè)定任何元信息,因此當(dāng)實(shí)例都臨時(shí)下線時(shí),整個(gè)服務(wù)也就查詢不到任何存在過的痕跡了。而服務(wù)級(jí)別的元信息作為Nacos的一個(gè)非常重要的特色功能,未來會(huì)基于此開放一系列流量控制類的特色功能,都決定了Nacos服務(wù)本身的元數(shù)據(jù)信息不能隨著服務(wù)的下線而丟失,另一方面,在客戶端注冊(cè)實(shí)例時(shí),不允許提交服務(wù)級(jí)別的元信息,這樣也保證了單個(gè)實(shí)例的注冊(cè)或者注銷不會(huì)影響服務(wù)級(jí)別的配置。我們提供了控制臺(tái)來對(duì)服務(wù)元數(shù)據(jù)進(jìn)行便捷的創(chuàng)建和編輯。
將HSF的注冊(cè)中心ConfigServer融入Nacos
在阿里巴巴集團(tuán)內(nèi)部,著名的HSF的注冊(cè)中心ConfigServer支持的就是長(zhǎng)連接注冊(cè)模式(renew&TTL),因此當(dāng)長(zhǎng)連接斷開時(shí),自然而然的就會(huì)將實(shí)例注銷掉。為了支持未來將HSF一些優(yōu)秀的特性遷移和輸出到Dubbo上,Nacos會(huì)逐漸將ConfigServer的核心能力融入到Nacos當(dāng)中,而TTL則也是這個(gè)事情的基礎(chǔ)。
而同時(shí),Nacos非??粗挟a(chǎn)品在云上的適用性,在公有云上,因?yàn)橛脩敉?cè)到注冊(cè)中心的IP是一個(gè)VPC的外部IP,因?yàn)楣性瓢踩呗缘南拗疲?cè)中心一般是不允許主動(dòng)發(fā)起到VPC內(nèi)的連接來做健康檢查的,只能通過客戶端上報(bào)心跳的模式來檢查健康狀態(tài),也只有在客戶端上報(bào)的模式下,才能啟用自動(dòng)注銷功能。Nacos此次的TTL功能,很好的銜接了公有云和內(nèi)部ConfigServer輸出的需求,為后續(xù)的融合做好了初步的準(zhǔn)備。
五、支持 Spring Cloud Alibaba 生態(tài)
就像 SpringOne Platform大會(huì)上Spring開發(fā)者 @Roy Clarkson 和 @Ollie Hughes 在《Cloud-Native Javawith Spring Cloud Services》里闡述的那樣,采用微服務(wù)設(shè)計(jì)模式,首要的就是選擇“ExternalConfiguration” “Service Registry” “Circuite Breaker”的實(shí)現(xiàn),而 Spring Cloud forAlibaba 這個(gè)項(xiàng)目則旨在通過輸出阿里巴巴在服務(wù)化以及云上的分布式微服務(wù)經(jīng)驗(yàn)打包在一個(gè)stack里,給你提供支撐大規(guī)模微服務(wù)的一站式解決方案,正如項(xiàng)目所述:
“The Spring Cloud Alibaba project, consisting of Alibaba’s open-source componentsand several Alibaba Cloud products, aims to implement and expose well knownSpring Framework patterns and abstractions to bring the benefits of Spring Bootand Spring Cloud to Java developers using Alibaba products.”
隨著 Spring Cloud for Alibaba 0.2.0 的發(fā)布,Nacos Config, NacosService Discovery 和 Sentinel Circuite Breaker 都已一網(wǎng)而聚之。
六、持續(xù)優(yōu)化用戶體驗(yàn)
提升產(chǎn)品易用性永遠(yuǎn)是Nacos團(tuán)隊(duì)的核心關(guān)注點(diǎn),在Nacos 0.5.0 版本就社區(qū)反饋的一些局部體驗(yàn)問題做了積極的修復(fù),這包括前端UI的優(yōu)化,啟動(dòng)狀態(tài)展示的優(yōu)化、性能調(diào)優(yōu)等,例如:
177 Consolesupports registering new empty service and delete empty service.
222 printmore nacos server start status info in start.log.
251 ConsoleEditor Optimization.
254 DataIdand group are required in historical version and listener query.
258 Removethe Balloon of DataId/Group.
更多優(yōu)化和release信息見 Nacos Github
正在蓬勃發(fā)展的 Nacos 社區(qū)
DISSis cheap, show me your hand?
比吐槽更重要的是搭把手,參與社區(qū)一起發(fā)展Nacos
評(píng)論
查看更多