• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
打工人丶
博客园    首页    新随笔    联系   管理    订阅  订阅

Springcloud Alibaba-9-配置中心

前言:
在微服务架构中,分散在各个微服务中,不好统一配置和管理,微服务项目可能会有多个环境,而现在配置文件无法区分环境。修改了配置文件之后,必须重新启动微服务才能使配置生效,而现在不能实时更新


配置中心的思路:

  1. 把项目中各种配置全部都放到一个集中的地方进行统一管理,并提供一套标准的接口。

  2. 当各个服务需要获取配置的时候,就来配置中心的接口拉取自己的配置。

  3. 当配置中心中的各种参数有更新的时候,也能通知到各个服务实时的过来同步最新的信息,使之动态更新。







常见配置中心

  • 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 配置中心解析——————启动时

  1. 观察启动后打印的日志,大体能看出操作原理。项目启动,先加载bootstrap.yml解析里面配置,得到3个核心信息
  • 服务名:service-order
  • nacos配置中心地址:127.0.0.1:8848
  • 激活环境:dev
  • 组:没有指定具体分组,默认:DEFAULT_GROUP
  1. 访nacos配置中心找项目的配置文件
    根据组 + 服务名 + 激活环境。找到了配置文件:DEFAULT_GROUP组下的service-order-dev.yml




1.6 配置中心解析——————在nacos配置中心创建时

  1. Data ID:Nacos 中的某个配置集的 ID。默认与所在服务的实例名一致。即:若你的服务名为 a 则默认会去nacos配置中心找为 a.properties的配置文件。
        后缀名默认是properties,如果你在配置文件不指定后缀,他默认就去找你服务实例名.properties配置文件。

  2. 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-链路追踪为例。

  1. 在nacos中定义一个DataID为global-config.yml的配置,用于所有微服务共享。

  2. 在订单微服务的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 # 环境标识
  1. 在控制器中新增一个方法
@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空间里面。】

  1. 在nacos配置文件中,新增2个配置文件order1.yml,order2.yml

  2. 配置文件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 # 环境标识
  1. 控制器新增方法
@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;
	}
}
posted @ 2024-03-07 14:03  &emsp;不将就鸭  阅读(51)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3