SpringCloud系列之Nacos應用篇


前言

原先項目是以SpringConfig作為項目配置中心組件,Eureka作為服務注冊發現組件,基本上就是SpringCloud全家桶,Eureka已經停更,所以前期調研可替換方案,主流替換方案有Consul/ZooKeeper/Nacos/Etcd等,網上資料也比較多,再加上之前有個項目用過Nacos商用產品,那就先試試Nacos,不得不說妙哉妙哉!!!

項目版本

spring-boot.version:2.2.5.RELEASE
spring-cloud.version:Hoxton.SR3
nacos.version:1.3.2

項目說明

項目模塊說明如下,目的是把紅框中的配置和服務注冊發現組件替換成Nacos。示例項目中通過網關轉發請求支付模塊對外接口,在該接口中又涉及到用戶模塊服務的調用,從而驗證配置是否正確。

啟動Nacos

1.下載Nacos服務
https://github.com/alibaba/nacos/releases/download/1.3.2/nacos-server-1.3.2.zip
如嫌下載慢,可關注本文下方微信公眾號二維碼,關注后回復“666”即可獲取開發常用工具包
2.解壓至本地目錄后,進入bin目錄執行startup.cmd腳本即可,啟動成功后如下圖,Linux環境下操作類似不做展開說明

啟動成功后通過瀏覽器訪問如下地址
http://localhost:8848/nacos
默認用戶/密碼:nacos/nacos
注意事項
Nacos1.3.2版本默認啟動模式是集群模式,本地測試需調整為單機模式,編輯startup.cmd文件將MODE值由“cluster”調整為“standalone”

set MODE="standalone"

項目調整

只涉及調整點說明,主要是將SpringCloud及Eureka相關依賴、配置調整成Nacos的就可以了,其余都不需要改動,非常nice。完整項目代碼請查看本文下方源碼鏈接

spring-cloud-gateway

pom.xml

<!--eureka服務注冊-->
<!--<dependency>-->
    <!--<groupId>org.springframework.cloud</groupId>-->
    <!--<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>-->
<!--</dependency>-->
<!-- nacos 注冊中心-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>2.1.0.RELEASE</version>
</dependency>

bootstrap.yml

server:
  port: 9005
spring:
  application:
    name: springcloud-gateway-service
  security:
    user:
      name: test
      password: 123456
  cloud:
    gateway:
      enabled: true  #開啟網關
      discovery:
        locator:
          enabled: true #開啟自動路由,以服務id建立路由,服務id默認大寫
          lower-case-service-id: true #服務id設置為小寫
# eureka:
#  client:
#    service-url:
#      defaultZone: http://localhost:9003/eureka/
#  instance:
#    prefer-ip-address: true
#    instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

pay-service

pom.xml

<!--eureka客戶端-->
<!--<dependency>-->
    <!--<groupId>org.springframework.cloud</groupId>-->
    <!--<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>-->
<!--</dependency>-->
<!--config客戶端-->
<!--<dependency>-->
    <!--<groupId>org.springframework.cloud</groupId>-->
    <!--<artifactId>spring-cloud-starter-config</artifactId>-->
<!--</dependency>-->
<!-- nacos 配置中心-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>2.1.0.RELEASE</version>
</dependency>
<!-- nacos 注冊中心-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>2.1.0.RELEASE</version>
</dependency>

bootstrap.properties

# 服務端口
server.port=9011
# 服務應用名稱
spring.application.name=pay-service

# 應用服務名稱
#spring.cloud.config.name=pay-service
# 對應git上分支名稱
#spring.cloud.config.label=master
# 對應配置文件上profiles參數項
#spring.cloud.config.profile=dev
# 開啟服務發現
#spring.cloud.config.discovery.enabled=true
# 配置Config服務應用名稱
#spring.cloud.config.discovery.service-id=config-server

# eureka服務端地址
#eureka.client.serviceUrl.defaultZone=http://localhost:9003/eureka/
#eureka.instance.prefer-ip-address=true
#eureka.instance.instance-id=${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}

# nacos配置中心
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.file-extension=properties

application.properties

# nacos服務發現
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

user-service

pom.xml

<!--eureka客戶端-->
<!--<dependency>-->
    <!--<groupId>org.springframework.cloud</groupId>-->
    <!--<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>-->
<!--</dependency>-->
<!--config客戶端-->
<!--<dependency>-->
    <!--<groupId>org.springframework.cloud</groupId>-->
    <!--<artifactId>spring-cloud-starter-config</artifactId>-->
<!--</dependency>-->

<!-- nacos 配置中心-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>2.1.0.RELEASE</version>
</dependency>
<!-- nacos 注冊中心-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>2.1.0.RELEASE</version>
</dependency>

bootstrap.properties

# 應用服務名稱
#spring.cloud.config.name=user-service
# 對應git上分支名稱
#spring.cloud.config.label=master
# 對應配置文件上profiles參數項
#spring.cloud.config.profile=dev
# 開啟服務發現
#spring.cloud.config.discovery.enabled=true
# 配置Config服務應用名稱
#spring.cloud.config.discovery.service-id=config-server

# eureka服務端地址
#eureka.client.serviceUrl.defaultZone=http://localhost:9003/eureka/
#eureka.instance.prefer-ip-address=true
#eureka.instance.instance-id=${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}

# nacos配置中心
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.group=DEFAULT_GROUP
spring.cloud.nacos.config.file-extension=properties

application.properties

# nacos服務發現
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

Nacos控制台

啟動各個服務后,就大功告成啦,接下來讓我們看下Nacos控制台吧
在服務管理中我們可以看到已經注冊進來的服務,服務間就可以互相調用啦,如下圖

看到這里好像配置中心沒啥體現,接下來就說說,當前項目中僅僅只有user-service模塊使用到配置中心,針對數據庫的配置信息使用了,如下

spring.datasource.name=${user-service.datasource.name}
spring.datasource.type=${user-service.datasource.type}
spring.datasource.url=${user-service.datasource.url}
spring.datasource.username=${user-service.datasource.username}
spring.datasource.password=${user-service.datasource.password}
spring.datasource.driver-class-name=${user-service.datasource.driver-class-name}

那具體要怎么配置呢,接着往下看

Data ID:user-service.properties(下面會進行解釋)
Group:DEFAULT_GROUP
配置格式選擇Properties
配置內容:

user-service.datasource.name=user-service-datasource
user-service.datasource.type=com.alibaba.druid.pool.DruidDataSource
user-service.datasource.url=jdbc:mysql://127.0.0.1:3306/spring-cloud?useUnicode=true&amp;characterEncoding=utf8&amp;zeroDateTimeBehavior=convertToNull&amp;transformedBitIsBoolean=true&amp;useSSL=false&amp;allowMultiQueries=true&amp;autoReconnect=true
user-service.datasource.username=root
user-service.datasource.password=root
user-service.datasource.driver-class-name=com.mysql.jdbc.Driver

重點說下Data ID,在 Nacos Spring Cloud 其完整的格式如下

${prefix}-${spring.profile.active}.${file-extension}

prefix 默認為 spring.application.name 的值,也可以通過配置項 spring.cloud.nacos.config.prefix來配置。
spring.profile.active 即為當前環境對應的 profile。
注意:當 spring.profile.active 為空時,對應的連接符 - 也將不存在,dataId 的拼接格式變成如下

${prefix}.${file-extension}

file-exetension 為配置內容的數據格式,可以通過配置項 spring.cloud.nacos.config.file-extension 來配置。
了解了dataId的格式,那自然也明白了上述配置項中為什么用user-service.properties命名,添加完該配置項后,我們來請求下接口,請求接口地址如下
直接請求支付模塊接口地址
http://localhost:9011/pay/get
經網關轉發后接口地址
http://localhost:9005/pay-service/pay/get
最終都會得到如下響應數據
在這里插入圖片描述
通過訪問以下接口獲取配置項數據庫連接地址
http://localhost:9005/user-service/user/getDatasourceUrl

至此Nacos已全面替換Eureka和Config。中途有個插曲,替換成Nacos后,網關自動路由居然失效了,一直提示404,反復折騰來折騰去的,最終在Nacos Github上看到一個Issues
https://github.com/alibaba/nacos/issues/2302
在這里插入圖片描述
於是馬上調整至如下版本進行嘗試,重新編譯后請求訪問,一切都是那么的熟悉,這感覺真好

spring-boot.version:2.1.16.RELEASE
spring-cloud.version:Greenwich.SR3

測試成功后,看了下spring-cloud-alibaba v2.2.1.RELEASE已經發布了,那豈不是解決這個問題了,試一試不就知道了,於是又把Spring boot,Spring cloud版本切換至本文最初的配置,另外將nacos版本升級至2.2.1版本,重新編譯運行,請求一切正常。

<!-- nacos 配置中心-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>2.2.1.RELEASE</version>
</dependency>
<!-- nacos 注冊中心-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>2.2.1.RELEASE</version>
</dependency>

參考資料

Nacos官網

Nacos Github

系列文章

SpringCloud系列之配置中心(Config)使用說明

SpringCloud系列之服務注冊發現(Eureka)應用篇

SpringCloud系列之網關(Gateway)應用篇

SpringCloud系列之集成Dubbo應用篇

SpringCloud系列之集成分布式事務Seata應用篇

項目源碼

在這里插入圖片描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM