1. 程式人生 > >SpringCloud系列之Nacos應用篇

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。示例專案中通過閘道器轉發請求支付模組對外介面,在該介面中又涉及到使用者模組服務的呼叫,從而驗證配置是否正確。 ![](https://img2020.cnblogs.com/blog/451497/202008/451497-20200828090407354-75651305.png) ## 啟動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環境下操作類似不做展開說明 ![](https://img2020.cnblogs.com/blog/451497/202008/451497-20200828090426572-1350164963.png) 啟動成功後通過瀏覽器訪問如下地址 http://localhost:8848/nacos 預設使用者/密碼:nacos/nacos 注意事項 Nacos1.3.2版本預設啟動模式是叢集模式,本地測試需調整為單機模式,編輯startup.cmd檔案將MODE值由“cluster”調整為“standalone” ```bash set MODE="standalone" ``` ## 專案調整 只涉及調整點說明,主要是將SpringCloud及Eureka相關依賴、配置調整成Nacos的就可以了,其餘都不需要改動,非常nice。完整專案程式碼請檢視本文下方原始碼連結 ### spring-cloud-gateway pom.xml ```java com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery 2.1.0.RELEASE ``` bootstrap.yml ```yaml 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 ```java com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config 2.1.0.RELEASE com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery 2.1.0.RELEASE ``` bootstrap.properties ```java # 服務埠 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 ```java # nacos服務發現 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 ``` ### user-service pom.xml ```java com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config 2.1.0.RELEASE com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery 2.1.0.RELEASE ``` bootstrap.properties ```java # 應用服務名稱 #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 ```java # nacos服務發現 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 ``` ### Nacos控制檯 啟動各個服務後,就大功告成啦,接下來讓我們看下Nacos控制檯吧 在服務管理中我們可以看到已經註冊進來的服務,服務間就可以互相呼叫啦,如下圖 ![](https://img2020.cnblogs.com/blog/451497/202008/451497-20200828090529194-6006802.png) 看到這裡好像配置中心沒啥體現,接下來就說說,當前專案中僅僅只有user-service模組使用到配置中心,針對資料庫的配置資訊使用了,如下 ```java 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} ``` 那具體要怎麼配置呢,接著往下看 ![](https://img2020.cnblogs.com/blog/451497/202008/451497-20200828090732480-1272043035.png) Data ID:user-service.properties(下面會進行解釋) Group:DEFAULT_GROUP 配置格式選擇Properties 配置內容: ```java 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&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&useSSL=false&allowMultiQueries=true&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 其完整的格式如下 ```java ${prefix}-${spring.profile.active}.${file-extension} ``` prefix 預設為 spring.application.name 的值,也可以通過配置項 spring.cloud.nacos.config.prefix來配置。 spring.profile.active 即為當前環境對應的 profile。 注意:當 spring.profile.active 為空時,對應的連線符 - 也將不存在,dataId 的拼接格式變成如下 ```java ${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 最終都會得到如下響應資料 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200827170844749.png#pic_center) 通過訪問以下介面獲取配置項資料庫連線地址 http://localhost:9005/user-service/user/getDatasourceUrl ![](https://img2020.cnblogs.com/blog/451497/202008/451497-20200828091043430-1120561283.png) 至此Nacos已全面替換Eureka和Config。中途有個插曲,替換成Nacos後,閘道器自動路由居然失效了,一直提示404,反覆折騰來折騰去的,最終在Nacos Github上看到一個Issues https://github.com/alibaba/nacos/issues/2302 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200827172120522.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d5YjM4Nzk0NjcxNQ==,size_16,color_FFFFFF,t_70#pic_center) 於是馬上調整至如下版本進行嘗試,重新編譯後請求訪問,一切都是那麼的熟悉,這感覺真好 ```java 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版本,重新編譯執行,請求一切正常。 ```java com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config 2.2.1.RELEASE
com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery 2.2.1.RELEASE ``` # 參考資料 [Nacos官網](https://nacos.io/zh-cn/index.html) [Nacos Github](https://github.com/alibaba/nacos) ## 系列文章 [SpringCloud系列之配置中心(Config)使用說明](https://www.cnblogs.com/chinaWu/p/12547992.html) [SpringCloud系列之服務註冊發現(Eureka)應用篇](https://www.cnblogs.com/chinaWu/p/12589066.html) [SpringCloud系列之閘道器(Gateway)應用篇](https://www.cnblogs.com/chinaWu/p/12731796.html) [SpringCloud系列之整合Dubbo應用篇](https://www.cnblogs.com/chinaWu/p/12818661.html) [SpringCloud系列之整合分散式事務Seata應用篇](https://www.cnblogs.com/chinaWu/p/13255200.html) [專案原始碼](https://gitee.com/wuyubin/SpringCloudDemo) ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200419143136144.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d5YjM4Nzk0NjcxNQ==,size_16,color_FFFFFF,t_70#pic_