从 2018 年 Nacos 开源说起
2018 年夏天
國內(nèi)?#微服務(wù)開源?領(lǐng)域,迎來了一位新成員。此后,在構(gòu)建微服務(wù)注冊中心和配置中心的過程中,國內(nèi)開發(fā)者多了一個(gè)可信賴的選項(xiàng)。
Nacos 是阿里巴巴開源的一個(gè)更易于構(gòu)建云原生應(yīng)用的動態(tài)服務(wù)發(fā)現(xiàn)、配置管理和服務(wù)管理平臺(官方網(wǎng)站:https://nacos.io/),它凝聚了阿里巴巴十多年來在超大規(guī)模注冊和配置上的最佳實(shí)踐,可以用在微服務(wù)場景作為服務(wù)注冊中心、配置中心等核心場景中,和阿里的其他微服務(wù)開源項(xiàng)目一樣,Nacos 也是始于阿里,成長于社區(qū)的典型。
為什么要開源 Nacos ?
在大規(guī)模服務(wù)發(fā)現(xiàn)和服務(wù)治理領(lǐng)域,現(xiàn)有的開源解決方案并非已經(jīng)非常完美,阿里巴巴從 IOE 集中式應(yīng)用架構(gòu)升級為互聯(lián)網(wǎng)分布式服務(wù)化架構(gòu)的演進(jìn)過程中,積累了大量有關(guān)服務(wù)注冊和服務(wù)配置的實(shí)踐經(jīng)驗(yàn),而這些經(jīng)驗(yàn)是可以在各個(gè)行業(yè)大規(guī)模復(fù)用。除此之外,更重要的是,希望和社區(qū)開發(fā)者共同發(fā)展,讓 Nacos 可以幫助國內(nèi)企業(yè)更自由的構(gòu)建基于云原生應(yīng)用的動態(tài)服務(wù)發(fā)現(xiàn)、配置和服務(wù)管理。?
相比其他服務(wù)注冊和配置中心開源方案,Nacos 的起步雖然晚了點(diǎn),但除了注冊和配置中心的功能外,他還提供了動態(tài)服務(wù)發(fā)現(xiàn)、服務(wù)共享與管理的功能,在大規(guī)模場景下具備更優(yōu)秀的性能,在易用性上更便捷,分布式部署上更靈活。例如和 Consul / Eureka / Zookeeper 相比:(內(nèi)容摘自《主流微服務(wù)注冊中心淺析和對比》[1])
除此之外,Nacos 支持多種啟動模式,用戶可以根據(jù)業(yè)務(wù)場景自由選擇,將各個(gè)功能模塊,如注冊中心和配置中心,分開部署或者合并部署,從而能夠完整支持小型創(chuàng)業(yè)公司成長到大型企業(yè),微服務(wù)全生命周期的演進(jìn)。
在 “Who is using Nacos” 的社區(qū)調(diào)研中,有 140 條留言,留言企業(yè)包括工商銀行、愛奇藝、海康威視、APUS、上海識裝等,而實(shí)際使用 Nacos 來構(gòu)建注冊和配置中心的企業(yè)數(shù)量遠(yuǎn)不止于此,虎牙直播是最早一批將 Nacos 大規(guī)模引入到生產(chǎn)環(huán)境的典型用戶:
Who is using Nacos:
https://github.com/alibaba/nacos/issues/273
“虎牙關(guān)注 Nacos 是從v0.2 開始的,我們也參與了社區(qū)的建設(shè),可以說是比較早期的企業(yè)用戶。引入Nacos前,我們也對比了Spring Cloud Config Server、ZooKeeper 和 ectd ,總體評估下來,基于我們微服務(wù)體系現(xiàn)狀以及業(yè)務(wù)場景,決定使用 Nacos 作為服務(wù)化改造中服務(wù)注冊和服務(wù)發(fā)現(xiàn)的方案。使用過程中,我們發(fā)現(xiàn),隨著社區(qū)版本的不斷更新和虎牙的深入實(shí)踐,Nacos 的優(yōu)勢遠(yuǎn)比調(diào)研過程中發(fā)現(xiàn)的多。”?#虎牙?基礎(chǔ)保障部中間件團(tuán)隊(duì)負(fù)責(zé)人張波在一次開發(fā)者活動上分享道。
從開源到商業(yè)增值
似乎從開源軟件誕生的第一天起,商業(yè)增值就出現(xiàn)了,它為那些基于開源來構(gòu)建業(yè)務(wù),但苦于效率、時(shí)間成本和穩(wěn)定性問題的企業(yè),提供了更多、更契合的選項(xiàng),而這一魅力使得開源生態(tài)的發(fā)展越發(fā)健康。
阿里云微服務(wù)引擎 ( MSE ) 是開源注冊、配置中心的全托管平臺,提供高可用、免運(yùn)維的 ZooKeeper、Nacos 注冊中心 和 Eureka 等集群,完全兼容開源產(chǎn)品標(biāo)準(zhǔn)接口,無需修改代碼、開箱即用,并為客戶提供相應(yīng)的監(jiān)控和運(yùn)維工具。
產(chǎn)品官網(wǎng):
https://www.aliyun.com/product/mse
那么,MSE托管的注冊中心,和開源自建注冊中心究竟有什么區(qū)別?我們可以通過下面這張表來進(jìn)行對比。
?
從了解到實(shí)踐
Dubbo 應(yīng)用如何保證業(yè)務(wù)不停機(jī)的情況下無縫遷移到MSE?
下面以基于 SpringBoot 構(gòu)建的 Dubbo 應(yīng)用為例介紹如何進(jìn)行遷移
第一步:引入用于遷移的定制化注冊中心依賴
雖然 Dubbo 本身提供了配置多注冊中心的能力,但其存在比較大的局限性,當(dāng)消費(fèi)者配置多注冊中心時(shí),Dubbo 原有的策略為優(yōu)先選取第一個(gè)注冊中心的地址,若其地址為空,再讀取第二個(gè),依次類推選取地址。理想的模型應(yīng)當(dāng)是多個(gè)注冊中心的地址合并后隨機(jī)選取,為此,MSE 提供了專門的注冊中心擴(kuò)展,解決該問題:
<dependency><groupId>com.alibaba.edas</groupId><artifactId>edas-dubbo-migration-bom</artifactId><version>2.6.5.1</version><type>pom</type> </dependency>其中 edas-dubbo-migration-bom 有 2.6.5.1 和 2.7.5 兩個(gè)版本,分別對應(yīng) Dubbo 2.6.x 和 Dubbo 2.7.x 兩個(gè)大版本。
第二步:購買 MSE Nacos 實(shí)例,并配置對應(yīng) nacos server address
在 MSE 控制臺購買相同 VPC 內(nèi)的 Nacos 實(shí)例,并在應(yīng)用的 application.properties 配置文件增加:
dubbo.registry.address = edas-migration://30.5.124.15:9999?service-registry=consul://${consulAddress}:8500,nacos://${nacosAddress}:8848&reference-registry=consul://${consulAddress}:8500,nacos://${nacosAddress}:8848說明:
edas-migration://30.5.124.15:9999多注冊中心的頭部信息??梢圆蛔龈?#xff0c;ip 和 port 可以任意填寫,主要是為了兼容 Dubbo 對 ip 和 port 的校驗(yàn)。啟動時(shí),如果日志級別是 WARN 及以下,可能會拋一個(gè) WARN 的日志,可以忽略。
service-registry服務(wù)注冊的注冊中心地址。寫入多個(gè)注冊中心地址。每個(gè)注冊中心都是標(biāo)準(zhǔn)的 Dubbo 注冊中心格式;多個(gè)用 , 分隔。
reference-registry服務(wù)訂閱的注冊中心地址。每個(gè)注冊中心都是標(biāo)準(zhǔn)的 Dubbo 注冊中心格式;多個(gè)用,分隔。
第三步:確認(rèn)雙注冊方案成功
啟動應(yīng)用,并觀察到 MSE 實(shí)例的服務(wù)管理頁面中注冊上了提供者和消費(fèi)者的信息。
同時(shí)在 Consul 的控制臺中也能看相應(yīng)的信息:
并且確認(rèn)應(yīng)用可以正常訪問,到目前為止我們第一個(gè)應(yīng)用遷移完畢。
第四步:依照遷移第一個(gè)應(yīng)用的遷移步驟,逐步遷移全量應(yīng)用
第五步 清理遷移配置
遷移完成后,刪除原注冊中心的配置和遷移過程專用的依賴 edas-dubbo-migration-bom,在業(yè)務(wù)量較小的時(shí)間分批重啟應(yīng)用。edas-dubbo-migration-bom 是一個(gè)遷移專用的 starter,雖然長期使用對您業(yè)務(wù)的穩(wěn)定性沒有影響,但其并不會跟隨 Dubbo 的版本進(jìn)行升級,為避免今后框架升級過程中出現(xiàn)兼容問題,推薦您在遷移完畢后清理掉,然后在業(yè)務(wù)量較小的時(shí)間分批重啟應(yīng)用。
Spring Cloud 應(yīng)用如何保證業(yè)務(wù)不停機(jī)的情況下無縫遷移到MSE?
Spring Cloud 默認(rèn)只支持 1 個(gè)注冊中心,所以無法完成不停機(jī)的無縫遷移,這里對此作了增強(qiáng),支持了雙注冊雙訂閱的模式,確保業(yè)務(wù)不停機(jī)進(jìn)行遷移。
遷移方案:選擇最先遷移的應(yīng)用,建議是從最下層 Provider 開始遷移。但如果調(diào)用鏈路太復(fù)雜,比較難分析,也可以任意選一個(gè)應(yīng)用進(jìn)行遷移。選擇完成后,即可參考下面的遷移步驟遷移第一個(gè)應(yīng)用。
第一步:購買 MSE Nacos 實(shí)例,并配置對應(yīng) nacos server address
在 MSE 控制臺購買相同 vpc 內(nèi)的 Nacos 實(shí)例,并在應(yīng)用的 application.properties 配置文件增加:
spring.cloud.nacos.discovery.server-addr={MSE對應(yīng)Nacos實(shí)例的域名}:8848第二步:在應(yīng)用程序中添加依賴
在 pom.xml 文件中添加? spring-cloud-starter-alibaba-nacos-discovery 依賴。
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>{相應(yīng)的版本}</version></dependency>默認(rèn)情況下 Spring Cloud 只支持在依賴中引入一個(gè)注冊中心,當(dāng)存在多個(gè)注冊中心時(shí):啟動會報(bào)錯(cuò)。所以這里需要添加一個(gè)依賴 edas-sc-migration-starter,使 Spring Cloud 應(yīng)用支持多注冊。
<dependency><groupId>com.alibaba.edas</groupId><artifactId>edas-sc-migration-starter</artifactId><version>1.0.2</version></dependency>Ribbon 是實(shí)現(xiàn)負(fù)載均衡的組件,為了使應(yīng)用可以支持從多個(gè)注冊中心訂閱服務(wù),需要修改 Ribbon 配置。在應(yīng)用啟動的主類中,將 RibbonClients 默認(rèn)配置為 MigrationRibbonConfiguration 。假設(shè)原有的應(yīng)用主類啟動代碼如下:
@SpringBootApplicationpublic class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);}}那么修改后的應(yīng)用主類啟動代碼如下:
@SpringBootApplication@RibbonClients(defaultConfiguration = MigrationRibbonConfiguration.class)public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);}}第三步:確認(rèn)雙注冊方案成功
啟動應(yīng)用,并觀察到 MSE 實(shí)例的服務(wù)管理中注冊上我們的服務(wù)。
同時(shí)在 Consul 的控制臺中也能看到我們的服務(wù)。
并且確認(rèn)應(yīng)用可以正常訪問,到目前為止我們第一個(gè)應(yīng)用遷移完畢。
第四步:依照遷移第一個(gè)應(yīng)用的遷移步驟,逐步遷移全量應(yīng)用
第五步:清理遷移配置
遷移完成后,刪除原有的注冊中心的配置和遷移過程專用的依賴 edas-sc-migration-starter ,在業(yè)務(wù)量較小的時(shí)間分批重啟應(yīng)用。edas-sc-migration-starter 是一個(gè)遷移專用的 starter,雖然長期使用對您業(yè)務(wù)的穩(wěn)定性沒有影響,但在 Ribbon 負(fù)載均衡實(shí)現(xiàn)方面有一定的局限性,推薦您在遷移完畢后清理掉,然后在業(yè)務(wù)量較小的時(shí)間分批重啟應(yīng)用。
關(guān)于動態(tài)調(diào)整服務(wù)注冊和訂閱方式:
依賴 edas-sc-migration-starter 具備配合配置中心達(dá)到動態(tài)調(diào)整服務(wù)注冊和訂閱方式的效果,在完成遷移過程中,您可以通過修改您的配置動態(tài)變更服務(wù)注冊和訂閱方式。
動態(tài)調(diào)整服務(wù)訂閱默認(rèn)的訂閱策略是從所有注冊中心訂閱,并對數(shù)據(jù)做一些簡單的聚合。
您可以通過在您的配置中心修改 spring.cloud.edas.migration.subscribes 屬性以便選擇從哪幾個(gè)注冊中心訂閱數(shù)據(jù)。
spring.cloud.edas.migration.subscribes=nacos,consul # 同時(shí)從 Consul 和 Nacos 訂閱服務(wù)spring.cloud.edas.migration.subscribes=nacos # 只從 Nacos 訂閱服務(wù)動態(tài)變更服務(wù)注冊默認(rèn)的注冊策略是注冊到所有注冊中心。您可以通過在您的配置中心的
spring.cloud.edas.migration.registry.excludes 屬性來選擇關(guān)閉指定的注冊中心。
spring.cloud.edas.migration.registry.excludes= #默認(rèn)值為空,注冊到所有的服務(wù)注冊中心spring.cloud.edas.migration.registry.excludes=consul #關(guān)閉 Consul 的注冊spring.cloud.edas.migration.registry.excludes=nacos,consul #關(guān)閉 Nacos 和 Consul 的注冊
阿里云微服務(wù)引擎 MSE 重磅升級發(fā)布會即將開啟
拋開擔(dān)憂,迎接確性。
從配置中心,到微服務(wù)全面治理,MSE 正在迎接他的第一個(gè)成人禮,在原有配置中心托管的基礎(chǔ)上,全面升級引入微服務(wù)治理能力,并通過 Java Agent 技術(shù)使得您的應(yīng)用無需修改任何代碼和配置,即可享有阿里云提供的微服務(wù)治理能力,已經(jīng)上線的功能包含服務(wù)查詢、無損下線、服務(wù)鑒權(quán)、離群實(shí)例摘除、標(biāo)簽路由。
?
[1 ]https://yq.aliyun.com/articles/698930
?
作者信息:
望陶,GitHub ID @ralf0131,Apache Dubbo PPMC Member,Apache Tomcat PMCMember,阿里巴巴高級技術(shù)專家。
總結(jié)
以上是生活随笔為你收集整理的从 2018 年 Nacos 开源说起的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 研究了 2 天,终于知道 JDK 8 默
- 下一篇: 再见了, VS Code!