分布式動(dòng)態(tài)配置后浪推前浪 -- Nacos
Spring Boot 作為主流微服務(wù)框架,擁有非常多的開發(fā)者。為了提升大家工作效率
整理個(gè)《專輯系列》,快速集成各大主流中間件框架
如:Mybatis、druid、Data JPA、Redis、Sharding-sphere、Guava、Caffeine、Ehcache、ElasticSearch、Kafka、Pulsar、Apollo、Nacos、OkHttp、HttpClient、gRPC、Dubbo、Seata 等等,
感興趣請關(guān)注公眾號 ---《微觀技術(shù)》
?? 前言
Nacos 是阿里巴巴的開源的項(xiàng)目,全稱 Naming Configuration Service ,專注于服務(wù)發(fā)現(xiàn)和配置管理領(lǐng)域。
Nacos 致力于幫助您發(fā)現(xiàn)、配置和管理微服務(wù)。Nacos 提供了一組簡單易用的特性集,幫助您快速實(shí)現(xiàn)動(dòng)態(tài)服務(wù)發(fā)現(xiàn)、服務(wù)配置、服務(wù)元數(shù)據(jù)及流量管理。
客戶端語言方面目前支持 Java,go 、python、 C# 和 C++等主流語言
開源地址:https://github.com/alibaba/nacos

目前 Github上已經(jīng)有近 18K 的 start,又有阿里巴巴復(fù)雜的業(yè)務(wù)做背書,在開源市場非常受歡迎。最近一次 commits 時(shí)間在2021年5月6日,社區(qū)維護(hù)投入力度很大,一些bug也能及時(shí)修復(fù)。
?? 核心功能
動(dòng)態(tài)配置服務(wù)讓您能夠以中心化、外部化和動(dòng)態(tài)化的方式管理所有環(huán)境的配置。動(dòng)態(tài)配置消除了配置變更時(shí)重新部署應(yīng)用和服務(wù)的需要。配置中心化管理讓實(shí)現(xiàn)無狀態(tài)服務(wù)更簡單,也讓按需彈性擴(kuò)展服務(wù)更容易。
動(dòng)態(tài)服務(wù)發(fā)現(xiàn)對以服務(wù)為中心的(例如微服務(wù)和云原生)應(yīng)用架構(gòu)方式非常關(guān)鍵。Nacos支持DNS-Based和RPC-Based(Dubbo、gRPC)模式的服務(wù)發(fā)現(xiàn)。Nacos也提供實(shí)時(shí)健康檢查,以防止將請求發(fā)往不健康的主機(jī)或服務(wù)實(shí)例。借助Nacos,您可以更容易地為您的服務(wù)實(shí)現(xiàn)斷路器。
3、動(dòng)態(tài)DNS服務(wù)
通過支持權(quán)重路由,動(dòng)態(tài)DNS服務(wù)能讓您輕松實(shí)現(xiàn)中間層負(fù)載均衡、更靈活的路由策略、流量控制以及簡單數(shù)據(jù)中心內(nèi)網(wǎng)的簡單DNS解析服務(wù)。動(dòng)態(tài)DNS服務(wù)還能讓您更容易地實(shí)現(xiàn)以DNS協(xié)議為基礎(chǔ)的服務(wù)發(fā)現(xiàn),以消除耦合到廠商私有服務(wù)發(fā)現(xiàn)API上的風(fēng)險(xiǎn)。
?? Nacos 2.x 優(yōu)點(diǎn)
在Nacos 1.X 基礎(chǔ)上,對通訊層做了優(yōu)化,目前采用了gRPC實(shí)現(xiàn)了長連接和配置推動(dòng),使用長鏈接的好處大幅度減少了 1.x 輪詢心跳頻繁導(dǎo)致 JVM Full GC。

1、客戶端不再需要定時(shí)發(fā)送實(shí)例心跳,只需要有一個(gè)維持連接可用 keepalive 消息即可。重復(fù) TPS 可以大幅降低。
2、TCP 連接斷開可以被快速感知到,提升反應(yīng)速度。
3、長連接的流式推送,比 UDP 更加可靠;nio 的機(jī)制具有更高的吞吐量,而且由于可靠推送,可以加長客戶端用于對賬服務(wù)列表的時(shí)間,甚至刪除相關(guān)的請求。重復(fù)的無效 QPS 可以大幅降低。
4、長連接避免頻繁連接開銷,可以大幅緩解 TIME_WAIT 問題。
5、真實(shí)的長連接,解決配置模塊 GC 問題。
6、更細(xì)粒度的同步內(nèi)容,減少服務(wù)節(jié)點(diǎn)間的通信壓力。
?? Show me the code
外部依賴:
Spring Boot 已經(jīng)為 Nacos 封裝了starter組件,只需在 pom.xml 文件中添加jar版本依賴即可:
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
<version>0.2.1</version>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-actuator</artifactId>
<version>0.2.1</version>
</dependency>
配置文件:
在配置文件 application.yaml 中配置 Nacos 的相關(guān)參數(shù),具體內(nèi)容如下:
nacos:
config:
server-addr: 127.0.0.1:8848
就像Maven用groupId、artifactId、version三者來定位一個(gè)jar包在倉庫中的位置一樣。Nacos也提供了 Namespace (命名空間) 、Data ID (配置集ID)、 Group (組) 來確定一個(gè)配置文件。
StartApplication 啟動(dòng)類,添加dataId:
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class})
@NacosPropertySource(dataId = "bulking-nacos-example", autoRefreshed = true)
public class StartApplication {
public static void main(String[] args) {
SpringApplication.run(StartApplication.class, args);
}
}
nacos提供了注解方式,實(shí)時(shí)動(dòng)態(tài)獲取配置項(xiàng)最新值
@Controller
@RequestMapping("config")
public class ConfigController {
@NacosValue(value = "${useLocalCache}", autoRefreshed = true)
private boolean useLocalCache;
@RequestMapping(value = "/get", method = GET)
@ResponseBody
public boolean get() {
return useLocalCache;
}
}
?? 操作演示
管理后臺:
Nacos是一個(gè)用Java語言編寫的web項(xiàng)目,Tomcat默認(rèn)端口是8848,訪問8848端口可以打開Nacos管理臺。訪問地址:http://localhost:8848/nacos/#/login
用戶名和密碼:nacos/nacos
新增動(dòng)態(tài)配置


當(dāng)應(yīng)用啟動(dòng)時(shí),會(huì)將當(dāng)前節(jié)點(diǎn)注冊到nacos中

首次訪問:http://localhost:9071/config/get
返回結(jié)果:
true
將nacos中 Data Id:bulking-nacos-example 中的 useLocalCache 設(shè)置成false
演示工程在不重啟的情況下,能實(shí)時(shí)感知配置項(xiàng)的變化。
?? 工程代碼
https://github.com/aalansehaiyang/spring-boot-bulking
模塊:spring-boot-bulking-naco
歡迎關(guān)注微信公眾號:互聯(lián)網(wǎng)全棧架構(gòu),收取更多有價(jià)值的信息。
