本文原創首發於公衆號:Java技術乾貨java
本文將Nacos做爲配置中心,實現配置外部化,動態更新。這樣作的優勢:不須要重啓應用,即可以動態更新應用裏的配置信息。在現在流行的微服務應用下,將應用的配置統一管理,顯得尤其重要。git
上一篇寫了《Spring Boot 2.x 基礎案例:整合Dubbo 2.7.3+Nacos1.1.3(最新版)》https://www.jianshu.com/p/b0dddce1d404,在文章中,nacos的角色是註冊中心。github
本文也是在上一篇的基礎上,繼續學習和研究以Dubbo爲微服務框架,nacos做爲配置中心,應該如何進行實踐。以及在此過程當中,遇到了什麼樣的問題,如何解決。web
在進行編碼以前,先看看當nacos做爲配置中心時,操做界面是啥,有哪些新的知識點,須要咱們先去了解和掌握呢?以避免,在後面搭建環境時,全程懵逼。
spring
重要參數說明apache
${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
,則默認匹配後者,若不存在,則會自動匹配前者spring.application.name
做爲Data Id的前綴,若要在不一樣服務中共享項目統一配置,則能夠經過配置nacos.config.shared-dataids
或nacos.config.refreshable-dataids
來添加共享配置,前者不支持自動刷新,後者支持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 不是命名空間名稱
個人建議,儘量本身花點時間,在不熟悉的狀況下,儘可能按照本身的想法思路,從零開始搭建一下,加深印象。在搭建過程當中,可能會遇到問題,此時不要慌(嘴上不說,內心卻慌得狠)。但幸運的是,你遇到了我,能夠聯繫,留言或關注我,一塊兒交流。api
爲了避免形成知識點的混淆,我將spring-boot-dubbo-nacos-demo
的maven工程,源代碼已同步於github,從新拷貝一份,項目從新命名爲spring-boot-dubbo-nacos-configcenter-demo
。
app
直接拷貝過來,項目名變動,對應的pom.xml還須要修改一下
修改shop-service-provider和shop-service-consumer:的pom.xml
框架
按照上一篇文章的六、測試,看一下項目是否能正常啓動,若是正常,咱們在開始整合nacos的配置中心。確保前面的功能都是正常的。maven
若是想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>
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
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
註解其中包含兩個屬性,以下:
在使用Nacos作配置中心後,須要使用@NacosValue
註解獲取配置,使用方式與@Value
同樣。
其中${service.name:1}
的service.name是屬性key, 1
是默認值。
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); }
/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); } }
項目啓動順序,這裏再貼一下上一篇的圖:
nacos還沒配置信息時,輸入http://localhost:8081/getConfig
,顯示的是默認值
去nacos控制檯新增以下配置:
刷新http://localhost:8081/getConfig
,配置由1
更新爲hello nacos config-center!
解決:查看源碼得知,在NacosUtils.java中,對dataId有解析,.
後面的值至關於文件後綴名。故,若是須要配置,則配置成支持的文件後綴名。
因爲能力有限,如有錯誤或者不當之處,還請你們批評指正,一塊兒學習交流!
源代碼放置Github: https://github.com/raysonfang/spring-boot-demo-all
歡迎你們star, 批評
我日常學習,編碼也都會放置github上,歡迎持續關注交流。
個人github: https://github.com/raysonfang