Saul's blog Saul's blog
首页
后端
分布式
前端
更多
分类
标签
归档
友情链接
关于
GitHub (opens new window)

Saul.J.Wu

立身之本,不在高低。
首页
后端
分布式
前端
更多
分类
标签
归档
友情链接
关于
GitHub (opens new window)
  • Java入门基础

  • Java核心基础

  • 设计模式

  • Web开发

  • SpringBoot

  • 微服务

    • Feign声明式远程调用
    • nacos注册中心
    • nacos配置中心
      • 官方文档
      • 如何接入?
        • 引入依赖
        • 配置nacos config元数据
        • 打开动态刷新功能
      • 验证
      • 配置中心进阶
        • 核心概念
        • 同时加载多个配置集
      • 总结
    • SpringCloud Gateway网关
    • 阿里云OSS上传功能
    • 分布式组件 SpringCloud Alibaba 简单接触
  • Elasticsearch

  • 运维

  • 后端
  • 微服务
SaulJWu
2020-08-17

nacos配置中心

为什么要有配置中心,当我们服务上线发布以后,需要更改配置,只需要从配置中心获取配置数据,就可以用了。不需要重新编译打包发布上线,如果是一台机器还好,如果是10台机器,非常麻烦,故此需要配置中心,统一集中管理。

# 官方文档

https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/nacos-example/nacos-config-example/readme-zh.md

# 如何接入?

# 引入依赖

 <dependency>
     <groupId>com.alibaba.cloud</groupId>
     <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
 </dependency>
1
2
3
4

每一个服务都有可能使用配置中心,所以导入到common模块下

# 配置nacos config元数据

在应用的 /src/main/resources/bootstrap.properties 配置文件中配置 Nacos Config 元数据

spring.application.name=nacos-config-example
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
1
2

没有bootstrap.properties,则自己新建一个

# 打开动态刷新功能

完成上述两步后,应用会从 Nacos Config 中获取相应的配置,并添加在 Spring Environment 的 PropertySources 中。这里我们使用 @Value 注解来将对应的配置注入到 SampleController 的 userName 和 age 字段,并添加 @RefreshScope 打开动态刷新功能

 @RefreshScope
 class SampleController {

 	@Value("${user.name}")
 	String userName;

 	@Value("${user.age}")
 	int age;
 }
1
2
3
4
5
6
7
8
9

# 验证

# com.elite.mall.coupon.controller.CouponController
 
@RefreshScope
@RestController
@RequestMapping("coupon/coupons")
public class CouponController {
    @Autowired
    private CouponService couponService;

    @Value("${coupon.user.name}")
    private String name;

    @Value("${coupon.user.age}")
    private Integer age;

    @GetMapping("/test")
    public CommonResult test(){
        return CommonResult.ok().put("name", name).put("age", age);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

访问这个接口,返回

{"msg":"success","code":200,"name":"zhangsan","age":18}
1

浏览器去nacos里的配置列表,点击+号,data ID:elitemall-coupon.properties,配置

coupon.user.name=test223
coupon.user.age=66
1
2

点击发布。

再去访问接口

{"msg":"success","code":200,"name":"test223","age":66}
1

很明显,这里我们已经实现了动态配置了,以后有类似的情况,所有的机器都可以从配置中心获取配置,不需要重新编码打包发布,重启服务器。

# 配置中心进阶

首先我们了解几个核心概念:

  • 命名空间
  • 配置集
  • 配置集ID
  • 配置分组

了解清楚了这么几个概念,就可以对配置中心应用自如

# 核心概念

# 命名空间

命名空间,来做配置隔离。

默认的命名空间是public,所有新增的配置都是在public下。

例子:利用命名空间来做环境隔离。

开发有一堆配置,测试有一堆配置。

我们就可以在nacos下新建3种命名空间,dev,test,prod,每种命名空间新建时有一个uuid。

在微服务的bootstrap.properties指定命名空间,就可以用了:

spring.cloud.nacos.config.namespace=#命名空间的uuid
1

重启微服务。

例子:基于每个微服务互相隔离

场景:比如现在服务众多,每个微服务有众多配置文件,但是只有3种命名空间,这样非常混乱,我们可以基于每个微服务创建一个自己的命名空间,这样每个微服务只加载自己命名空间下的配置。

比如,在nacos为coupon/member微服务等各自创建一个命名空间,同时修改bootstrap.properties使用指定的命名空间。

一个个命名空间创建太麻烦,可以用选中public下的配置,直接克隆到coupon/member命名空间下,就可以了。

# 配置集

一组相关或不相关配置项的集合。

说白了,在微服务模块下的application.yml中存在很多配置,我们把这些配置称为配置集。

# 配置集ID

配置集id类似文件名。就是nacos新建时的Data Id。

比如xxx.properties

# 配置分组

默认所有的配置集都属于:DEFAULT_GROUP

所有的组别,都是可以基于业务来定制,比如双11,比如618,比如双12

在nacos创建配置时,可以自定义组名

image-20201001224623122

现在可以看到同一个命名空间下的,有两个同名的配置,但是他们的分组不一样,只需要去微服务的bootstrap.properties指定使用什么分组

# 更改配置分组
spring.cloud.nacos.config.group=1111
1
2

重启微服务就可以了,有测试接口试试,就可以得到该分组下的数据。

在基于微服务隔离命名空间时,可以在该微服务的命名空间下,创建dev/test/prod分组

# 同时加载多个配置集

如果我们需要加载多个配置文件,可以用ext-config来配置

spring.cloud.nacos.config.ext-config[0].data-id=app.properties
spring.cloud.nacos.config.ext-config[0].group=multi-data-ids
spring.cloud.nacos.config.ext-config[0].refresh=true

spring.cloud.nacos.config.ext-config[1].data-id=user.properties
spring.cloud.nacos.config.ext-config[1].group=multi-data-ids
spring.cloud.nacos.config.ext-config[1].refresh=true
1
2
3
4
5
6
7

通常,当使用某些配置时,会优先使用配置中心的配置,否则就使用配置文件的配置

场景

随着业务不断的壮大,微服务可能有许多配置,配置越来越多,如果放在微服务模块下的yml或者properties会又多又乱,不便于统一管理。都是来拆分出配置文件,比如跟数据源有关的我们放在datasource.properties,和mybatis有关的配置放在mybatis.properties。

把微服务模块下yml拆分3个yml,放在nacos配置中心

image-20201001230008668

在微服务模块的bootstrap.properties下写入就可以了

# 总结

微服务任何配置信息,任何配置文件,都可以放在配置中心中

如何同时加载多个配置集?

  1. 在bootstrap.properties指定命名空间,指定使用分组
  2. 在controller中,使用@Value,@ConfigurationProperties

配置中心的配置会被优先使用。

在平时开发中,还是建议在本地的yml配置文件填写,比较方便,当项目上线时,才把所有配置放到配置中心。

帮我改善此页面 (opens new window)
#nacos#配置中心#微服务
上次更新: 2020/12/17, 08:38:35
nacos注册中心
SpringCloud Gateway网关

← nacos注册中心 SpringCloud Gateway网关→

最近更新
01
zabbix学习笔记二
02-28
02
zabbix学习笔记一
02-10
03
Linux访问不了github
12-08
更多文章>
Theme by Vdoing | Copyright © 2020-2022 Saul.J.Wu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式