微服務:Nacos服務發(fā)現(xiàn)

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)。

  1. 服務和元數(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。

  1. 64 bit JDK 1.8+;
    1. 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 the version to your actual path cd distribution/target/nacos‐server‐version/nacos/bin

下載編譯后壓縮包方式
最新穩(wěn)定版本
下載后解壓

unzip nacos‐server‐version.zip 或者 tar ‐xvf 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/nacos- mysql.sql 3.修改{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
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容