本文原创首发于公众号: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
  1. Data Id的默认值为${nacos.config.prefix}-${spring.profile.active}.${nacos.config.file-extension}
  2. nacos.config.prefix的默认值为${spring.application.name}
  3. nacos.config.file-extension的默认值为properties
  4. spring.profiles.active未配置时,则匹配${spring.application.name}.properties
  5. 若设置了spring.profiles.active而Nacos中存在${spring.application.name}.properties时,若还存在${spring.application.name}-${spring.profiles.active}.properties,则默认匹配后者,若不存在,则会自动匹配前者
  6. 由于Nacos建议且默认用spring.application.name作为Data Id的前缀,若要在不同服务中共享项目统一配置,则可以通过配置nacos.config.shared-dataidsnacos.config.refreshable-dataids来添加共享配置,前者不支持自动刷新,后者支持
Group
  1. 这是一个很灵活的配置项,并没有固定的规定,可以用作多环境、多模块、多版本之间区分配置
Namespace
  1. 推荐使用命名空间来区分不同环境的配置,因为使用profilesgroup会是不同环境的配置展示到一个页面,而Nacos控制台对不同的Namespace做了Tab栏分组展示,如下图:
  1. 注意配置Namespace的时候不是通过名称,而是通过命名空间的ID(上图所示),可通过如下配置来设置服务使用的命名空间:
nacos:service-address: 127.0.0.1port: 8848config: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.1port: 8848config: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 {@AutowiredNacosConfig 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 {@ReferenceRpcShopService 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(最新版)

Spring Boot 2.x 基础案例:整合Dubbo 2.7.3 Nacos1.1.3(配置中心)相关推荐

  1. Spring Boot + BeetlSQL + H2数据库项目整合

    Spring Boot + BeetlSQL + H2数据库项目整合 这个项目是一个大佬给的,目的是看我的自学能力和基础知识的牢固程度,要求如下: 底层架构采用springboot 前端技术使用lay ...

  2. Spring Boot 2.x基础教程:使用Elastic Job实现定时任务

    上一篇,我们介绍了如何使用Spring Boot自带的@Scheduled注解实现定时任务(https://blog.didispace.com/spring-boot-learning-2-7-1/ ...

  3. Spring Boot 2.x基础教程:使用JTA实现分布式事务

    在一个Spring Boot项目中,连接多个数据源还是比较常见的.之前也介绍了如何在几种常用框架的场景下配置多数据源,具体可见: Spring Boot 2.x基础教程:JdbcTemplate的多数 ...

  4. Spring Boot 2.x基础教程:使用集中式缓存Redis

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 之前我们介绍了两种进程内缓存的用法,包括Spring B ...

  5. Spring Boot 2.x基础教程:使用EhCache缓存集群

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 上一篇我们介绍了在Spring Boot中整合EhCac ...

  6. Spring Boot 2.x基础教程:MyBatis的多数据源配置

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 前两天,我们已经介绍了关于JdbcTemplate的多数 ...

  7. Spring Boot 2.x基础教程:使用MyBatis的XML配置方式

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 翟永超 来源 | http://blog.di ...

  8. Spring Boot 2.x基础教程:Swagger静态API文档的生成

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 作者 | 翟永超 来源 | didispace.com/spring-boot-learni ...

  9. Spring Boot学习笔记-基础(2)

    Spring Boot学习笔记-基础(2) Spring Boot 优点: – 快速创建独立运行的Spring项目以及与主流框架集成 – 使用嵌入式的Servlet容器,应用无需打成WAR包 – st ...

  10. 19年8月 字母哥 第一章 spring boot 2.x基础及概念入门 这里全部看完了 热部署没出来 第二章在前面2页 用热点公司网不行

    http://springboot.zimug.com/1233100   文档 http://www.zimug.com/page/5     字母哥个人博客 11111 第一章 spring bo ...

最新文章

  1. 30+博士、100+硕士整理的超全深度强化学习资源清单
  2. 嵌入式开发板加载U盘,U盘测试
  3. 你是什么时候真正从产品助理成长为产品经理的?
  4. nth_element(a+1 , a + m, a + n+1);
  5. who|sort实现
  6. Toast与Snackbar的那点事
  7. 应用在核电站DCS系统的代码自动生成工具ModelCoder
  8. [实验流体力学][Matlab] pi 定理的应用
  9. 在5分钟内学习Vuex
  10. 关于IDEA编辑器运行测试方法时无法在控制台进行输入的问题
  11. [现代程序设计]homework-03
  12. vb 服务器mysql_VB 连接mysql网络数据库的代码
  13. 几种流行的开源WebService框架Axis1,Axis2,Xfire,CXF,JWS比较
  14. 飞鸽传书2007绿色版下载
  15. Tensorflow 中padding 的“SAME” 和“VALID” 详解
  16. phpcms修改了配置文件之后出现Warning: date() expects parameter 2 to be long..错误
  17. Unity XLua Hotfix热更新配置笔记
  18. 详解网关和路由器的区别
  19. 浅议-动态范围控制(DRC)
  20. 百融云创被传赴港IPO急辟谣 旗下信贷业务存众多质疑

热门文章

  1. 【QT】提示框(消息盒子、文件对话框、颜色对话框、字体对话框、输入对话框、自定义对话框)
  2. 【C语言基础学习笔记】一、初始C语言(2)
  3. PHR-search:一个基于预测蛋白质层次关系的蛋白质远程同源性检测搜索框
  4. 利用手机传感器测量高度
  5. 泰坦尼克号数据_数据分析实战3:泰坦尼克号生存分析
  6. mysql 指数 类型_利用MYSQL挑选指数基金
  7. oracle递归查询出现死循环,一次马失前蹄的SQL优化:递归查询引发的血案
  8. 博士申请 | 美国埃默里大学招收2022秋季入学机器学习方向全奖博士生
  9. 海思(六)如何在ubuntu20.04上搭建caffe环境
  10. vue NavigationDuplicated: Avoided redundant navigation to current location