分布式配置中心预研
一、为什么要集中配置
- 现在基本都是微服务架构,随着服务越来越多,程序功能越来越复杂需要一个程序来集中管理
- 并且对配置的期望也越来越高,配置修改后实时生效,灰度发布,分环境、分集群管理配置,完善的权限、审核机制。。。
- 项目之间的相互引用随着服务的不断增多,相互之间的调用复杂度成指数升高,每次投产或者上线新的项目时苦不堪言,因此需要引用配置中心治理。
二、主流配置中心对比
现在主流的配置中心有以下几个:
1.spring-cloud-config
https://github.com/spring-cloud/spring-cloud-config
Spring Cloud组件之一,可以跟Spring Cloud项目无缝衔接
2.淘宝 diamond
3.disconf
https://github.com/knightliao/disconf
java开发,蚂蚁金服技术专家发起,业界使用广泛包括百度,顺丰等。
4.ctrip apollo
https://github.com/ctripcorp/apollo/
Apollo(阿波罗)是携程框架部门研发的开源配置管理中心,具备规范的权限、流程治理等特性。
5.阿里nacos
https://github.com/alibaba/nacos
Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
spring-cloud-config是将配置文件保存到github仓库而且功能单一基本没人用,diamond已经没有维护了所以也不考虑,下面主要比较disconf、apollo、nacos这三个。
功能点 | 优先级 | disconf | apollo | nacos |
---|---|---|---|---|
统一管理 | 高 | 支持 | 支持 | 支持 |
多环境 | 高 | 支持 | 支持 | 支持 |
多集群 | 高 | 支持 | 支持 | 支持 |
多语言 | 中 | Java | 支持 | 支持 |
本地配置缓存 | 高 | 支持 | 支持 | 支持 |
配置校验 | 中 | 无 | 无 | 无 |
配置更新推送 | 高 | 支持 | 支持 | 支持 |
配置定时拉取 | 高 | 支持 | 支持 | 支持 |
版本管理 | 高 | 操作记录有落数据库,但无查询接口 | 支持 | 支持 |
配置回滚 | 高 | 不支持 | 支持 | 支持 |
用户权限管理 | 高 | 支持 | 支持 | 支持 |
灰度发布 | 中 | 不支持部分更新 | 支持 | 待支持 |
告警通知 | 中 | 支持,邮件方式告警 | 支持,邮件方式告警 | 支持,可以暴露metrics数据 |
单机读 | 高 | 暂无数据 | 9000 | 15000 |
单机写 | 高 | 暂无数据 | 1100 | 1800 |
相比之下disconf功能不够丰富,Apollo(阿波罗)和nacos功能差不多,但是nacos因为使用了HTTP异步通知的方式性能更高,而且当Spring Boot版本升级到2.X时可以用到作为注册中心(Eureka只支持Spring Boot 1.X版本),所以选择了nacos。
三、初探nacos
nacos是Spring Cloud Alibaba的开源项目之一,主要用于服务注册和发现,配置管理。
3.1基本概念
命名空间
用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源隔离等。
配置ID
dataId就是这个配置的ID,需要保证全局唯一,整合Spring Cloud时有一个默认的命名规则。
配置分组
Nacos 中的一组配置集,是组织配置的维度之一。通过一个有意义的字符串(如 Buy 或 Trade )对配置集进行分组,从而区分 Data ID 相同的配置集。当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。配置分组的常见场景:不同的应用或组件使用了相同的配置类型,如 database_url 配置和 MQ_topic 配置。
它们三者之间的关系如下图:
3.2安装nacos server
1.下载nacos server(nacos-server-1.2.1.zip),地址 https://github.com/alibaba/nacos/releases
2.windos系统解压之后的目录如下
3.执行conf/nacos-mysql.sql创建nacos数据库(数据库版本要求:5.6.5+)
4.nacos默认使用derby数据库作数据持久化,所以还需要修改配置文件,在conf/application.properties添加如下内容
#*************** Config Module Related Configurations ***************#
### If user MySQL as datasource:
spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=1234
5.进入bin目录,运行startup.cmd命令启动即可。
6.游览器输入http://localhost:8848/nacos/index.html即看到登录页面,默认账号密码nacos/nacos,建议修改。
3.3编码
- 1.创建Spring Boot项目nacos-demo
- 2.引入依赖
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>com.alibaba.cloud</groupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
- <version>1.5.1.RELEASE</version>
- <exclusions>
- <exclusion>
- <groupId>com.alibaba.nacos</groupId>
- <artifactId>nacos-client</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <!-- 这里是为了升级客户端版本-->
- <dependency>
- <groupId>com.alibaba.nacos</groupId>
- <artifactId>nacos-client</artifactId>
- <version>1.2.0</version>
- </dependency>
- </dependencies>
注意: 版本 2.1.x.RELEASE 对应的是 Spring Boot 2.1.x 版本。版本 2.0.x.RELEASE 对应的是 Spring Boot 2.0.x 版本,版本 1.5.x.RELEASE 对应的是 Spring Boot 1.5.x 版本。
- 3.在bootstrap.yml文件添加配置
- spring:
- application:
- name: nacos-demo
- cloud:
- nacos:
- config:
- server-addr: 127.0.0.1:8848
- file-extension: yaml
- namespace: public
- 4.测试Controller
- /**
- * @author Ship
- * @date 2020-04-20 18:01
- */
- "test")
- public class TestController {
- "${test.enabled}")
- private boolean testEnabled;
-
- public String test() {
- return testEnabled + "";
- }
- }
通过 Spring Cloud 原生注解 @RefreshScope 实现配置自动更新。
-
5.设置项目启动环境为dev
方式一(推荐):
方式二:
-
6.在nacos管理后台添加配置文件
注意:
在 Nacos Spring Cloud 中,dataId 的完整格式如下:
${prefix}-${spring.profile.active}.${file-extension}
- prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
- spring.profile.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当 spring.profile.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
- file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。
3.4测试
1.启动nacos-demo,访问地址http://localhost:9000/test,返回结果为true
2.修改nacos-demo-dev.yaml中test.enabled的值为false,再次访问结果为false,说明配置实时更新了。
3.5遇到的问题
将application.properties上的nacos.core.auth.enabled改为true,开启权限认证后项目就读取不到配置了,配置了用户名和密码也无效。
com.alibaba.nacos.api.exception.NacosException: <html><body><h1>Whitelabel Error Page</h1><p>This application has no explicit mapping for /error, so you are seeing this as a fallback.</p><div id='created'>Sun Apr 26 16:06:15 CST 2020</div><div>There was an unexpected error (type=Forbidden, status=403).</div><div>unknown user!</div></body></html>
在github上 Issue发现该问题是因为现有的Spring Cloud版本不支持nacos server 1.2.0。
参考:官方文档