Nacos簡介
服務發(fā)現(xiàn)產(chǎn)品對比
目前市面上用的比較多的服務發(fā)現(xiàn)中心有:Nacos、Eureka、Consul和Zookeeper。
| 對比項目 | Naos | Eureka | Consul | Zookeeper |
|---|---|---|---|---|
| 一致性協(xié)議 | 支持AP和CP模型 | AP模型 | CP模型 | CP模型 |
| 健康檢查 | TCP/HTTP/MYSQL/Client Beat | Client Beat | TCP/HTTP/gRPC/Cmd | Keep Alive |
| 負載均衡策略 | 權重/metadata/Selector | Ribbon | Fabio | - |
| 雪崩保護 | 有 | 有 | 無 | 無 |
| 自動注銷實例 | 支持 | 支持 | 不支持 | 支持 |
| 訪問協(xié)議 | HTTP/DNS | HTTP | HTTP/DNS | TCP |
| 監(jiān)聽支持 | 支持 | 支持 | 支持 | 支持 |
| 多數(shù)據(jù)中心 | 支持 | 支持 | 支持 | 不支持 |
| 跨注冊中心同步 | 支持 | 不支持 | 支持 | 不支持 |
| SpringCloud集成 | 支持 | 支持 | 支持 | 不支持 |
| Dubbo集成 | 支持 | 不支持 | 不支持 | 支持 |
| k8s集成 | 支持 | 不支持 | 支持 | 不支持 |
Nacos簡介
Nacos是阿里的一個開源產(chǎn)品,它是針對微服務架構中的服務發(fā)現(xiàn)、配置管理、服務治理的綜合型解決方案。
官方是這樣說的:
Nacos 致力于幫助您發(fā)現(xiàn)、配置和管理微服務。Nacos 提供了一組簡單易用的特性集,幫助您實現(xiàn)動態(tài)服務 發(fā)現(xiàn)、服務配置管理、服務及流量管理。 Nacos 幫助您更敏捷和容易地構建、交付和管理微服務平臺。 Nacos 是構建以“服務”為中心的現(xiàn)代應用架構的服務基礎設施。
Nacos特性
Nacos主要提供以下四大功能:
1.服務發(fā)現(xiàn)與服務健康檢查
Nacos使服務更容易注冊,并通過DNS或HTTP接口發(fā)現(xiàn)其他服務,Nacos還提供服務的實時健康檢查,以防 止向不健康的主機或服務實例發(fā)送請求。
2.動態(tài)配置管理
動態(tài)配置服務允許您在所有環(huán)境中以集中和動態(tài)的方式管理所有服務的配置。Nacos消除了在更新配置時重新 部署應用程序,這使配置的更改更加高效和靈活。
3.動態(tài)DNS服務
Nacos提供基于DNS 協(xié)議的服務發(fā)現(xiàn)能力,旨在支持異構語言的服務發(fā)現(xiàn),支持將注冊在Nacos上的服務以 域名的方式暴露端點,讓三方應用方便的查閱及發(fā)現(xiàn)。
-
服務和元數(shù)據(jù)管理
Nacos 能讓您從微服務平臺建設的視角管理數(shù)據(jù)中心的所有服務及元數(shù)據(jù),包括管理服務的描述、生命周 期、服務的靜態(tài)依賴分析、服務的健康狀態(tài)、服務的流量管理、路由及安全策略。
這里1、3、4說明了服務發(fā)現(xiàn)的功能特性。
安裝Nacos Server
環(huán)境準備
Nacos 依賴 Java 環(huán)境來運行。如果您是從代碼開始構建并運行Nacos,還需要為此配置 Maven環(huán)境,請確保是在 以下版本環(huán)境中安裝使用:
1 64 bit OS,支持 Linux/Unix/Mac/Windows,推薦選用 Linux/Unix/Mac。
- 64 bit JDK 1.8+;
- Maven 3.2.x+;
下載源碼或者安裝包
你可以通過源碼和發(fā)行包兩種方式來獲取Nacos
從Github上下載源碼方式
git clone https://github.com/alibaba/nacos.git
cd nacos/
mvn ‐Prelease‐nacos clean install ‐U
ls ‐al distribution/target/
// change theversion/nacos/bin
下載編譯后壓縮包方式
最新穩(wěn)定版本
下載后解壓
unzip nacos‐server‐
version.tar.gz
cd nacos/bin
啟動服務器
nacos的默認端口是8848,需要保證8848默認端口沒有被其他進程占用
進入安裝程序的bin目錄
Linux/Unix/Mac啟動方式:
啟動命令(standalone代表著單機模式運行,非集群模式):
sh startup.sh -m standalone
如果您使用的是ubuntu系統(tǒng),或者運行腳本報錯提示[[符號找不到,可嘗試如下運行:
bash startup.sh -m standalone
Windows啟動方式:
啟動命令
cmd startup.cmd
或者雙擊startup.cmd運行文件。
啟動成功,可通過瀏覽器訪問 http://127.0.0.1:8848/nacos nacos控制臺界面
默認用戶名:nacos,默認密碼:nacos
外部數(shù)據(jù)庫支持
單機模式時nacos默認使用嵌入式數(shù)據(jù)庫實現(xiàn)數(shù)據(jù)的存儲,若想使用外部mysql存儲nacos數(shù)據(jù),需要進行以下步 驟:
1.安裝數(shù)據(jù)庫,版本要求:5.6.5+ ,mysql 8 以下 (在nacos1.4版本及以上已經(jīng)支持到mysql8.0.16)
2.初始化mysql數(shù)據(jù)庫,新建數(shù)據(jù)庫nacos_config,數(shù)據(jù)庫初始化文件:{nacoshome}/conf/application.properties文件,增加支持mysql數(shù)據(jù)源配置(目前只支持 mysql),添加mysql數(shù)據(jù)源的url、用戶名和密碼。
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=nacos_devtest
db.password=youdontknow
RESTful服務發(fā)現(xiàn)
測試環(huán)境
通過Spring Cloud Alibaba實現(xiàn)解決:
1、服務發(fā)現(xiàn)客戶端從服務發(fā)現(xiàn)中心獲取服務列表
2、服務消費方通過負載均衡獲取服務地址
在nacos-discovery父工程中添加依賴管理
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
分別在服務提供及服務消費工程中添加依賴,此依賴的作用是服務發(fā)現(xiàn)
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
服務注冊
在服務提供工程中配置nacos服務發(fā)現(xiàn)相關的配置:
spring:
application:
name: nacos‐restful‐provider
cloud:
nacos:
discovery:
server-addr: 172.16.27.3:8848
啟動nacos 啟動服務提供
觀察nacos服務列表,
nacos-restful-provider注冊成功
服務發(fā)現(xiàn)
在服務消費工程中配置nacos服務發(fā)現(xiàn)相關的配置
服務消費
#配置服務提供方的地址
provider:
address: 127.0.0.1:56010
spring:
application:
name: nacos-restful-consumer #服務名
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 #服務發(fā)現(xiàn)中心地址
Controll中遠程調(diào)用的代碼
@RestController
public class RestConsumerController {
//指定服務名
String serviceId = "nacos-restful-provider";
@Autowired
LoadBalancerClient loadBalancerClient;
@GetMapping("/service")
public String service(){
//遠程調(diào)用
RestTemplate template = new RestTemplate();
ServiceInstance choose = loadBalancerClient.choose(serviceId);
URI uri = choose.getUri();
String result = template.getForObject(uri+"/service",String.class);
return "消費了"+result;
}
}
執(zhí)行流程
1.服務方將自己注冊到服務注冊中心
2.服務消費方從注冊中心獲取服務地址
3.進行遠程調(diào)用
負載均衡
在RESTful服務發(fā)現(xiàn)的流程中,ServiceA通過負載均衡調(diào)用ServiceB
負載均衡就是將用戶請求(流量)通過一定的策略,分攤在多個服務實例上執(zhí)行,它是系統(tǒng)處理高并發(fā)、緩解網(wǎng)絡 壓力和進行服務端擴容的重要手段之一。它分為服務端負載均衡和客戶端負載均衡。
服務器端負載均衡:
在負載均衡器中維護一個可用的服務實例清單,當客戶端請求來臨時,負載均衡服務器按照某種配置好的規(guī)則(負載均衡算法)從可用服務實例清單中選取其一去處理客戶端的請求。這就是服務端負載均衡。
例如Nginx,通過Nginx進行負載均衡,客戶端發(fā)送請求至Nginx,Nginx通過負載均衡算法,在多個服務器 之間選擇一個進行訪問。即在服務器端再進行負載均衡算法分配。
客戶端服務負載均衡:
上邊使用的LoadBalancerClient就是一個客戶端負載均衡器,具體使用的是Ribbon客戶端負載均衡器。 Ribbon在發(fā)送請求前通過負載均衡算法選擇一個服務實例,然后進行訪問,這是客戶端負載均衡。即在客戶 端就進行負載均衡的分配。
Ribbon是一個客戶端負載均衡器,它的責任是從一組實例列表中挑選合適的實例,如何挑選?取決于負載均衡策略 。
Ribbon核心組件IRule是負載均衡策略接口
RoundRobinRule(默認):輪詢,即按一定的順序輪換獲取實例的地址。
RandomRule:隨機,即以隨機的方式獲取實例的地址。
AvailabilityFilteringRule: 會先過濾掉由于多次訪問故障而處于斷路器跳閘狀態(tài)的服務,以及并發(fā)的連接數(shù)量 超過閾值的服務,然后對剩余的服務列表按照輪詢策略進行訪問;
WeightedResponseTimeRule: 根據(jù)平均響應時間計算所有服務的權重,響應時間越快,服務權重越大,被選中的 機率越高; 剛啟動時,如果統(tǒng)計信息不足,則使用RoundRobinRule策略,等統(tǒng)計信息足夠時,會切換到 WeightedResponseTimeRule RetryRule: 先按照RoundRobinRule的策略獲取服務,如果獲取服務失敗,則在指定時間內(nèi)會進行重試,獲取可用 的服務; BestAvailableRule: 會先過濾掉由于多次訪問故障而處于斷路器跳閘狀態(tài)的服務,然后選擇一個并發(fā)量最小的 服務; ZoneAvoidanceRule: 默認規(guī)則,復合判斷server所在區(qū)域的性能和server的可用性選擇服務器;
修改負載均衡策略
nacos‐restful‐provider:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule