什么是Nacos
Nacos可以幫助開發者發現、配置和管理微服務。它提供了一組簡單易用的特性集,可以快速實現動態服務發現、服務配置、服務元數據及流量管理。可以幫助開發者更敏捷的構建、交付和管理微服務平台。Nacos是構建以"服務"為中心的現代應用架構(例如微服務范式、雲原生范式)的服務基礎設施。
Nacos相關特性
- 服務發現和服務健康監測
Nacos 支持基於 DNS 和基於 RPC 的服務發現。服務提供者使用 原生SDK、OpenAPI、或一個獨立的Agent TODO注冊 Service 后,服務消費者可以使用DNS TODO 或HTTP&API查找和發現服務。
- 動態配置服務
動態配置消除了配置變更時重新部署應用和服務的需要,讓配置管理變得更加高效和敏捷。配置中心化管理讓實現無狀態服務變得更簡單,讓服務按需彈性擴展變得更容易。
- 動態 DNS 服務
動態 DNS 服務支持權重路由,讓您更容易地實現中間層負載均衡、更靈活的路由策略、流量控制以及數據中心內網的簡單DNS解析服務。動態DNS服務還能讓您更容易地實現以 DNS 協議為基礎的服務發現,以幫助您消除耦合到廠商私有服務發現 API 上的風險。
Nacos 提供了一些簡單的 DNS APIs TODO 幫助您管理服務的關聯域名和可用的 IP:PORT 列表.
- 服務及其元數據管理
Nacos 能讓您從微服務平台建設的視角管理數據中心的所有服務及元數據,包括管理服務的描述、生命周期、服務的靜態依賴分析、服務的健康狀態、服務的流量管理、路由及安全策略、服務的 SLA 以及最首要的 metrics 統計數據。
基本概念
- 地域
物理的數據中心,資源創建成功后不能更換。
- 可用域
同一地域內,電力和網絡互相獨立的物理區域。同一可用區內,實例的網絡延遲較低。
- 接入點
地域的某個服務的入口域名。
- 命名空間
用於進行租戶粒度的配置隔離。不同的命名空間下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用場景之一是不同環境的配置的區分隔離,例如開發測試環境和生產環境的資源(如配置、服務)隔離等。
- 配置
在系統開發過程中,開發者通常會將一些需要變更的參數、變量等從代碼中分離出來獨立管理,以獨立的配置文件的形式存在。目的是讓靜態的系統工件或者交付物(如 WAR,JAR 包等)更好地和實際的物理運行環境進行適配。配置管理一般包含在系統部署的過程中,由系統管理員或者運維人員完成。配置變更是調整系統運行時的行為的有效手段。
- 配置管理
系統配置的編輯、存儲、分發、變更管理、歷史版本管理、變更審計等所有與配置相關的活動。
- 配置項
一個具體的可配置的參數與其值域,通常以 param-key=param-value 的形式存在。例如我們常配置系統的日志輸出級別(logLevel=INFO|WARN|ERROR) 就是一個配置項。
- 配置集
一組相關或者不相關的配置項的集合稱為配置集。在系統中,一個配置文件通常就是一個配置集,包含了系統各個方面的配置。例如,一個配置集可能包含了數據源、線程池、日志級別等配置項。
- 配置集 ID
Nacos 中的某個配置集的 ID。配置集 ID 是組織划分配置的維度之一。Data ID 通常用於組織划分系統的配置集。一個系統或者應用可以包含多個配置集,每個配置集都可以被一個有意義的名稱標識。Data ID 通常采用類 Java 包(如 com.taobao.tc.refund.log.level)的命名規則保證全局唯一性。此命名規則非強制。
- 配置分組
Nacos 中的一組配置集,是組織配置的維度之一。通過一個有意義的字符串(如 Buy 或 Trade )對配置集進行分組,從而區分 Data ID 相同的配置集。當您在 Nacos 上創建一個配置時,如果未填寫配置分組的名稱,則配置分組的名稱默認采用 DEFAULT_GROUP 。配置分組的常見場景:不同的應用或組件使用了相同的配置類型,如 database_url 配置和 MQ_topic 配置。
- 配置快照
Nacos 的客戶端 SDK 會在本地生成配置的快照。當客戶端無法連接到 Nacos Server 時,可以使用配置快照顯示系統的整體容災能力。配置快照類似於 Git 中的本地 commit,也類似於緩存,會在適當的時機更新,但是並沒有緩存過期(expiration)的概念。
- 服務
通過預定義接口網絡訪問的提供給客戶端的軟件功能。
- 服務名
服務提供的標識,通過該標識可以唯一確定其指代的服務。
- 服務注冊中心
存儲服務實例和服務負載均衡策略的數據庫。
- 服務發現
在計算機網絡上,(通常使用服務名)對服務下的實例的地址和元數據進行探測,並以預先定義的接口提供給客戶端進行查詢。
- 元信息
Nacos數據(如配置和服務)描述信息,如服務版本、權重、容災策略、負載均衡策略、鑒權配置、各種自定義標簽 (label),從作用范圍來看,分為服務級別的元信息、集群的元信息及實例的元信息。
- 應用
用於標識服務提供方的服務的屬性。
- 服務分組
不同的服務可以歸類到同一分組。
- 虛擬集群
同一個服務下的所有服務實例組成一個默認集群, 集群可以被進一步按需求划分,划分的單位可以是虛擬集群。
- 實例
提供一個或多個服務的具有可訪問網絡地址(IP:Port)的進程。
- 權重
實例級別的配置。權重為浮點數。權重越大,分配給該實例的流量越大。
- 健康檢查
以指定方式檢查服務下掛載的實例 (Instance) 的健康度,從而確認該實例 (Instance) 是否能提供服務。根據檢查結果,實例 (Instance) 會被判斷為健康或不健康。對服務發起解析請求時,不健康的實例 (Instance) 不會返回給客戶端。
- 健康保護閾值
為了防止因過多實例 (Instance) 不健康導致流量全部流向健康實例 (Instance) ,繼而造成流量壓力把健康 健康實例 (Instance) 壓垮並形成雪崩效應,應將健康保護閾值定義為一個 0 到 1 之間的浮點數。當域名健康實例 (Instance) 占總服務實例 (Instance) 的比例小於該值時,無論實例 (Instance) 是否健康,都會將這個實例 (Instance) 返回給客戶端。這樣做雖然損失了一部分流量,但是保證了集群的剩余健康實例 (Instance) 能正常工作。
Nacos的安裝
本文采用Window環境進行演示,環境配置如下:
MAVEN:3.6
JDK:1.8
Nacos-server:1.4.1 Nacos下載地址
-
解壓下載好的壓縮包文件
-
進入到nacos/bin/目錄下啟動
startup.cmd -m standalone
注:進行單機版啟動,如果不添加-m standalone則以集群方式啟動。
-
訪問nacos
注:nacos默認數據存儲在derby數據庫,如果實現集群化,必須使用mysql進行持久化存儲。 -
安裝mysql
跳轉鏈接 -
使用conf/nacos-mysql.sql文件初始化數據庫
-
修改conf/application.properties文件增加mysql支持
spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://192.168.137.128:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true db.user=root db.password=123456
-
新建命名空間 online
-
新建一個配置文件
對應數據庫信息如下:
與Alibaba Cloud 集成
-
創建服務提供者,項目名稱為:server-provider
-
在pom文件中增加如下配置:
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>0.9.0.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.1.6.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Greenwich.SR6</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-undertow</artifactId> </dependency> <!--阿里巴巴 nacos 服務發現--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-httpclient</artifactId> </dependency> </dependencies>>
-
創建bootstrap.yaml文件
# 端口號 server: port: 10200 spring: application: name: ${artifactId} #應用名稱 cloud: nacos: discovery: namespace: ed82a624-eb8b-49d7-a7d7-4ad2c63d8b47 #命名空間 server-addr: 192.168.0.130:8848 #nacos地址 main: allow-bean-definition-overriding: true #如果有重名的bean,不報錯 mvc: throw-exception-if-no-handler-found: true management: endpoints: web: exposure: include: '*'
上述中:
## 應用名稱 spring.application.name=${artifactId} ## 命名空間。指定了命名空間,會去該命名空間下注冊和發現服務 spring.cloud.nacos.discovery.namespace=online ## nacos注冊中心地址 spring.cloud.nacos.discovery.server-addr=192.168.0.130:8848
-
創建controller,為消費者提供遠程業務接口
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/provider") public class ProviderController { @GetMapping("/getInfo") public String getInfo(@RequestParam("info") String info){ return "Provider :" +info ; } }
-
創建啟動類
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient public class App { public static void main(String[] args) { SpringApplication.run(App.class); } }
上述中@EnableDiscoveryClient表示能夠讓注冊中心發現,掃描到該服務。
-
創建服務消費者,項目命名為:server-consumer
-
pom文件與服務提供方相同
-
創建bootstrap.yaml
server: port: 10300 spring: application: name: ${artifactId} cloud: nacos: discovery: namespace: ed82a624-eb8b-49d7-a7d7-4ad2c63d8b47 server-addr: 192.168.0.130:8848 main: allow-bean-definition-overriding: true mvc: throw-exception-if-no-handler-found: true management: endpoints: web: exposure: include: '*'
-
創建controller,實現消費方業務,調用提供方的接口
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @RestController @RequestMapping("/consumer") public class ConsumerController { @Autowired private LoadBalancerClient loadBalancerClient ; @Autowired private RestTemplate restTemplate ; @GetMapping("/getInfo") public String getInfo(@RequestParam("info") String info){ // 通過服務提供者的服務id,獲取對應的服務實例信息 ServiceInstance serviceInstance = loadBalancerClient.choose("server-provider"); // 遠程接口服務 String url= serviceInstance.getUri()+"/provider/getInfo?info="+info; String result = restTemplate.getForObject(url, String.class); System.out.println("遠程調用結果"); return result ; } }
-
分別啟動consumer和provider服務,nacos服務管理/服務列表信息如下:
-
訪問如下URL
http://192.168.0.130:10300/consumer/getInfo?info=消費者消費
得到結果:
項目地址:spring-cloud-nacos