SpringCloudAlibaba之服務(wù)發(fā)現(xiàn)組件-Nacos

服務(wù)發(fā)現(xiàn)

為了實現(xiàn)多個微服務(wù)之間的調(diào)用,我們除了需要Feign這種調(diào)用組件外還得依賴服務(wù)發(fā)現(xiàn)組件。主要的原因是每個微服務(wù)所在的機器ip并非總是固定的,并且每個微服務(wù)都可能部署多個實例在不同的機器上,所以我們不能把依賴的微服務(wù)ip地址寫在代碼或配置文件里,我們需要有個組件去動態(tài)的管理,這就是為什么微服務(wù)架構(gòu)里服務(wù)發(fā)現(xiàn)功能是必須的。

創(chuàng)新互聯(lián)公司:從2013年創(chuàng)立為各行業(yè)開拓出企業(yè)自己的“網(wǎng)站建設(shè)”服務(wù),為上1000家公司企業(yè)提供了專業(yè)的成都網(wǎng)站設(shè)計、做網(wǎng)站、網(wǎng)頁設(shè)計和網(wǎng)站推廣服務(wù), 按需策劃由設(shè)計師親自精心設(shè)計,設(shè)計的效果完全按照客戶的要求,并適當(dāng)?shù)奶岢龊侠淼慕ㄗh,擁有的視覺效果,策劃師分析客戶的同行競爭對手,根據(jù)客戶的實際情況給出合理的網(wǎng)站構(gòu)架,制作客戶同行業(yè)具有領(lǐng)先地位的。

那么服務(wù)發(fā)現(xiàn)組件是怎么實現(xiàn)服務(wù)發(fā)現(xiàn)的呢?我們以大家比較熟悉的MySQL來做類比,通過MySQL簡單說明一下服務(wù)發(fā)現(xiàn)機制的實現(xiàn)。如下圖:
Spring Cloud Alibaba之服務(wù)發(fā)現(xiàn)組件 - Nacos

簡單說明一下什么是服務(wù)提供者與服務(wù)消費者:

  • 服務(wù)提供者:服務(wù)的被調(diào)用方(即:為其他微服務(wù)提供接口的微服務(wù))
  • 服務(wù)消費者:服務(wù)的調(diào)用方(即:調(diào)用其他微服務(wù)接口的微服務(wù))
  • 例如:訂單服務(wù)需要調(diào)用用戶服務(wù)的接口,那么訂單服務(wù)就是服務(wù)消費者,而用戶服務(wù)則是服務(wù)提供者
  • 服務(wù)提供者與服務(wù)消費者實際描述的是微服務(wù)之間的調(diào)用關(guān)系,一般都是成對出現(xiàn)的

當(dāng)微服務(wù)啟動的時候會向服務(wù)發(fā)現(xiàn)組件注冊自身信息,在上圖中就類似于向MySQL發(fā)送一條insert語句,將服務(wù)的元數(shù)據(jù)如服務(wù)名稱、ip地址及服務(wù)狀態(tài)等信息插入到MySQL中,如上圖的registry表數(shù)據(jù)所示,這個過程稱之為服務(wù)注冊,所以服務(wù)發(fā)現(xiàn)組件內(nèi)部會都維護類似于這樣的一張注冊表。

微服務(wù)在注冊完成后,會讀取服務(wù)發(fā)現(xiàn)組件中保存的其他微服務(wù)的元數(shù)據(jù)并緩存一份到本地,就類似于向MySQL發(fā)送一條select all語句。這樣在調(diào)用其他服務(wù)的時候,就不需要每次都去服務(wù)發(fā)現(xiàn)組件上查詢,而是從本地緩存去查找調(diào)用地址,這樣可以減輕服務(wù)發(fā)現(xiàn)組件的壓力。所以上圖中的調(diào)用箭頭并沒有指向服務(wù)發(fā)現(xiàn)組件,而是直接指向服務(wù)提供者。這樣的好處是哪怕是服務(wù)發(fā)現(xiàn)組件掛掉了,還能從本地緩存中獲取其他微服務(wù)的調(diào)用地址。到這一步微服務(wù)之間就可以互相發(fā)現(xiàn)了,即完成基本的服務(wù)發(fā)現(xiàn)

但微服務(wù)有可能會掛掉或下線,此時其他服務(wù)不應(yīng)該去發(fā)現(xiàn)一個不存在的服務(wù)。所以每個服務(wù)啟動且向服務(wù)發(fā)現(xiàn)組件注冊完成之后,都會通過心跳機制告知存活狀態(tài)。上圖中用last_heartbeat字段表示,若某個服務(wù)在超過一定的時間都沒有發(fā)送心跳包的話,就會被服務(wù)發(fā)現(xiàn)組件檢測到,此時就會刪除注冊表里該服務(wù)的注冊信息,并通知其他服務(wù)更新本地緩存(若有新注冊的服務(wù)也會通知其他服務(wù)更新本地緩存)。


搭建Nacos Server

關(guān)于什么是Nacos,官方文檔已經(jīng)描述得很詳細了,Nacos官方文檔地址如下:

https://nacos.io/zh-cn/docs/what-is-nacos.html

所以這里只是簡單概述一下,Nacos與Eureka一樣,是服務(wù)發(fā)現(xiàn)組件,同時也是配置中心。Nacos解決了兩個問題,一是服務(wù)A如何找到服務(wù)B;二是管理微服務(wù)的配置,讓一個微服務(wù)的所有實例的配置都統(tǒng)一,并且可以實現(xiàn)配置修改后自動刷新等。

理論介紹也說得差不多了,本小節(jié)我們來動手搭建一個Nacos Server。過程很簡單首先需要下載一個Nacos,下載地址如下:

https://github.com/alibaba/nacos/releases

然后我們需要選擇一個合適的版本下載,即Nacos Server版本應(yīng)盡量與Client端的版本對應(yīng)。至于Client的版本我們可以到工程的pom.xml文件中找到Spring Cloud Alibaba的依賴管理項點擊進去即可查看到:
Spring Cloud Alibaba之服務(wù)發(fā)現(xiàn)組件 - Nacos

如下可以看到Nacos Client的版本為1.0.0,所以與之對應(yīng)選擇1.0.0版本的Nacos Server進行下載:
Spring Cloud Alibaba之服務(wù)發(fā)現(xiàn)組件 - Nacos

注:我這里使用的Spring Cloud版本是Greenwich.SR1,Spring Cloud Alibaba的版本是0.9.0.RELEASE

由于不是生產(chǎn)環(huán)境所用,其實也無需嚴格選擇對應(yīng)的版本,只要能用就可以了,所以我這里選擇下載最新的1.1.0版本(經(jīng)過測試可用):
Spring Cloud Alibaba之服務(wù)發(fā)現(xiàn)組件 - Nacos

下載并解壓后進入bin目錄,雙擊startup.cmd,或在命令行中輸入cmd startup.cmd即可運行Nacos Server:
Spring Cloud Alibaba之服務(wù)發(fā)現(xiàn)組件 - Nacos

啟動成功:
Spring Cloud Alibaba之服務(wù)發(fā)現(xiàn)組件 - Nacos

使用瀏覽器訪問localhost:8848進入Nacos Server的管理頁面,此時需要輸入賬戶密碼,默認的賬戶密碼都是nacos:
Spring Cloud Alibaba之服務(wù)發(fā)現(xiàn)組件 - Nacos

登錄成功后,頁面如下:
Spring Cloud Alibaba之服務(wù)發(fā)現(xiàn)組件 - Nacos

該管理頁面支持中英文,可在右上角點擊切換:
Spring Cloud Alibaba之服務(wù)發(fā)現(xiàn)組件 - Nacos

官方文檔如下:

https://nacos.io/zh-cn/docs/quick-start.html


將微服務(wù)注冊到Nacos

在上一小節(jié)中,我們已經(jīng)完成了Nacos Server的搭建,而這一小節(jié)將演示如何將微服務(wù)注冊到Nacos。我現(xiàn)在有一個用戶中心微服務(wù),其pom.xml文件如下,包含了Spring Cloud Alibaba及Nacos Client依賴,Spring Boot版本為2.1.6.RELEASE:

<dependencies>
    ...

    <!-- Nacos Client -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <!--整合Spring Cloud-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Greenwich.SR1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!--整合Spring Cloud Alibaba-->
        <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>
    </dependencies>
</dependencyManagement>

在配置文件中配置一下nacos server的地址及端口:

spring:
  cloud:
    nacos:
      discovery:
        # 指定nacos server的地址
        server-addr: 127.0.0.1:8848
  application:
    # 服務(wù)名稱,必須的配置項,否則不會向nacos注冊
    name: user-center

  ...  

配置完成后啟動項目,然后到nacos server的管理頁面的服務(wù)列表上查看是否注冊成功,注冊成功的話會顯示在服務(wù)列表里,如下:
Spring Cloud Alibaba之服務(wù)發(fā)現(xiàn)組件 - Nacos

點擊詳情可以看到詳細信息:
Spring Cloud Alibaba之服務(wù)發(fā)現(xiàn)組件 - Nacos

經(jīng)過以上這幾個步驟,就可以非常簡單地整合Nacos Client,并將微服務(wù)注冊到Nacos Server上。通過同樣的步驟,我將另一個內(nèi)容中心微服務(wù)也注冊到Nacos Server上。我們來寫一個簡單的測試用例,看看在內(nèi)容中心上是否能發(fā)現(xiàn)用戶中心,代碼如下:

@Slf4j
@SpringBootTest
@RunWith(SpringRunner.class)
public class DiscoveryClientTests {

    @Autowired
    private DiscoveryClient discoveryClient;

    /**
     * 測試服務(wù)發(fā)現(xiàn),證明內(nèi)容中心能找到用戶中心
     */
    @Test
    public void getServiceInstancesTest(){
        // 獲取用戶中心微服務(wù)的所有實例信息
        List<ServiceInstance> instances = discoveryClient.getInstances("user-center");
        // 以json格式打印出來
        log.info(JsonUtil.obj2JsonPretty(instances));
    }
}

控制臺輸出的json信息如下,證明通過服務(wù)發(fā)現(xiàn)組件能讓內(nèi)容中心總是能找到用戶中心:

[ {
  "serviceId" : "user-center",
  "host" : "192.168.190.1",
  "port" : 8080,
  "secure" : false,
  "metadata" : {
    "nacos.instanceId" : "192.168.190.1#8080#DEFAULT#DEFAULT_GROUP@@user-center",
    "nacos.weight" : "1.0",
    "nacos.cluster" : "DEFAULT",
    "nacos.healthy" : "true",
    "preserved.register.source" : "SPRING_CLOUD"
  },
  "uri" : "http://192.168.190.1:8080",
  "scheme" : null,
  "instanceId" : null
} ]

Nacos服務(wù)發(fā)現(xiàn)的領(lǐng)域模型

下圖整理了Nacos服務(wù)發(fā)現(xiàn)的領(lǐng)域模型,我們將圍繞該圖進行介紹:
Spring Cloud Alibaba之服務(wù)發(fā)現(xiàn)組件 - Nacos

1、上圖最外層的是Namespace,對應(yīng)管理界面的命名空間,如下:
Spring Cloud Alibaba之服務(wù)發(fā)現(xiàn)組件 - Nacos

Namespace主要用作隔離,默認為public,例如我們有三個環(huán)境:開發(fā)、測試及生產(chǎn)環(huán)境,那么就可以創(chuàng)建三個Namespace,不同的Namespace之間是互相隔離的。

舉個例子,我們可以來創(chuàng)建一個開發(fā)環(huán)境專用的命名空間:
Spring Cloud Alibaba之服務(wù)發(fā)現(xiàn)組件 - Nacos

創(chuàng)建完成后可以看到每個命名空間都會有自己的唯一命名空間id:
Spring Cloud Alibaba之服務(wù)發(fā)現(xiàn)組件 - Nacos

那么微服務(wù)要如何注冊到指定的命名空間呢?很簡單,在配置文件中通過namespace配置項指定即可:

spring:
  cloud:
    nacos:
      discovery:
        # 指定nacos server的地址
        server-addr: 127.0.0.1:8848
        # 配置命名空間
        namespace: 4a557407-c2c8-4524-97a0-17aa3c836407

  ...      

配置完成后重啟項目,此時該服務(wù)不再是注冊到之前的public命名空間,而是注冊到我們剛剛創(chuàng)建的dev命名空間,此時在dev下的微服務(wù)是看不到public下的微服務(wù)的,即實現(xiàn)了環(huán)境隔離了:
Spring Cloud Alibaba之服務(wù)發(fā)現(xiàn)組件 - Nacos


2、在Namespace之下是Group服務(wù)分組,默認的Group是DEFAULT_GROUP。我們可以在服務(wù)列表中看到:
Spring Cloud Alibaba之服務(wù)發(fā)現(xiàn)組件 - Nacos

Group可以將不同的微服務(wù)劃分到同一個分組里,Group可以讓我們方便去分組管理微服務(wù)。但需要注意的是,在目前的Spring Cloud Alibaba版本,并沒有用上這個Group,應(yīng)該會在未來的版本上支持。


3、而Group下面是Service,Service既是微服務(wù),例如用戶微服務(wù)、訂單微服務(wù)等。每個Service可以包含多個Cluster(集群),Cluster是對指定微服務(wù)的一個虛擬劃分,默認為DEFAULT。比方說公司內(nèi)有北京機房、上海機房的服務(wù)器,那么為了異地容災(zāi),用戶中心微服務(wù)就可能會被同時部署在北京機房和上海機房。這時候我們就可以為北京機房的用戶中心微服務(wù)實例劃分到一個集群里并且起一個集群名稱,而上海機房的用戶中心微服務(wù)實例同理。將微服務(wù)實例劃分到一個集群后,我們還可以實現(xiàn)類似于讓上海機房里的微服務(wù)盡量調(diào)用同機房內(nèi)的其他微服務(wù),這樣在容災(zāi)的同時還可以提升性能。

關(guān)于集群我們可以直接在配置文件中配置,而不用像命名空間那樣需要提前創(chuàng)建,如下:

spring:
  cloud:
    nacos:
      discovery:
        # 指定nacos server的地址
        server-addr: 127.0.0.1:8848
        # 配置集群名稱,名稱可以任意
        cluster-name: BJ

  ...      

配置完成后重啟項目,此時可以看到該微服務(wù)實例處于BJ集群下,而不是處于之前默認的DEFAULT集群下:
Spring Cloud Alibaba之服務(wù)發(fā)現(xiàn)組件 - Nacos

4、Cluster里是Instance,即上面所提到的微服務(wù)實例

關(guān)于這些概念的官方文檔地址如下:

https://nacos.io/zh-cn/docs/concepts.html


Nacos元數(shù)據(jù)

什么是Nacos元數(shù)據(jù),官方文檔描述如下:

Nacos數(shù)據(jù)(如配置和服務(wù))描述信息,如服務(wù)版本、權(quán)重、容災(zāi)策略、負載均衡策略、鑒權(quán)配置、各種自定義標(biāo)簽 (label),從作用范圍來看,分為服務(wù)級別的元信息、集群的元信息及實例的元信息。

  • 服務(wù)級別的元信息在服務(wù)詳情中展示
  • 集群的元信息在集群配置中展示
  • 實例的元信息在集群實例表內(nèi)展示

元數(shù)據(jù)作用:

  • 提供描述信息
  • 讓微服務(wù)調(diào)用更靈活
    • 例如實現(xiàn)微服務(wù)的版本控制;當(dāng)有多個版本的微服務(wù)共存時就可以通過元數(shù)據(jù)進行版本控制

配置元數(shù)據(jù)的兩種方式:

  1. 在Nacos Server的管理頁面設(shè)置;以服務(wù)的元數(shù)據(jù)示例,在服務(wù)詳情頁面點擊編輯服務(wù)后,在元數(shù)據(jù)這欄輸入json格式的元數(shù)據(jù)即可:
    Spring Cloud Alibaba之服務(wù)發(fā)現(xiàn)組件 - Nacos

  2. 通過配置文件指定;如下示例:
    spring:
    cloud:
    nacos:
      discovery:
        # 指定nacos server的地址
        server-addr: 127.0.0.1:8848
        # 這種方式配置的是實例級別的元數(shù)據(jù)
        metadata:
          # k-v形式,k和v都可以自定義
          instance: c
          test: a
          version: v1

配置完成后重啟項目,可以看到配置文件中所配置的實例級別元數(shù)據(jù):
Spring Cloud Alibaba之服務(wù)發(fā)現(xiàn)組件 - Nacos

當(dāng)前文章:SpringCloudAlibaba之服務(wù)發(fā)現(xiàn)組件-Nacos
文章分享:http://muchs.cn/article42/jojpec.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)建站公司、虛擬主機、微信小程序、網(wǎng)站改版

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)