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