本文原創(chuàng)首發(fā)于公眾號(hào):Java技術(shù)干貨
1田轧、概述
本文將Nacos作為配置中心傻粘,實(shí)現(xiàn)配置外部化,動(dòng)態(tài)更新窒典。這樣做的優(yōu)點(diǎn):不需要重啟應(yīng)用瀑志,便可以動(dòng)態(tài)更新應(yīng)用里的配置信息肩祥。在如今流行的微服務(wù)應(yīng)用下混狠,將應(yīng)用的配置統(tǒng)一管理将饺,顯得尤為重要予弧。
上一篇寫了《Spring Boot 2.x 基礎(chǔ)案例:整合Dubbo 2.7.3+Nacos1.1.3(最新版)》http://www.reibang.com/p/b0dddce1d404湖饱,在文章中井厌,nacos的角色是注冊(cè)中心。
本文也是在上一篇的基礎(chǔ)上器赞,繼續(xù)學(xué)習(xí)和研究以Dubbo為微服務(wù)框架港柜,nacos作為配置中心夏醉,應(yīng)該如何進(jìn)行實(shí)踐畔柔。以及在此過程中,遇到了什么樣的問題肠槽,如何解決秸仙。
2桩盲、nacos的必知必會(huì)
在進(jìn)行編碼之前赌结,先看看當(dāng)nacos作為配置中心時(shí)柬姚,操作界面是啥量承,有哪些新的知識(shí)點(diǎn),需要我們先去了解和掌握呢拿穴?以免默色,在后面搭建環(huán)境時(shí)腿宰,全程懵逼。
重要參數(shù)說明
Data Id
- Data Id的默認(rèn)值為
${nacos.config.prefix}-${spring.profile.active}.${nacos.config.file-extension}
-
nacos.config.prefix
的默認(rèn)值為${spring.application.name}
-
nacos.config.file-extension
的默認(rèn)值為properties
- 當(dāng)
spring.profiles.active
未配置時(shí),則匹配${spring.application.name}.properties
- 若設(shè)置了
spring.profiles.active
而Nacos中存在${spring.application.name}.properties
時(shí)捶闸,若還存在${spring.application.name}-${spring.profiles.active}.properties
删壮,則默認(rèn)匹配后者央碟,若不存在亿虽,則會(huì)自動(dòng)匹配前者 - 由于Nacos建議且默認(rèn)用
spring.application.name
作為Data Id的前綴苞也,若要在不同服務(wù)中共享項(xiàng)目統(tǒng)一配置如迟,則可以通過配置nacos.config.shared-dataids
或nacos.config.refreshable-dataids
來添加共享配置殷勘,前者不支持自動(dòng)刷新输拇,后者支持
Group
- 這是一個(gè)很靈活的配置項(xiàng),并沒有固定的規(guī)定,可以用作多環(huán)境草讶、多模塊炉菲、多版本之間區(qū)分配置
Namespace
- 推薦使用命名空間來區(qū)分不同環(huán)境的配置,因?yàn)槭褂?code>profiles或
group
會(huì)是不同環(huán)境的配置展示到一個(gè)頁面薪介,而Nacos控制臺(tái)對(duì)不同的Namespace
做了Tab欄分組展示汁政,如下圖:
- 注意配置
Namespace
的時(shí)候不是通過名稱记劈,而是通過命名空間的ID(上圖所示)目木,可通過如下配置來設(shè)置服務(wù)使用的命名空間:
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刽射、基礎(chǔ)框架搭建
我的建議柄冲,盡可能自己花點(diǎn)時(shí)間忠蝗,在不熟悉的情況下阁最,盡量按照自己的想法思路速种,從零開始搭建一下配阵,加深印象。在搭建過程中救拉,可能會(huì)遇到問題亿絮,此時(shí)不要慌(嘴上不說派昧,心里卻慌得狠)蒂萎。但幸運(yùn)的是,你遇到了我纳寂,可以聯(lián)系烈疚,留言或關(guān)注我爷肝,一起交流灯抛。
為了不造成知識(shí)點(diǎn)的混淆对嚼,我將spring-boot-dubbo-nacos-demo
的maven工程纵竖,源代碼已同步于github靡砌,重新拷貝一份珊楼,項(xiàng)目重新命名為spring-boot-dubbo-nacos-configcenter-demo
厕宗。
直接拷貝過來已慢,項(xiàng)目名變更蛇受,對(duì)應(yīng)的pom.xml還需要修改一下
修改shop-service-provider和shop-service-consumer:的pom.xml
按照上一篇文章的6、測(cè)試轻专,看一下項(xiàng)目是否能正常啟動(dòng)察蹲,如果正常洽议,我們?cè)陂_始整合nacos的配置中心亚兄。確保前面的功能都是正常的审胚。
4膳叨、pom.xml說明
如果想nacos作為配置中心菲嘴,需要在對(duì)應(yīng)的maven工程中引入nacos-config-spring-boot-starter
的依賴包,這里昭雌,將此依賴包在shop-service-provider和shop-service-consumer的項(xiàng)目中同時(shí)引入悉默,這樣可以方便服務(wù)提供者和服務(wù)消費(fèi)者之間的測(cè)試城豁。
這里就不把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跟磨,增如下配置间聊,啟動(dòng)項(xiàng)目,會(huì)和nacos創(chuàng)建連接
nacos:
service-address: 127.0.0.1
port: 8848
config:
server-addr: ${nacos.service-address}:${nacos.port}
相關(guān)配置參數(shù)哎榴,請(qǐng)參考com.alibaba.boot.nacos.config.properties.NacosConfigProperties.java
6、編寫業(yè)務(wù)代碼
6.1、shop-service-provider增加配置實(shí)體類NacosConfig.java
NacosConfig.java代碼實(shí)現(xiàn):
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外部拉取配置, 修改配置尚蝌,自動(dòng)會(huì)刷新應(yīng)用的配置
*
* @author raysonfang
*/
@NacosPropertySource(dataId = "rayson", autoRefreshed = true)
@Data
@Component
public class NacosConfig {
@NacosValue(value = "${service.name:1}", autoRefreshed = true)
private String serviceName;
}
注解說明:
@NacosPropertySource
注解其中包含兩個(gè)屬性迎变,如下:
- dataId:這個(gè)屬性是需要在Nacos中配置的Data Id。
- autoRefreshed:為true的話開啟自動(dòng)更新飘言。
在使用Nacos做配置中心后衣形,需要使用@NacosValue
注解獲取配置,使用方式與@Value
一樣姿鸿。
其中${service.name:1}
的service.name是屬性key, 1
是默認(rèn)值谆吴。
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;
/**
* 接口實(shí)現(xiàn)類
*
* ## @Service 這個(gè)注解是使用dubbo提供的苛预,
* 這個(gè)注解中有很多屬性句狼,需要單獨(dú)了解去進(jìn)行配置
*
* @author raysonfang
*/
@Service
public class ShopServiceImpl implements RpcShopService {
@Autowired
NacosConfig nacosConfig;
public String sayHello(String name) {
return name;
}
/**
* 將nacos config的配置信息暴露給服務(wù)消費(fèi)者
* @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寫在一起热某,方便簡(jiǎn)單測(cè)試演示腻菇。
*
* @author raysonfang
*/
@SpringBootApplication
@RestController
public class ShopServiceConsumerApplication {
@Reference
RpcShopService shopService;
/**
* 注釋原因: 在主應(yīng)用入口,只運(yùn)行有一個(gè)RequestMapping 否則會(huì)報(bào)錯(cuò)苫拍。
*/
/* @RequestMapping(name = "/sayHello", method = RequestMethod.GET)
public String sayHello(){
return shopService.sayHello("Hello Dubbo Nacos!更多原創(chuàng)分享芜繁,技術(shù)交流,關(guān)注:Java技術(shù)干貨(ID:raysonfang)");
}*/
/**
* Nacos config配置中心 獲取配置信息 測(cè)試接口
* @return
*/
@RequestMapping(name = "/getConfig", method = RequestMethod.GET)
public String getConfig(){
return shopService.getConfigServiceName("更多原創(chuàng)分享绒极,技術(shù)交流骏令,關(guān)注:Java技術(shù)干貨(ID:raysonfang)");
}
public static void main(String[] args) {
SpringApplication.run(ShopServiceConsumerApplication.class, args);
}
}
7、測(cè)試
項(xiàng)目啟動(dòng)順序垄提,這里再貼一下上一篇的圖:
nacos還沒配置信息時(shí)榔袋,輸入http://localhost:8081/getConfig
,顯示的是默認(rèn)值
去nacos控制臺(tái)新增如下配置:
刷新http://localhost:8081/getConfig
铡俐,配置由1
更新為hello nacos config-center!
8凰兑、問題記錄及解決
8.1、對(duì)于dataID的配置不清楚审丘,當(dāng)時(shí)我使用rayson.service吏够,導(dǎo)致客戶端解析錯(cuò)誤。
解決:查看源碼得知滩报,在NacosUtils.java中锅知,對(duì)dataId有解析,.
后面的值相當(dāng)于文件后綴名脓钾。故售睹,如果需要配置,則配置成支持的文件后綴名可训。
9昌妹、后記
由于能力有限捶枢,若有錯(cuò)誤或者不當(dāng)之處,還請(qǐng)大家批評(píng)指正飞崖,一起學(xué)習(xí)交流烂叔!
源代碼放置Github: https://github.com/raysonfang/spring-boot-demo-all
歡迎大家star, 批評(píng)
我平常學(xué)習(xí),編碼也都會(huì)放置github上蚜厉,歡迎持續(xù)關(guān)注交流长已。
我的github: https://github.com/raysonfang
文章推薦
1. Spring Boot 2.x 基礎(chǔ)案例:整合Dubbo 2.7.3+Nacos1.1.3(最新版)