本文檔基於v2.0.3進行整理。html
Nacos 致力於幫助您發現、配置和管理微服務。Nacos 提供了一組簡單易用的特性集,幫助您快速實現動態服務發現、服務配置、服務元數據及流量管理。(配置中心和註冊中心)java
目前市面上用的比較多的配置中心有:Spring Cloud Confifig、Apollo、Nacos和Disconf等。 因爲Disconf再也不維護,下面主要對比一下Spring Cloud Confifig、Apollo和Nacos。mysql
從配置中心角度來看,性能方面Nacos的讀寫性能最高,Apollo次之,Spring Cloud Confifig依賴Git場景不適合開 放的大規模自動化運維API。功能方面Apollo最爲完善,nacos具備Apollo大部分配置管理功能,而Spring Cloud Confifig不帶運維管理界面,須要自行開發。Nacos的一大優點是整合了註冊中心、配置中心功能,部署和操做相比 Apollo都要直觀簡單,所以它簡化了架構複雜度,並減輕運維及部署工做。git
綜合來看,Nacos的特色和優點仍是比較明顯的,下面咱們一塊兒進入Nacos的世界。github
目前市面上用的比較多的服務發現中心有:Nacos、Eureka、Consul和Zookeeper。web
Nacos主要提供如下四大功能:spring
服務發現與服務健康檢查sql
Nacos使服務更容易註冊,並經過DNS或HTTP接口發現其餘服務,Nacos還提供服務的實時健康檢查,以防止向不健康的主機或服務實例發送請求。數據庫
動態配置管理bootstrap
動態配置服務容許您在全部環境中以集中和動態的方式管理全部服務的配置。Nacos消除了在更新配置時從新部署應用程序,這使配置的更改更加高效和靈活。
動態DNS服務
Nacos提供基於DNS 協議的服務發現能力,旨在支持異構語言的服務發現,支持將註冊在Nacos上的服務以域名的方式暴露端點,讓三方應用方便的查閱及發現。
服務和元數據管理
Nacos 能讓您從微服務平臺建設的視角管理數據中心的全部服務及元數據,包括管理服務的描述、生命週期、服務的靜態依賴分析、服務的健康狀態、服務的流量管理、路由及安全策略。
這裏動態配置管理的特性說明了Naocs的配置管理能力。
單機模式時nacos默認使用嵌入式數據庫實現數據的存儲,若想使用外部mysql存儲nacos數據,須要進行如下步驟:
spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://11.162.196.16:3306/nacos_config? characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true db.user=nacos_devtest db.password=youdontknow
注意:支持MySQL 8須要添加插件。
什麼是配置?
應用程序在啓動和運行的時候每每須要讀取一些配置信息,配置基本上伴隨着應用程序的整個生命週期,好比:數據庫鏈接參數、啓動參數等。
配置主要有如下幾個特色:
配置是獨立於程序的只讀變量
配置伴隨應用的整個生命週期
配置能夠有多種加載方式
配置須要治理
什麼是配置中心?
總得來講,配置中心就是一種統一管理各類應用配置的基礎服務組件。
在傳統巨型單體應用紛紛轉向細粒度微服務架構的歷史進程中,配置中心是微服務化不可缺乏的一個系 統組件,在這種背景下中心化的配置服務即配置中心應運而生,一個合格的配置中心須要知足以下特性:
step1:使用Nacos的界面發佈配置
step2:經過Nacos API獲取配置
/** * 演示使用Nacos API 對配置中心數據進行增刪改查的過程 */ public class NacosApiDemo { public static void main(String[] args) throws NacosException, InterruptedException { String serverAddr = "localhost"; String dataId = "application.yml"; String group = "demo"; String nameSpace = "6f97a206-ce19-44c2-85be-c601170d306e"; Properties properties = new Properties(); properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr); properties.put(PropertyKeyConst.NAMESPACE, nameSpace); ConfigService configService = NacosFactory.createConfigService(properties); // 啓動的時候讀取配置中心的配置 String content = configService.getConfig(dataId, group, 5000); System.out.println("配置內容:"); System.out.println(content); // 監聽配置中心數據的變化 configService.addListener(dataId, group, new Listener() { @Override public void receiveConfigInfo(String configInfo) { System.out.println("recieve:" + configInfo); } @Override public Executor getExecutor() { return null; } }); // 向數據中心推送數據,改變原有配置 boolean isPublishOk = configService.publishConfig(dataId, group, "content"); System.out.println(isPublishOk); //再次讀取數據 Thread.sleep(3000); content = configService.getConfig(dataId, group, 5000); System.out.println(content); // 刪除配置中心數據 boolean isRemoveOk = configService.removeConfig(dataId, group); System.out.println(isRemoveOk); Thread.sleep(3000); // 再次讀書數據 content = configService.getConfig(dataId, group, 5000); System.out.println(content); Thread.sleep(300000); } }
對於Nacos配置管理,經過Namespace、group、Data ID可以定位到一個配置集。
配置集(Data ID)
在系統中,一個配置文件一般就是一個配置集,一個配置集能夠包含了系統的各類配置信息,例如,一個配置集可 能包含了數據源、線程池、日誌級別等配置項。每一個配置集均可以定義一個有意義的名稱,就是配置集的ID即Data ID。
配置項
配置集中包含的一個個配置內容就是配置項。它表明一個具體的可配置的參數與其值域,一般以 key=value 的形 式存在。例如咱們常配置系統的日誌輸出級別(logLevel=INFO|WARN|ERROR) 就是一個配置項。
配置分組(Group)
配置分組是對配置集進行分組,經過一個有意義的字符串(如 Buy 或 Trade )來表示,不一樣的配置分組下能夠有 相同的配置集(Data ID)。當您在 Nacos 上建立一個配置時,若是未填寫配置分組的名稱,則配置分組的名稱默 認採用 DEFAULT_GROUP 。配置分組的常見場景:可用於區分不一樣的項目或應用,例如:學生管理系統的配置集 能夠定義一個group爲:STUDENT_GROUP。
命名空間(Namespace)
命名空間(namespace)可用於進行不一樣環境的配置隔離。例如能夠隔離開發環境、測試環境和生產環境,由於 它們的配置可能各不相同,或者是隔離不一樣的用戶,不一樣的開發人員使用同一個nacos管理各自的配置,可經過 namespace隔離。不一樣的命名空間下,能夠存在相同名稱的配置分組(Group) 或 配置集。
最佳實踐
Nacos抽象定義了Namespace、Group、Data ID的概念,具體這幾個概念表明什麼,取決於咱們把它們當作什 麼,這裏推薦給你們一種用法,以下圖:
namespace 的設計是 nacos 基於此作多環境以及多租戶(多個用戶共同使用nacos)數據(配置和服務)隔離的。
從一個租戶(用戶)的角度來看,若是有多套不一樣的環境,那麼這個時候能夠根據指定的環境來建立不一樣的 namespce,以此來實現多環境的隔離。例如,你可能有開發,測試和生產三個不一樣的環境,那麼使用一套 nacos 集羣能夠分別建如下三個不一樣的 namespace。以下圖所示:
從多個租戶(用戶)的角度來看,每一個租戶(用戶)可能會有本身的 namespace,每一個租戶(用戶)的配置數據以及注 冊的服務數據都會歸屬到本身的 namespace 下,以此來實現多租戶間的數據隔離。例如超級管理員分配了三 個租戶,分別爲張3、李四和王五。分配好了以後,各租戶用本身的帳戶名和密碼登陸後,建立本身的命名 空間。以下圖所示:
上面監聽查詢的功能說下:能夠經過IP地址查詢,查詢client端已經讀取到的配置文件的MD5值,用這個MD5值和配置文件詳情中的MD5值對比就能夠知道客戶端拿到的配置文件是否是最新的。
將演示如何使用 Spring Cloud Alibaba Nacos Confifig在Spring Cloud應用中集成Nacos,經過 Spring cloud原生方式快捷的獲取配置內容。
Spring Cloud是什麼:
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的開發便利性巧妙地簡化了分佈式系統基礎設施的開發,如服務發現註冊、配置中心、消息總線、負載均衡、斷路器、數據監控等,均可以用Spring Boot 的開發風格作到一鍵啓動和部署。Spring Cloud並無重複製造輪子,它只是將目前各家公司開發的比較成 熟、經得起實際考驗的服務框架組合起來,集成最多的組件要屬Netflflix公司,經過Spring Boot風格進行再封 裝屏蔽掉了複雜的配置和實現原理,最終給開發者留出了一套簡單易懂、易部署和易維護的分佈式系統開發 工具包。
Spring Cloud Alibaba Nacos Confifig是什麼:
Spring Cloud Alibaba Nacos Confifig是Spring Cloud Alibaba的子項目,而Spring Cloud Alibaba是阿里巴巴公司提供的開源的基於Spring cloud的微服務套件合集,它致力於提供微服務開發的一站式解決方案,能夠理解爲spring cloud是一套微服務開發的 標準 ,spring cloud alibaba與spring cloud Netflflix是實現。使用 Spring Cloud Alibaba方案,開發者只須要添加一些註解和少許配置,就能夠將 Spring Cloud 應用接入阿里分佈式應用解決方案,經過阿里中間件來迅速搭建分佈式應用系統。
step1:添加依賴
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> <version>2.2.6.RELEASE</version> </dependency> </dependencies>
step2:添加配置(bootstrap.yml)
#日誌配置 logging: config: classpath:logback-app.xml #Server相關配置 server: port: ${port:9999} #Spring相關配置 spring: application: name: cloud-app profiles: active: @profiles.active@ cloud: nacos: config: server-addr: 127.0.0.1:8848 file-exetension: yaml namespace: 6f97a206-ce19-44c2-85be-c601170d306e group: demo
在 Nacos Spring Cloud 中,dataId
的完整格式以下:
${prefix}-${spring.profiles.active}.${file-extension}
prefix
默認爲 spring.application.name
的值,也能夠經過配置項 spring.cloud.nacos.config.prefix
來配置。spring.profiles.active
即爲當前環境對應的 profile,詳情能夠參考 Spring Boot文檔。 注意:當 spring.profiles.active
爲空時,對應的鏈接符 -
也將不存在,dataId 的拼接格式變成 ${prefix}.${file-extension}
file-exetension
爲配置內容的數據格式,能夠經過配置項 spring.cloud.nacos.config.file-extension
來配置。目前只支持 properties
和 yaml
類型。step3:經過 Spring Cloud 原生註解 @RefreshScope
實現配置自動更新
@RestController @RequestMapping("/config") @RefreshScope public class ConfigController { @Value("${useLocalCache:false}") private boolean useLocalCache; @RequestMapping("/get") public boolean get() { return useLocalCache; } }
共享配置文件
spring: application: name: server1 profiles: active: @profiles.active@ cloud: nacos: config: server-addr: 127.0.0.2:8848 file-extension: yaml namespace: 6f97a206-ce19-44c2-85be-c601170d306e group: demo # 這邊的shared-configs不能配置namespace,和上面的配置共享一個namespace,因此通常用於讀取一個團隊內部的共享文件 shared-configs[0]: data-id: common.yaml refresh: true group: common
spring: application: name: server1 profiles: active: @profiles.active@ cloud: nacos: config: server-addr: 127.0.0.2:8848 file-extension: yaml namespace: 6f97a206-ce19-44c2-85be-c601170d306e group: demo extensionConfigs[0]: data-id: jdbc.yaml refresh: true group: demo extensionConfigs[1]: data-id: o32.yaml refresh: true group: demo shared-configs[0]: data-id: common.yaml refresh: true group: common
配置文件優先級
假如依賴的配置文件有衝突。
主配置文件(經過nacos配置肯定的配置文件)> 擴展配置1 > 擴展配置0 > 公共配置
微服務環境下,服務常常是多實例部署的。並且常常會增長實例或者下線實例,服務以前怎麼互相感知,就是服務發現須要研究的問題。
總結一下,在微服務環境中,因爲服務運行實例的網絡地址是不斷動態變化的,服務實例數量的動態變化 ,所以無 法使用固定的配置文件來記錄服務提供方的網絡地址,必須使用動態的服務發現機制用於實現微服務間的相互感知。各服務實例會上報本身的網絡地址,這樣服務中心就造成了一個完整的服務註冊表,各服務實例會經過服務發現中心來獲取訪問目標服務的網絡地址,從而實現服務發現的機制。
採用Feign+Ribbon的整合方式,是由Feign完成遠程調用的整個流程。而Feign集成了Ribbon,Feign使用Ribbon
完成調用實例的負載均衡。 (Feign作遠程調用,Ribbon用來作負載均衡)
Ribbon 簡介
Ribbon是一個客戶端負載均衡器,它的責任是從一組實例列表中挑選合適的實例,如何挑選?取決於負載均衡策略 。
Ribbon核心組件IRule是負載均衡策略接口,它有以下實現:
可經過下面方式在spring boot 配置文件中修改默認的負載均衡策略:
account‐service.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
account-service 是調用的服務的名稱,後面的組成部分是固定的。
Feign介紹
Feign是Netflflix開發的聲明式、模板化的HTTP客戶端, Feign能夠幫助咱們更快捷、優雅地調用HTTP API。Feign 的英文表意爲「僞裝,假裝,變形」, 能夠理解爲將HTTP報文請求方式假裝爲簡單的java接口調用方式。
# Server相關配置 server: port: 18080 #Spring相關配置 spring: application: name: server1 profiles: active: @profiles.active@ cloud: nacos: discovery: server-addr: 127.0.0.2:8848
依賴:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> </dependencies>
啓動服務端:
@SpringBootApplication @EnableDiscoveryClient public class CloudServer1 { private static Logger logger = LoggerFactory.getLogger(CloudServer1.class); public static void main(String[] args) { System.setProperty("nacos.logging.default.config.enabled","false"); logger.info("CloudServer1 begin to start..."); SpringApplication.run(CloudServer1.class, args); logger.info("CloudServer1 start success..."); } }
step1:添加依賴
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> </dependencies>
step2:添加配置
server: port: 9999 #Spring相關配置 spring: application: name: cloud-comsumer profiles: active: @profiles.active@ cloud: nacos: discovery: server-addr: 127.0.0.2:8848
step3:添加客戶端調用
@FeignClient(name = "server1") public interface ServerConsumerClient { @GetMapping("/echo/chen") String echoChen(); @GetMapping("/echo/zhao") String echoZhen(); }
step4:啓動應用
@SpringBootApplication @EnableDiscoveryClient @EnableFeignClients public class CloudApp { private static Logger logger = LoggerFactory.getLogger(CloudApp.class); public static void main(String[] args) { System.setProperty("nacos.logging.default.config.enabled","false"); logger.info("app begin to start..."); SpringApplication.run(CloudApp.class, args); logger.info("app start success..."); } }
Nacos 客戶端讀取配置、更新配置、刪除配置和監聽服務端配置變化的原理;
Nacos 各個日誌的功能;
配置多個數據庫的原理;
Nacos 接入用戶時必須指定用戶密碼;
Nacos 用戶權限管理。 --- http://www.javashuo.com/article/p-cvslcoxc-wt.html 對服務發現有沒有影響