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(最新版)
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 2.x的版本,通过Nacos作为配置与注册中心,实现Dubbo服务的注册与消费. 整合组件的版本说明: Spring Boot 2.1.9 Dubb ...
- 【Spring Boot学习之十】整合Dubbo
环境 eclipse 4.7 jdk 1.8 Spring Boot 1.5.2 参考以下两篇文章,总结的很全面: springboot整合最新版dubbo以及dubbo-admin的安装使用Spri ...
- Spring Kafka整合Spring Boot创建生产者客户端案例
每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code 创建一个kafka-producer-master的maven工程.整个项目结构如下: ...
- Spring Boot 2.x基础教程:EhCache缓存的使用
上一篇我们学会了如何使用Spring Boot使用进程内缓存在加速数据访问.可能大家会问,那我们在Spring Boot中到底使用了什么缓存呢? 在Spring Boot中通过@EnableCachi ...
- Spring Boot 入门之基础篇(一)
原文地址:Spring Boot 入门之基础篇(一) 博客地址:http://www.extlight.com 一.前言 Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是 ...
- Spring Boot 2.x基础教程:使用Swagger2构建强大的API文档
随着前后端分离架构和微服务架构的流行,我们使用Spring Boot来构建RESTful API项目的场景越来越多.通常我们的一个RESTful API就有可能要服务于多个不同的开发人员或开发团队:I ...
- Spring Boot 2.x基础教程:Swagger静态文档的生成
前言 通过之前的两篇关于Swagger入门以及具体使用细节的介绍之后,我们已经能够轻松地为Spring MVC的Web项目自动构建出API文档了.如果您还不熟悉这块,可以先阅读: Spring Boo ...
- Spring Boot 2.x基础教程:使用MyBatis的XML配置方式
上一篇我们介绍了如何在Spring Boot中整合我们国人最常用的MyBatis来实现对关系型数据库的访问.但是上一篇中使用了注解方式来实现,而对于很多MyBatis老用户还是习惯于XML的开发方式, ...
- Spring Boot 2.x基础教程:进程内缓存的使用与Cache注解详解
随着时间的积累,应用的使用用户不断增加,数据规模也越来越大,往往数据库查询操作会成为影响用户使用体验的瓶颈,此时使用缓存往往是解决这一问题非常好的手段之一.Spring 3开始提供了强大的基于注解的缓 ...
随机推荐
- 题解 洛谷P1196 【[NOI2002]银河英雄传说】
题意 有一个划分成n列的星际战场,各列编号为1,2.....n.有n艘战舰,也依次编号1,2.....n,其中第i号战舰位于第i列. 有m条指令,每条指令格式如下 M i j 表示让第i号战舰所在列的 ...
- 【Offer】[49] 【丑数】
题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 我们把只包含因子2.3和5的数称作丑数( Ugly Number).求按从小到大的顺序的第1500个丑数.例如,6.8都是丑数,但14不 ...
- Java日志框架SLF4J和log4j以及logback的联系和区别
1.SLF4J(Simple logging Facade for Java) 意思为简单日志门面,它是把不同的日志系统的实现进行了具体的抽象化,只提供了统一的日志使用接口,使用时只需要按照其提供的接 ...
- TypeScript + React + Redux 实战简单天气APP全套完整项目
下载链接:https://www.yinxiangit.com/171.html 目录: 从面向过程的js到面向对象的js,让web前端更加高大尚.让你的前端步步日上,紧跟技术发展的前沿.让你构建更加 ...
- Android-隐藏app图标以及隐式启动
隐藏APP桌面图标 <activity android:name=".LaunchActivity"> <intent-filter> <action ...
- FreeSql (三十五)CodeFirst 自定义特性
比如项目内已经使用了其它 orm,如 efcore,这样意味着实体中可能存在 [Key],但它与 FreeSql [Column(IsPrimary = true] 不同. Q: FreeSql 实体 ...
- 手把手教程: CentOS 6.5 LVS + KeepAlived 搭建 负载均衡 高可用 集群
为了实现服务的高可用和可扩展,在网上找了几天的资料,现在终于配置完毕,现将心得公布处理,希望对和我一样刚入门的菜鸟能有一些帮助. 一.理论知识(原理) 我们不仅要知其然,而且要知其所以然,所以先给大家 ...
- 作为IT面试官,我如何考核计算机专业毕业生?作为培训班老师,我又如何提升他们?
我最近几年一直在做技术面试官,除了面试有一定工作经验的社会人员外,有时还会面试在校实习生和刚毕业的大学生.同时,我也在学校里做过兼职讲师,上些政府补贴课程(这些课程有补贴,学生不用出钱),所以我会在不 ...
- 一个基于vue的时钟
前两天写了一个基于vue的小钟表,给大家分享一下. 其中时针和分针使用的是图片,结合transform制作:表盘刻度是通过transform和transformOrigin配合画的:外面的弧形框框,啊 ...
- 使用 Envoy 和 AdGuard Home 阻挡烦人的广告
原文链接:使用 Envoy 和 AdGuard Home 阻挡烦人的广告 通常我们使用网络时,宽带运营商会为我们分配一个 DNS 服务器.这个 DNS 通常是最快的,距离最近的服务器,但会有很多问题, ...