Spring Boot 2.x 基礎案例:整合Dubbo 2.7.3+Nacos1.1.3(配置中心)
本文原創首發於公眾號:Java技術乾貨
1、概述
本文將Nacos作為配置中心,實現配置外部化,動態更新。這樣做的優點:不需要重啟應用,便可以動態更新應用裡的配置資訊。在如今流行的微服務應用下,將應用的配置統一管理,顯得尤為重要。
上一篇寫了《Spring Boot 2.x 基礎案例:整合Dubbo 2.7.3+Nacos1.1.3(最新版)》https://www.jianshu.com/p/b0dddce1d404,在文章中,nacos的角色是註冊中心。
本文也是在上一篇的基礎上,繼續學習和研究以Dubbo為微服務框架,nacos作為配置中心,應該如何進行實踐。以及在此過程中,遇到了什麼樣的問題,如何解決。
2、nacos的必知必會
在進行編碼之前,先看看當nacos作為配置中心時,操作介面是啥,有哪些新的知識點,需要我們先去了解和掌握呢?以免,在後面搭建環境時,全程懵逼。
重要引數說明
Data Id
- Data Id的預設值為
${nacos.config.prefix}-${spring.profile.active}.${nacos.config.file-extension}
nacos.config.prefix
的預設值為${spring.application.name}
nacos.config.file-extension
的預設值為properties
- 當
spring.profiles.active
${spring.application.name}.properties
- 若設定了
spring.profiles.active
而Nacos中存在${spring.application.name}.properties
時,若還存在${spring.application.name}-${spring.profiles.active}.properties
,則預設匹配後者,若不存在,則會自動匹配前者 - 由於Nacos建議且預設用
spring.application.name
作為Data Id的字首,若要在不同服務中共享專案統一配置,則可以通過配置nacos.config.shared-dataids
nacos.config.refreshable-dataids
來新增共享配置,前者不支援自動重新整理,後者支援
Group
- 這是一個很靈活的配置項,並沒有固定的規定,可以用作多環境、多模組、多版本之間區分配置
Namespace
- 推薦使用名稱空間來區分不同環境的配置,因為使用
profiles
或group
會是不同環境的配置展示到一個頁面,而Nacos控制檯對不同的Namespace
做了Tab欄分組展示,如下圖:
- 注意配置
Namespace
的時候不是通過名稱,而是通過名稱空間的ID(上圖所示),可通過如下配置來設定服務使用的名稱空間:
nacos:
service-address: 127.0.0.1
port: 8848
config:
server-addr: ${nacos.service-address}:${nacos.port}
namespace: 9af36d59-2efd-4f43-8a69-82fb37fc8094 # 名稱空間ID 不是名稱空間名稱
3、基礎框架搭建
我的建議,儘可能自己花點時間,在不熟悉的情況下,儘量按照自己的想法思路,從零開始搭建一下,加深印象。在搭建過程中,可能會遇到問題,此時不要慌(嘴上不說,心裡卻慌得狠)。但幸運的是,你遇到了我,可以聯絡,留言或關注我,一起交流。
為了不造成知識點的混淆,我將spring-boot-dubbo-nacos-demo
的maven工程,原始碼已同步於github,重新拷貝一份,專案重新命名為spring-boot-dubbo-nacos-configcenter-demo
。
直接拷貝過來,專案名變更,對應的pom.xml還需要修改一下
修改shop-service-provider和shop-service-consumer:的pom.xml
按照上一篇文章的6、測試,看一下專案是否能正常啟動,如果正常,我們在開始整合nacos的配置中心。確保前面的功能都是正常的。
4、pom.xml說明
如果想nacos作為配置中心,需要在對應的maven工程中引入nacos-config-spring-boot-starter
的依賴包,這裡,將此依賴包在shop-service-provider和shop-service-consumer的專案中同時引入,這樣可以方便服務提供者和服務消費者之間的測試。
這裡就不把pom.xml的程式碼全部粘貼出來,大家想看的話,可以去上一篇文章中看。
pom.xml
新增nacos-config-spring-boot-starter
依賴
<!-- nacos config依賴 -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
<version>0.2.3</version>
</dependency>
5、配置檔案說明
shop-service-provider和shop-service-consumer的application.yml,增如下配置,啟動專案,會和nacos建立連線
nacos:
service-address: 127.0.0.1
port: 8848
config:
server-addr: ${nacos.service-address}:${nacos.port}
相關配置引數,請參考com.alibaba.boot.nacos.config.properties.NacosConfigProperties.java
6、編寫業務程式碼
6.1、shop-service-provider增加配置實體類NacosConfig.java
NacosConfig.java程式碼實現:
package cn.raysonblog.shopserviceprovider.config;
import com.alibaba.nacos.api.config.annotation.NacosValue;
import com.alibaba.nacos.spring.context.annotation.config.NacosPropertySource;
import lombok.Data;
import org.springframework.stereotype.Component;
/**
* 從Nacos外部拉取配置, 修改配置,自動會重新整理應用的配置
*
* @author raysonfang
*/
@NacosPropertySource(dataId = "rayson", autoRefreshed = true)
@Data
@Component
public class NacosConfig {
@NacosValue(value = "${service.name:1}", autoRefreshed = true)
private String serviceName;
}
註解說明:
@NacosPropertySource
註解其中包含兩個屬性,如下:
- dataId:這個屬性是需要在Nacos中配置的Data Id。
- autoRefreshed:為true的話開啟自動更新。
在使用Nacos做配置中心後,需要使用@NacosValue
註解獲取配置,使用方式與@Value
一樣。
其中${service.name:1}
的service.name是屬性key, 1
是預設值。
6.2、shop-service-provider將NacosConfig的資訊暴露到介面中獲取
package cn.raysonblog.shopserviceprovider.service.impl;
import cn.raysonblog.shopserviceprovider.config.NacosConfig;
import cn.raysonblog.shopserviceprovider.service.RpcShopService;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;
/**
* 介面實現類
*
* ## @Service 這個註解是使用dubbo提供的,
* 這個註解中有很多屬性,需要單獨瞭解去進行配置
*
* @author raysonfang
*/
@Service
public class ShopServiceImpl implements RpcShopService {
@Autowired
NacosConfig nacosConfig;
public String sayHello(String name) {
return name;
}
/**
* 將nacos config的配置資訊暴露給服務消費者
* @param desc
* @return
*/
public String getConfigServiceName(String desc){
return nacosConfig.getServiceName()+desc;
}
}
RpcShopService.java
介面新增getConfigServiceName()
方法
package cn.raysonblog.shopserviceprovider.service;
/**
* 提供暴露的Rpc介面
* @author raysonfang
*/
public interface RpcShopService {
String sayHello(String name);
String getConfigServiceName(String desc);
}
6.3、shop-service-consumer新增介面方法/getConfig
package cn.raysonblog.shopserviceconsumer;
import cn.raysonblog.shopserviceprovider.service.RpcShopService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
/**
*
* 把主類和controller寫在一起,方便簡單測試演示。
*
* @author raysonfang
*/
@SpringBootApplication
@RestController
public class ShopServiceConsumerApplication {
@Reference
RpcShopService shopService;
/**
* 註釋原因: 在主應用入口,只執行有一個RequestMapping 否則會報錯。
*/
/* @RequestMapping(name = "/sayHello", method = RequestMethod.GET)
public String sayHello(){
return shopService.sayHello("Hello Dubbo Nacos!更多原創分享,技術交流,關注:Java技術乾貨(ID:raysonfang)");
}*/
/**
* Nacos config配置中心 獲取配置資訊 測試介面
* @return
*/
@RequestMapping(name = "/getConfig", method = RequestMethod.GET)
public String getConfig(){
return shopService.getConfigServiceName("更多原創分享,技術交流,關注:Java技術乾貨(ID:raysonfang)");
}
public static void main(String[] args) {
SpringApplication.run(ShopServiceConsumerApplication.class, args);
}
}
7、測試
專案啟動順序,這裡再貼一下上一篇的圖:
nacos還沒配置資訊時,輸入http://localhost:8081/getConfig
,顯示的是預設值
去nacos控制檯新增如下配置:
重新整理http://localhost:8081/getConfig
,配置由1
更新為hello nacos config-center!
8、問題記錄及解決
8.1、對於dataID的配置不清楚,當時我使用rayson.service,導致客戶端解析錯誤。
解決:檢視原始碼得知,在NacosUtils.java中,對dataId有解析,.
後面的值相當於檔案字尾名。故,如果需要配置,則配置成支援的檔案字尾名。
9、後記
由於能力有限,若有錯誤或者不當之處,還請大家批評指正,一起學習交流!
原始碼放置Github: https://github.com/raysonfang/spring-boot-demo-all
歡迎大家star, 批評
我平常學習,編碼也都會放置github上,歡迎持續關注交流。
我的github: https://github.com/raysonfang
文章推薦
1. Spring Boot 2.x 基礎案例:整合Dubbo 2.7.3+Nacos1.1.3(最新版