Spring Cloud整合Nacos作為註冊中心

語言: CN / TW / HK

前言

前面我們已經介紹過如何準備MySQL 以及Nacos 環境了,接下來就讓我們繼續接著上一講開始使用Spring Cloud Alibaba 整合Nacos 作為註冊中心吧

Nacos功能介紹:註冊中心(AP和CP)

服務發現是微服務架構體系中最關鍵的元件之一。如果嘗試著用手動的方式來給每一個客戶端來配置所有服務提供者的服務列表是一件非常困難的事,而且也不利於 服務的動態擴縮容。Nacos Discovery Starter 可以幫助您將服務自動註冊到 Nacos 服務端並且能夠動態感知和重新整理某個服務例項的服務列表。除此之外,Nacos Discovery Starter 也將服務例項自身的一些元資料資訊-例如 host,port,健康檢查URL,主頁等註冊到 Nacos

Nacos 最為核心功能:服務治理,隨著微服務概念的流行,越來越多的系統被拆分成了多個服務,每個服務進行分散式部署,又因為服務與服務之間可能會互相呼叫,為了更好的管理服務與服務之間的呼叫關係,那麼就需要一個註冊中心來註冊這些服務,消費者只需要拉取對應的服務列表,然後選擇對應的負載均衡策略,選擇其中一個服務呼叫就是

常用的服務註冊中心有:Zookeeper Consul Eureka Nacos ,今天我們主要介紹Nacos

Nacos 的功能非常強大,也比較容易使用,支援APCP 模型(相對於Eureka 只支援AP 模型、Zookeeper 只支援CP 模型、Consul 只支援CP 來說是一個優勢),而且Nacos 效能也非常出色,未來註冊中心大概率將是Nacos 的天下,因為Eureka 從2.X版本開始已經閉源了,並且Eureka 服務註冊時延比Nacos 大得多,而ZookeeperCP 架構,雖然極大可能保證了資料的強一致性,但是很大程度上犧牲了可用性,對於註冊中心來說,絕大部分場景下對可用性的需求要大於一致性(即使叢集節點間資料暫時不一致,其實並不影響本次請求的呼叫,因為還有負載策略重試其它機器,而且最終叢集節點間資料最終也會一致,對於Nacos 來說不一致的時間最多也就短暫的幾秒,完全可以接受),所以未來Nacos 大概率會替代其它註冊中心框架成為主流。

準備父工程

  1. 建立一個Maven專案,如下圖所示,選好你的jdk版本,併為專案命名

image-20220825122410554

  1. 管理專案依賴

```xml

4.0.0

<parent>
    <artifactId>spring-boot-starter-parent</artifactId>
    <groupId>org.springframework.boot</groupId>
    <version>2.7.0</version>
</parent>

<groupId>cuit.epoch.pymjl</groupId>
<artifactId>cloud-learn</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>

<properties>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <skipTests>true</skipTests>
    <spring-boot.version>2.7.0</spring-boot.version>
    <spring-cloud.version>2021.0.3</spring-cloud.version>
    <spring-cloud-alibaba.version>2021.0.1.0</spring-cloud-alibaba.version>
    <spring-cloud-starter-oauth2.version>2.2.5.RELEASE</spring-cloud-starter-oauth2.version>
    <druid.version>1.2.9</druid.version>
    <hutool.version>5.8.0</hutool.version>
    <mysql-connector.version>8.0.29</mysql-connector.version>
    <spring-data-commons.version>2.7.0</spring-data-commons.version>
    <jjwt.version>0.9.1</jjwt.version>
    <aliyun-oss.version>2.5.0</aliyun-oss.version>
    <logstash-logback.version>5.3</logstash-logback.version>
    <admin-starter-server.version>2.7.0</admin-starter-server.version>
    <minio.version>8.4.1</minio.version>
    <knife4j.version>3.0.3</knife4j.version>
    <nimbus-jose-jwt.version>9.23</nimbus-jose-jwt.version>
    <mybatis-plus.version>3.5.1</mybatis-plus.version>
    <velocity-engine-core.version>2.3</velocity-engine-core.version>
    <guava.version>31.0.1-jre</guava.version>
</properties>

<dependencyManagement>
    <dependencies>
        <!--Spring Cloud 相關依賴-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!--Spring Cloud Alibaba 相關依賴-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>${spring-cloud-alibaba.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!--整合druid連線池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>${druid.version}</version>
        </dependency>
        <!--Hutool Java工具包-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>${hutool.version}</version>
        </dependency>
        <!--Knife4j API文件生產工具-->
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-micro-spring-boot-starter</artifactId>
            <version>${knife4j.version}</version>
        </dependency>
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-spring-boot-starter</artifactId>
            <version>${knife4j.version}</version>
        </dependency>
        <!--Mysql資料庫驅動-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql-connector.version}</version>
        </dependency>
        <!--SpringData工具包-->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-commons</artifactId>
            <version>${spring-data-commons.version}</version>
        </dependency>
        <!--JWT(Json Web Token)登入支援-->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>${jjwt.version}</version>
        </dependency>
        <!--JWT(Json Web Token)登入支援-->
        <dependency>
            <groupId>com.nimbusds</groupId>
            <artifactId>nimbus-jose-jwt</artifactId>
            <version>${nimbus-jose-jwt.version}</version>
        </dependency>
        <!-- 阿里雲OSS -->
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>${aliyun-oss.version}</version>
        </dependency>
        <!--整合logstash-->
        <dependency>
            <groupId>net.logstash.logback</groupId>
            <artifactId>logstash-logback-encoder</artifactId>
            <version>${logstash-logback.version}</version>
        </dependency>
        <!--整合SpringBoot Admin監控-->
        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-server</artifactId>
            <version>${admin-starter-server.version}</version>
        </dependency>
        <!--MinIO JAVA SDK-->
        <dependency>
            <groupId>io.minio</groupId>
            <artifactId>minio</artifactId>
            <version>${minio.version}</version>
        </dependency>
        <!--mybatis-plus相關-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>${mybatis-plus.version}</version>
        </dependency>
        <!--mybatis-plus程式碼生成器-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>${mybatis-plus.version}</version>
        </dependency>
        <!--mybatis-plus程式碼生成器引擎-->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>${velocity-engine-core.version}</version>
        </dependency>
        <!--google工具包,jwt工具類會用到-->
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>${guava.version}</version>
        </dependency>
    </dependencies>
</dependencyManagement>

```

  • 這個pom因為父工程,所以需要設定<packaging>pom</packaging>
  • 注意使用dependencyManagement ,實際並沒有匯入依賴,只是控制子工程的依賴版本

準備專案的通用模組

  1. 建立一個其他服務用到的通用模組common-utils
  2. 匯入對應的依賴

  3. 編寫一些工具類,主要是一些返回類以及一些常量,具體程式碼請看專案原始碼

image-20220825122905233

建立一個UserService

  1. 通用模組建立好了之後我們再建立一個使用者服務
  2. 匯入依賴

xml <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>

  1. 編寫yml

yml server: port: 8081 spring: application: name: user-service cloud: nacos: discovery: server-addr: 192.168.199.128

  1. 啟動專案

image-20220825192905741

  1. 登入Nacos 後臺檢視服務註冊情況

image-20220825193046818

如圖所示,user-service 已經成功註冊到Nacos 中啦

  1. Nacos 的一些配置選項:

| 配置項 | Key | 預設值 | 說明 | | :-------------------: | :----------------------------------------------: | :--------------------------: | :----------------------------------------------------------: | | 服務端地址 | spring.cloud.nacos.discovery.server-addr | | Nacos Server 啟動監聽的ip地址和埠 | | 服務名 | spring.cloud.nacos.discovery.service | ${spring.application.name} | 給當前的服務命名 | | 服務分組 | spring.cloud.nacos.discovery.group | DEFAULT_GROUP | 設定服務所處的分組 | | 權重 | spring.cloud.nacos.discovery.weight | 1 | 取值範圍 1 到 100,數值越大,權重越大 | | 網絡卡名 | spring.cloud.nacos.discovery.network-interface | | 當IP未配置時,註冊的IP為此網絡卡所對應的IP地址,如果此項也未配置,則預設取第一塊網絡卡的地址 | | 註冊的IP地址 | spring.cloud.nacos.discovery.ip | | 優先順序最高 | | 註冊的埠 | spring.cloud.nacos.discovery.port | -1 | 預設情況下不用配置,會自動探測 | | 名稱空間 | spring.cloud.nacos.discovery.namespace | | 常用場景之一是不同環境的註冊的區分隔離,例如開發測試環境和生產環境的資源(如配置、服務)隔離等。 | | AccessKey | spring.cloud.nacos.discovery.access-key | | 當要上阿里雲時,阿里雲上面的一個雲賬號名 | | SecretKey | spring.cloud.nacos.discovery.secret-key | | 當要上阿里雲時,阿里雲上面的一個雲賬號密碼 | | Metadata | spring.cloud.nacos.discovery.metadata | | 使用Map格式配置,使用者可以根據自己的需要自定義一些和服務相關的元資料資訊 | | 日誌檔名 | spring.cloud.nacos.discovery.log-name | | | | 叢集 | spring.cloud.nacos.discovery.cluster-name | DEFAULT | 配置成Nacos叢集名稱 | | 接入點 | spring.cloud.nacos.discovery.enpoint | UTF-8 | 地域的某個服務的入口域名,通過此域名可以動態地拿到服務端地址 | | 是否整合Ribbon | ribbon.nacos.enabled | true | 一般都設定成true即可 | | 是否開啟Nacos Watch | spring.cloud.nacos.discovery.watch.enabled | true | 可以設定成false來關閉 watch |

專案原始碼:gitee github