分布式配置中心预研

一、为什么要集中配置

  • 现在基本都是微服务架构,随着服务越来越多,程序功能越来越复杂需要一个程序来集中管理
  • 并且对配置的期望也越来越高,配置修改后实时生效,灰度发布,分环境、分集群管理配置,完善的权限、审核机制。。。
  • 项目之间的相互引用随着服务的不断增多,相互之间的调用复杂度成指数升高,每次投产或者上线新的项目时苦不堪言,因此需要引用配置中心治理。

二、主流配置中心对比

现在主流的配置中心有以下几个:
1.spring-cloud-config

https://github.com/spring-cloud/spring-cloud-config
Spring Cloud组件之一,可以跟Spring Cloud项目无缝衔接

2.淘宝 diamond

https://github.com/takeseem/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这三个。

功能点优先级disconfapollonacos
统一管理 支持 支持 支持
多环境 支持 支持 支持
多集群 支持 支持 支持
多语言 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.引入依赖
  1. <dependencies> 
  2. <dependency> 
  3. <groupId>org.springframework.boot</groupId> 
  4. <artifactId>spring-boot-starter-web</artifactId> 
  5. </dependency> 
  6.  
  7. <dependency> 
  8. <groupId>org.springframework.boot</groupId> 
  9. <artifactId>spring-boot-starter-test</artifactId> 
  10. <scope>test</scope> 
  11. </dependency> 
  12.  
  13. <dependency> 
  14. <groupId>com.alibaba.cloud</groupId> 
  15. <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> 
  16. <version>1.5.1.RELEASE</version> 
  17. <exclusions> 
  18. <exclusion> 
  19. <groupId>com.alibaba.nacos</groupId> 
  20. <artifactId>nacos-client</artifactId> 
  21. </exclusion> 
  22. </exclusions> 
  23. </dependency> 
  24. <!-- 这里是为了升级客户端版本--> 
  25. <dependency> 
  26. <groupId>com.alibaba.nacos</groupId> 
  27. <artifactId>nacos-client</artifactId> 
  28. <version>1.2.0</version> 
  29. </dependency> 
  30. </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文件添加配置
  1. spring: 
  2. application: 
  3. name: nacos-demo 
  4. cloud: 
  5. nacos: 
  6. config: 
  7. server-addr: 127.0.0.1:8848 
  8. file-extension: yaml 
  9. namespace: public 
  • 4.测试Controller
  1. /** 
  2. * @author Ship 
  3. * @date 2020-04-20 18:01 
  4. */ 
  5. @RestController 
  6. @RequestMapping("test") 
  7. @RefreshScope 
  8. public class TestController { 
  9.  
  10. @Value("${test.enabled}") 
  11. private boolean testEnabled; 
  12.  
  13. @GetMapping 
  14. public String test() { 
  15. return testEnabled + ""; 
  16. } 
  17. } 

通过 Spring Cloud 原生注解 @RefreshScope 实现配置自动更新。

  • 5.设置项目启动环境为dev
    方式一(推荐):
    enter description here
    方式二:
    enter description here

  • 6.在nacos管理后台添加配置文件
    enter description here

注意:

在 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。

 

版本关系
版本关系

 

参考:官方文档

posted @ 2020-04-26 16:39  烟味i  阅读(1059)  评论(0编辑  收藏  举报