前言
大家好,今天开始给大家分享 — Dubbo 专题之 Dubbo 动态配置中心。在前一个章节中我们介绍了 Dubbo 中的注册中心以及多种不同的注册中心实现,我们在这个章节会介绍 Dubbo 动态配置中心。下面就让我快速吧!
1. 配置中心简介
有小伙伴可能会问,那什么是配置中心呢?有什么作用呢?我们平常在开发中可能会遇到这样一个场景。假设我们有个对外接口需要动态调整开/关配置,来达到动态控制效果。我们的实现方案可能有:存数据库、写文件等等,同时我们也可以通过集中式、统一配置方式来动态管理,例如:Apollo、Nacos、Zookeeper等提供了比传统数据库存储更强大的功能,例如:多租户、实时同步、分布式等特性。我们可以利用这些配置中心特性对我们的 Dubbo 中的所有配置参数进行统一的动态管理。
根据上图我们可以看到,当我们变更配置中心参数时配置中心会通知服务消费者和服务提供者。这样我们就可以实现动态调整 Dubbo 中的参数。
2. 配置中心技术选型
我们一般通过以下几个维度来衡量一个配置中心:
- 分布式配置统一管理
- 动态变更通知
- 安全性
- 实时性
目前配置中心主要包括:Eureka(官方不维护)、Apollo、Spring Cloud Config、Nacos。它们的对比情况如下:
功能点 | Spring Cloud Config | Apollo | Nacos |
---|---|---|---|
开源时间 | 2014.9 | 2016.5 | 2018.6 |
配置实时推送 | 支持(需要Spring Cloud Bus支持) | 支持(HTTP长轮询) | 支持(HTTP长轮询) |
版本管理 | 支持(Git) | 支持 | 支持 |
配置回滚 | 支持(Git) | 支持 | 支持 |
灰度发布 | 支持 | 支持 | 待支持 |
权限管理 | 支持 | 支持 | 待支持 |
多集群 | 支持 | 支持 | 支持 |
多环境 | 支持 | 支持 | 支持 |
监听查询 | 支持 | 支持 | 支持 |
多语言 | 只支持Java | Go、C++、Java、Python、PHP、.Net 、OpenAPI | Java、Python、Node.js 、OpenAPI |
单机部署 | Config Server+Git+Spring Cloud Bus(支持配置实时推送) | Apollo-quikstart+MySQL | Nacos单节点 |
分布式部署 | Config Server+Git+MQ | Config+Admin+Portal+MYSQL | Nacos+MySQL |
配置格式校验 | 不支持 | 支持 | 支持 |
通讯协议 | HTTP和AMQP | HTTP | HTTP |
综合上面的参数我们不难看出不论是支持语言能力、运维部署难易程度、使用便捷性、功能完善程度上 Nacos 都是不错的选择。虽然 Apollo 在功能上确实强大,但是 Nacos 在使用难易程度上比 Apollo 强太多且 Nacos 更容易运维和部署,而 Spring Cloud Config 是一个不成熟的方案需要依赖太多且笨重。
3. 示例演示
- 部署 Nacos
Nacos 的部署我这里为了方便起见使用 Docker 镜像来部署,至于 Docker 环境各位小伙伴自行查询资料。由于是用于实验测试这里采用单机模式:
下载项目
git clone https://github.com/nacos-group/nacos-docker.git cd nacos-docker
部署镜像
docker-compose -f example/standalone-derby.yaml up
使用浏览器输入地址:http://127.0.0.1:8848/nacos登...
Tips:这里单机模式主要用于测试环境,切勿用于生产环境。
我们以配置 Dubbo 相关参数到 Nacos 配置中心为例进行演示
项目结构如下:
服务提供端代码:
/**
* @author <a href="http://youngitman.tech">青年IT男</a>
* @version v1.0.0
* @className Application
* @description 动态配置中心 提供者
* @JunitTest: {@link }
* @date 2020-10-24 21:49
**/
//启动Dubbo注解扫描
@EnableDubbo(scanBasePackages = "com.muke.dubbocourse.dynamicconfig")
//激活Nacos配置并指定Nacos服务所在地址
@EnableNacosConfig(globalProperties = @NacosProperties(serverAddr = "127.0.0.1:8848")) // 激活 Nacos 配置
//指定我们的外部化配置唯一标识:dataId
@NacosPropertySource(dataId = "muke")
public class AnnotationApplication {
public static void main(String[] args) throws IOException {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
//注册当前AnnotationApplication为配置类
context.register(AnnotationApplication.class);
//刷新Spring上下文
context.refresh();
//阻塞
System.in.read();
}
}
服务消费者端代码:
/**
* @author <a href="http://youngitman.tech">青年IT男</a>
* @version v1.0.0
* @className Application
* @description 动态配置中心 服务消费者
* @JunitTest: {@link }
* @date 2020-10-24 21:49
**/
//启动Dubbo注解扫描
@EnableDubbo
//激活 Nacos 配置
@EnableNacosConfig
//配置配置中心唯一标识:dataId
@NacosPropertySource(dataId = "muke")
public class AnnotationApplication {
static {
//指定nacos服务所在地址
System.setProperty("nacos.server-addr", "127.0.0.1:8848");
}
//引用BookFacade的Dubbo服务
@DubboReference(version = "0.0.1")
private BookFacade bookFacade;
public static void main(String[] args) throws IOException {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
//注册当前AnnotationApplication为配置类
context.register(AnnotationApplication.class);
//刷新Spring上下文
context.refresh();
//从容器中获取AnnotationApplication
AnnotationApplication annotationApplication = context.getBean(AnnotationApplication.class);
//调用服务方法
System.out.println("Result=>"+annotationApplication.bookFacade.queryAll());
//阻塞
System.in.read();
}
}
在上面的代码中,我们使用注解的方式进行服务配置。同时我们这里把注册中心地址、应用名称等配置放到配置中心。如下:
这里我们就实现了动态配置中心,把所有的配置放在统一地方进行维护。
Tips:这里的 Data ID 就是我们应用的唯一标识、Group 就是分组信息,这里使用Properties的格式配置参数。
4. 小结
在本小节中我们主要学习了 Dubbo 中的配置中心,其中我们了解到什么是配置中心,同时我们从多个维度也对比了目前比较成熟和流行的配置中心,我们在实际的应用场景中应根据不同的要求使用适合的配置中心。
本节课程的重点如下:
- 理解 Dubbo 配置中心
- 了解常使用的配置中心
- 了解了怎样使用Nacos与 Dubbo 整合
- 了解我们不同配置中心的优势
作者
个人从事金融行业,就职过易极付、思建科技、某网约车平台等重庆一流技术团队,目前就职于某银行负责统一支付系统建设。自身对金融行业有强烈的爱好。同时也实践大数据、数据存储、自动化集成和部署、分布式微服务、响应式编程、人工智能等领域。同时也热衷于技术分享创立公众号和博客站点对知识体系进行分享。关注公众号:青年IT男 获取最新技术文章推送!
博客地址: http://youngitman.tech
微信公众号:
知识星球:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。