继上一篇 微服务系列:Spring Cloud Alibaba 之 Nacos 注册中心 学习之后,今天我们来学习 Nacos
的另一个重要特性: 配置中心。
话不多说,开始今天的学习。
基本介绍
1. 什么是配置中心
在微服务架构中,当系统从一个单体应用,被拆分成分布式系统上一个个服务节点后,配置文件也必须跟着迁移(分割),这样配置就分散了,不仅如此,分散中还包含着冗余,如下图:
总得来说,配置中心就是一种统一管理各种应用配置的基础服务组件。
2. 为什么要使用配置中心
- 配置实时生效:
传统的静态配置方式要想修改某个配置只能修改之后重新发布应用,要实现动态性,可以选择使用数据库,通过定时轮询访问数据库来感知配置的变化。轮询频率低感知配置变化的延时就长,轮询频率高,感知配置变化的延时就短,但比较损耗性能,需要在实时性和性能之间做折中。配置中心专门针对这个业务场景,兼顾实时性和一致性来管理动态配置。
- 配置管理流程:
配置的权限管控、灰度发布、版本管 理、格式检验和安全配置等一系列的配置管理相关的特性也是配置中心不可获取的一部分。
配置中心将配置从各应用中剥离出来,对配置进行统一管理,应用自身不需要自己去管理配置。
3. Nacos 配置中心
Nacos
是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
配置中心的服务流程如下:
1、用户在配置中心更新配置信息。
2、服务A和服务B及时得到配置更新通知,从配置中心获取配置。
下载方式
nacos
的下载方式和启动在上一篇 微服务系列:Spring Cloud Alibaba 之 Nacos 注册中心 文章中已描述,这里就不再赘述。
如何使用
1、添加依赖
<!-- springcloud alibaba nacos config -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- SpringBoot Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2、在bootstrap.yml
添加Nacos配置
server:
port: 9201
# Spring
spring:
application:
# 应用名称
name: cloud-nacos-provider
profiles:
# 环境配置
active: dev
cloud:
nacos:
discovery:
# 服务注册地址
server-addr: 127.0.0.1:8848
config:
# 配置中心地址
server-addr: 127.0.0.1:8848
# 配置文件格式
file-extension: yml
# 共享配置
shared-configs:
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
注意是 bootstrap.yml
,
配置文件加载的优先级(由高到低)
bootstrap.properties ->bootstrap.yml -> application.properties -> application.yml
说明:之所以需要配置 spring.application.name
,是因为它是构成 Nacos 配置管理 dataId
字段的一部分。
在 Nacos Spring Cloud 中,dataId
的完整格式如下:
${prefix}-${spring.profiles.active}.${file-extension}
prefix
默认为spring.application.name
的值,也可以通过配置项spring.cloud.nacos.config.prefix
来配置。spring.profiles.active
即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当spring.profiles.active
为空时,对应的连接符-
也将不存在,dataId 的拼接格式变成${prefix}.${file-extension}
,其实就算spring.profiles.active
不为空,使用${prefix}.${file-extension}
同样可以找到对应配置。file-exetension
为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension
来配置。目前只支持properties
和yaml
类型。
和同事一起开发项目的时候可以这样配置:
server:
port: 9211
# Spring
spring:
application:
# 应用名称
name: cloud-nacos-provider-ezhang # 此处后缀改成自己名字,防止和别人实例名一样出现负载均衡
profiles:
# 环境配置
active: dev
cloud:
nacos:
discovery:
# 服务注册地址
server-addr: 127.0.0.1:8848
config:
# 配置中心地址
server-addr: 127.0.0.1:8848
# 配置文件格式
file-extension: yml
# 共享配置
shared-configs:
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
# 配置文件前缀
prefix: cloud-nacos-provider
配上 spring.cloud.nacos.config.prefix
修改 spring.application.name
值为自己开发环境独有的,不和其他同事的实例名相同。但同时还需要在 gateway 网关中配置自己开发环境独有的路由
spring:
cloud:
gateway:
routes:
- id: cloud-nacos-provider-ezhang
uri: lb://cloud-nacos-provider-ezhang
predicates:
- Path=/ytb/**
3、在 nacos
控制台添加两个数据集(Data Id)
application-dev.yml
为共享配置
cloud-nacos-provider-dev.yml
为私有配置
4、编写测试类在Controller
类中通过@Value
注解获取配置值。
@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {
@Value("${ezhang.useConfig:false}")
private boolean useConfig;
@Value("${version}")
private String version;
@RequestMapping("/get")
public String get() {
String str1 = "共享配置:" + useConfig;
String str2 = "私有配置:" + version;
return str1 + "," +str2;
}
}
5、浏览器访问:http://localhost:9201/config/get
返回正确数据表示测试通过。
动态刷新
相信你也注意到上面测试类中的 @RefreshScope
注解了,这个注解是 Spring Cloud 原生注解,是用来实现配置自动更新的。
测试类加上这个注解之后我们重新发布配置之后,就不用重启项目就可以自动更新了,当然,像是数据库连接这种的肯定还是需要重启项目的了。
我们改个配置试一下:
发布后重新访问地址 http://localhost:9201/config/get
配置已经自动更新了。
MySQL 支持
启动 Nacos
时我们可以看到这样一行日志:
Nacos started successfully in stand alone mode. use embedded storage
use embedded storage
表示使用的是内置数据源。
上面的这些配置都是存储在 Nacos
自带的嵌入式数据库中的,不方便观察数据存储的基本情况,所以在 0.7 版本增加了支持 MySQL
数据源能力,具体的操作步骤:
-
- 安装数据库,版本要求:5.6.5+
-
- 初始化 mysql 数据库,数据库初始化文件:
nacos-mysql.sql
- 初始化 mysql 数据库,数据库初始化文件:
-
- 修改
conf/application.properties
文件,增加支持 mysql 数据源配置(目前只支持 MySQL ),添加 MySQL 数据源的 url、用户名和密码。
- 修改
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=nacos_devtest
db.password=youdontknow
这个application.properties
和 nacos-mysql.sql
指nacos
的解压目录nacos/conf
目录下的文件
再以单机模式启动 Nacos,Nacos 所有写嵌入式数据库的数据都写到了 MySQL。
控制台手册
这个直接查看官方文档就好了,官方文档讲的也挺清楚了。
PS:都看到这里了,点个赞吧,彦祖!