1 配置中心介绍
1.1、配置中心介绍
问题
微服务架构下关于配置文件的问题:
配置文件相对分散
在一个微服务架构下,配置文件会随着微服务的增多变的越来越多,而且分散在各个微服务中,不好统一配置和管理。
配置文件无法区分环境
微服务项目可能会有多个环境,例如:测试环境、预发布环境、生产环境。每一个环境所使用的配置理论上都是不同的,一旦需要修改,就需要我们去各个微服务下手动维护,这比较困难。
配置文件无法实时更新
我们修改了配置文件之后,必须重新启动微服务才能使配置生效,这对一个正在运行的项目来说非常不友好。
配置中心的思路是:
首先把项目中各种配置全部都放到一个集中的地方进行统一管理,并提供一套标准的接口。
服务需要获取配置的时候,就来配置中心的接口拉取自己的配置。
配置中心参数有更新时,能够通知到微服务实时同步最新的配置信息,使之动态更新。
1.2、常见配置中心
1.2.1、Apollo
Apollo是由携程开源的分布式配置中心。特点有很多,比如:配置更新之后可以实时生效,支持灰度发布功能,并且能对所有的配置进行版本管理、操作审计等功能,提供开放平台API。并且资料 也写的很详细。
1.2.2、Disconf
Disconf是由百度开源的分布式配置中心。基于Zookeeper实现配置变更后实时通知和生效。
1.2.3、SpringCloud Config
Spring Cloud的配置中心组件。和Spring无缝集成,使用起来非常方便,配置存储支持Git。不过它没有可视化的操作界面,配置的生效也不是实时的,需要重启或去刷新。要结合SpringCloud Bus和消息队列才能完成配置实时刷新的功能。
1.2.4、Nacos
SpingCloud alibaba技术栈中的一个组件,前面我们已经使用它做过服务注册中心。其实它也集成了服务配置的功能,我们可以直接使用它作为服务配置中心。
2 基本配置和多环境配置
2.1、创建测试Controller
2.1.1、创建测试控制器
在service-sms微服务中创建SampleController
使用@Value读取配置信息
package com.oldlu.guli.service.sms.controller; @RestController @RequestMapping("/sms/sample") public class SampleController { @Value("${aliyun.sms.signName}") private String signName; @GetMapping("test1") public R test1(){ return R.ok().data("signName", signName); } }
测试:http://localhost:8150/sms/sample/test1
2.1.2、测试2
使用@ConfigurationProperties读取配置信息
@Autowired private SmsProperties smsProperties; @GetMapping("test2") public R test2(){ return R.ok().data("smsProperties", smsProperties); }
测试:http://localhost:8150/sms/sample/test2
2.2、接入配置中心
2.2.1、service中添加依赖
<!--配置中心--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
2.2.2、创建bootstrap.yml配置文件
bootstrap作为引导文件会优先于application文件的加载
spring: application: name: service-sms cloud: nacos: config: server-addr: 127.0.0.1:8848 #nacos中心地址 file-extension: yaml # 配置文件格式,如果是properties文件则不用配置此项
bootstrap文件先于application加载
properties的配置覆盖yml的配置
application的配置覆盖bootstrap的配置
2.2.3、在nacos中添加配置
2.2.4、填写配置信息
Data ID: service-sms.yaml
这个地方的配置信息的规则和你是否能找到唯一的配置文件相联系,也就是你要去配置中心必须于你的配置文件一致.
服务名.文件格式
**配置内容:**删除或注释本地的bootstrap.yml中的内容
server: port: 8150 # 服务端口 spring: # profiles: # active: dev # 环境设置 # application: # name: service-sms # 服务名 cloud: nacos: discovery: server-addr: localhost:8848 # nacos服务地址 #spring: redis: host: 192.168.100.100 port: 6379 database: 0 password: 123456 #默认为空 lettuce: pool: max-active: 20 #最大连接数,负值表示没有限制,默认8 max-wait: -1 #最大阻塞等待时间,负值表示没限制,默认-1 max-idle: 8 #最大空闲连接,默认8 min-idle: 0 #最小空闲连接,默认0 #阿里云短信 aliyun: sms: regionId: cn-hangzhou keyId: 你的id keySecret: 你的secret templateCode: 你的code signName: oldlu
2.2.5、测试
重新启动service-sms测试从配置中心读取配置信息
2.2.6、配置中心优先
如果配置中心和当前应用的配置文件中都配置了相同的项目,优先使用配置中心中的配置
2.3、配置动态刷新
如果修改了配置中心的配置,我们的程序无法读取到实时的配置信息,需要重新启动服务器,因此可以配置动态刷新。
2.3.1、添加注解
在controller类上配置下面的注解@RefreshScope,并重启服务器
@RefreshScope
2.3.2、修改配置
修改nacos注册中心的配置信息,无需重新启动服务器,配置即可生效
2.4、多环境配置
2.4.1、添加active属性
在bootstrap.yml中添加如下配置
#spring: profiles: active: dev # 环境标识,test、prod等
2.4.2、添加配置配置文件
配置中心添加 service-sms-dev.yaml 配置文件,文件最后一部分的名字和环境标识保持一致
#阿里云短信 aliyun: sms: signName: oldlu
3 命名空间和配置分组
3.1、使用命名空间做环境隔离
3.1.1、创建命名空间
3.1.2、克隆配置文件
在public命名空间中克隆文件到新的命名空间
3.1.3、配置命名空间
默认情况下微服务读取配置中心中 public 命名空间中的配置文件,可以指定命名空间id使用特定命名空间中的配置
命名空间就是你区别你在那个空间或者那个位置一般看公司怎么定义.
3.2、使用命名空间做微服务隔离
3.2.1、创建多配置文件
也就是同时加载几个配置文件
3.3、使用分组
3.3.1、创建分组
3.3.2、配置分组名称
3.4、几个概念
3.4.1、命名空间
Namespace:命名空间可用于进行不同环境的配置隔离。可以按环境隔离,也可以按微服务隔离。
3.4.2、配置集
Data:所有配置的集合,在系统中,一个配置文件通常就是一个配置集。
3.4.3、配置集ID
Data ID:nacos中的配置文件名称,规范:微服务名称-环境名称.扩展名
3.4.4、配置分组
默认所有的配置集都属于DEFAULT_GROUP分组,不同的分组中可以有相同的配置文件名称。