Springcloud Alibaba-9-配置中心
前言:
在微服务架构中,分散在各个微服务中,不好统一配置和管理,微服务项目可能会有多个环境,而现在配置文件无法区分环境。修改了配置文件之后,必须重新启动微服务才能使配置生效,而现在不能实时更新
配置中心的思路:
-
把项目中各种配置全部都放到一个集中的地方进行统一管理,并提供一套标准的接口。
-
当各个服务需要获取配置的时候,就来配置中心的接口拉取自己的配置。
-
当配置中心中的各种参数有更新的时候,也能通知到各个服务实时的过来同步最新的信息,使之动态更新。
常见配置中心
- Apollo
Apollo是由携程开源的分布式配置中心。特点有很多,比如:配置更新之后可以实时生效,支持灰
度发布功能,并且能对所有的配置进行版本管理、操作审计等功能,提供开放平台API。并且资料
也写的很详细。
- Disconf
Disconf是由百度开源的分布式配置中心。它是基于Zookeeper来实现配置变更后实时通知和生效
的。
- SpringCloud Config
这是Spring Cloud中带的配置中心组件。它和Spring是无缝集成,使用起来非常方便,并且它的配
置存储支持Git。不过它没有可视化的操作界面,配置的生效也不是实时的,需要重启或去刷新。
- Nacos
这是SpingCloud alibaba技术栈中的一个组件,前面我们已经使用它做过服务注册中心。其实它也
集成了服务配置的功能,我们可以直接使用它作为服务配置中心。
1. Nacos Config入门,以Springcloud Alibaba-8-链路追踪为例
使用nacos作为配置中心,其实就是将nacos当做一个服务端,将各个微服务看成是客户端,我们将各个微服务的配置文件统一存放在nacos上,然后各个微服务从nacos上拉取配置即可。
1.1 在商品微服务中引入配置中心的依赖(只以订单微服务为例)
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
1.2 在商品微服务中添加nacos config的配置
注意:不能使用原来的application.yml
作为配置文件,而是新建一个bootstrap.yml
作为配置文件
配置文件优先级(由高到低):
bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml
#创建一个bootstrap.yml,添加如下内容。
#配置文件必须是bootstrap.properties或bootstrap.yml,主要用来配置:配置中心的地址。
#该文件除了配置nacos的地址,该文件还必须配置spring.application.name,是因为它是构成 Nacos 配置管理 dataId字段的一部分,必须在这个文件里面配置
spring:
application:
name: service-order
cloud:
nacos:
config:
server-addr: localhost:8848 #nacos中心地址
username: nacos # 默认nacos
password: nacos # 默认nacos
namespace: public # 默认public # 默认会有一个public空间,它不能被你删除。你在创建配置的时候,若不指定namespace,则默认找public下的
group: DEFAULT_GROUP # 默认DEFAULT_GROUP
prefix: service-order # 默认名为${spring.application.name}的服务。 # 如果你想让指定配置文件名字,就用prefix属性。如:prefix: abc.yml,则该服务会去拉取 abc.yml 配置的内容。
file-extension: yml # 默认为properties,用于指定nacos配置中心的文件扩展名。支持:TEXT JSON XML YAML HTML Properties
profiles:
active: dev # 环境标识
1.3 在nacos中的配置列表中添加配置,然后把商品微服务application.yml配置复制到配置内容中
1.4 注释本地的application.yml中的内容, 启动程序进行测试
如果依旧可以成功访问程序,说明我们nacos的配置中心功能已经实现
1.5 配置中心解析——————启动时
- 观察启动后打印的日志,大体能看出操作原理。项目启动,先加载bootstrap.yml解析里面配置,得到3个核心信息
- 服务名:service-order
- nacos配置中心地址:127.0.0.1:8848
- 激活环境:dev
- 组:没有指定具体分组,默认:DEFAULT_GROUP
- 访nacos配置中心找项目的配置文件
根据组 + 服务名 + 激活环境
。找到了配置文件:DEFAULT_GROUP组下的service-order-dev.yml
1.6 配置中心解析——————在nacos配置中心创建时
-
Data ID:Nacos 中的某个配置集的 ID。默认与所在服务的实例名一致。即:若你的服务名为 a 则默认会去nacos配置中心找为 a.properties的配置文件。
后缀名默认是properties,如果你在配置文件不指定后缀,他默认就去找你服务实例名.properties配置文件。 -
Group:组配置集,是组织配置的维度之一。通过一个有意义的字符串(如 Buy 或 Trade )对配置集进行分组,从而区分 Data ID 相同的配置集。
组名默认去找DEFAULT_GROUP,你可以自定义配置
2. 配置动态刷新
动态刷新:项目运行中,手动改了nacos中的配置,项目在不停机的情况下也可以读到最新的数据。
2.1 在nacos中的service-order-dev.yml配置项中添加下面配置
appConfig:
name: 哇哈哈
2.2 在订单微服务中新增一个方法
@RefreshScope 操作原理:当配置发生更新时,贴有@RefreshScope注解的类会重新IOC创建新的对象,该类中加载的数据重新更新。
@RefreshScope // nacos的动态刷新
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private OrderService orderService;
@Value("${appConfig.name}")
private String appConfigName;
@GetMapping("/nacosConfig")
public String nacosConfig(){
return "动态刷新:"+appConfigName;
}
}
3. nacos配置不同环境的配置文件
在SpringBoot为我们开发时提供了不同环境的支持。只需要为不同的环境编写专门的配置文件。
如:application-dev.yml、application-prod.yml, 启动项目时只需要增加一个命令参数 --spring.profiles.active=环境名称 即可。
nacos也可以同时支持多环境配置。只需要在nacos配置中心中根据dataId进行区分即可。
如:你只需要在nacos配置中心,也创造application-dev.yml、application-prod.yml。在bootstrap.yml指定想启动的环境配置。
============================
要求:配置文件命名格式:${prefix}-${spring.profiles.active}.${file-extension}
- spring.cloud.nacos.config.prefix:默认spring.application.name 的值。
- spring.cloud.nacos.config.file-extension:默认.properties。
- spring.profiles.active:默认null,指定当前项目启用的环境。
4. 同一个微服务/不同微服务环境下,配置文件的共享
4.1 同一个微服务环境下,配置文件的共享
我们只需要写一个以:spring.application.name 命名的配置文件即可。
比如:
application-dev.yml ,application-test.yml ,application-prod.yml
将三种环境相同的配置提取出来,放到公共文件名:application.yml。
如此一来,每次操作都会加载application.yml,达到了不同环境下配置文件的共享。
4.2 不同微服务环境下,配置文件的共享
不同为服务之间也可以实现配置共享,原理有点类似于文件引入,就是定义一个公共配置文件,然后在当前配置文件中引入进来。
我们以Springcloud Alibaba-8-链路追踪为例。
-
在nacos中定义一个DataID为global-config.yml的配置,用于所有微服务共享。
-
在订单微服务的bootstrap.yml中,引入该配置文件。
spring:
application:
name: service-order
cloud:
nacos:
config:
server-addr: localhost:8848 #nacos中心地址
file-extension: yml # 配置文件格式
shared-configs:
- data-id: global-config.yml # 配置要引入的配置
refresh: true # 表示是否开启动态刷新
profiles:
active: dev # 环境标识
- 在控制器中新增一个方法
@RefreshScope
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private OrderService orderService;
@Value("${appConfig.name}")
private String appConfigName;
@Value("${globalConfig}")
private String globalConfig;
@GetMapping("/nacosConfig")
public String nacosConfig(){
return "动态刷新:"+appConfigName;
}
@RequestMapping("/nacosConfig2")
public String nacosConfig2(){
return "全局配置:"+globalConfig;
}
}
5. Nacos加载多配置集
如果现在你想加载多个配置,那些配置并不是要公共使用,只是你这个服务需要加载哪些配置,你可以使用 extension-configs。【使用要求限制:你要多加载的那几个配置必须在你的namespace空间里面。】
-
在nacos配置文件中,新增2个配置文件order1.yml,order2.yml
-
配置文件bootstrap.yml中添加新配置
spring:
application:
name: service-order
cloud:
nacos:
config:
server-addr: localhost:8848 #nacos中心地址
file-extension: yml # 配置文件格式
shared-configs:
- data-id: global-config.yml # 配置要引入的配置
refresh: true # 表示是否开启动态刷新
extension-configs: # 加载多配置集
- data-id: order1.yml
refresh: true
- data-id: order2.yml
refresh: true
profiles:
active: dev # 环境标识
- 控制器新增方法
@RefreshScope
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private OrderService orderService;
@Value("${appConfig.name}")
private String appConfigName;
@Value("${globalConfig}")
private String globalConfig;
@Value("${name}")
private String name;
@Value("${age}")
private String age;
@GetMapping("/nacosConfig")
public String nacosConfig(){
return "动态刷新:"+appConfigName;
}
@GetMapping("/nacosConfig2")
public String nacosConfig2(){
return "全局配置:"+globalConfig;
}
@GetMapping("/manyConfig")
public String manyConfig(){
return "加载多个配置集:" + name + "," + age;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
2021-03-07 I/O流使用详解