前言
在分布式系统中,配置管理是非常关键的一环。Nacos(Dynamic Naming and Configuration Service)作为一个易于使用的动态服务发现、配置和服务管理平台,广泛应用于微服务架构中。Nacos 提供了强大的配置共享和热更新功能,使得开发者能够方便地在不同的应用和环境中管理和更新配置,减少了配置同步和管理的复杂性。
本篇博客将重点讨论如何实现 Nacos 配置的共享,以及如何利用 Nacos 的热更新功能,确保系统配置的高效管理和即时生效。
配置管理
- 微服务重复配置过多,维护成本高
- 业务配置经常变动,每次修改都要重启服务
- 网关路由配置写死,如果变更要重启网关
配置共享
一、添加一些共享配置到Nacos中,包括:Jdbc、MybatisPlus、日志、Swagger、OpenFeign等配置
进入http://你的nacos地址:端口号/nacos,登录后
在表单中填写信息
jdbc、Mybatis具体配置内容如下:
spring:
datasource:
url: jdbc:mysql://${hm.db.host:192.168.244.134}:${hm.db.port:3306}/${hm.db.database}?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.cj.jdbc.Driver
username: ${hm.db.un:root}
password: ${hm.db.pw:1234}
mybatis-plus:
configuration:
default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler
global-config:
db-config:
update-strategy: not_null
id-type: auto
jdbc:mysql://${hm.db.host:192.168.244.134}: ${hm.db.port:3306}/${hm.db.database} 采用了占位符来允许外部配置变量来动态替换,例如 hm.db.host 为 MySQL 主机地址,hm.db.port 为数据库端口,hm.db.database 为数据库名称。如果这些配置没有被指定,则默认使用 192.168.244.134 作为主机,3306 作为端口,hm.db.database 对应的数据库名。

日志配置具体如下
logging:
level:
com.hmall: debug
pattern:
dateformat: HH:mm:ss:SSS
file:
path: "logs/${spring.application.name}"
共享的swagger配置具体如下:
knife4j:
enable: true
openapi:
title: ${hm.swagger.title:黑马商城接口文档}
description: ${hm.swagger.description:黑马商城接口文档}
email: ${hm.swagger.email:zhanghuyi@itcast.cn}
concat: ${hm.swagger.concat:虎哥}
url: https://www.itcast.cn
version: v1.0.0
group:
default:
group-name: default
api-rule: package
api-rule-resources:
- ${hm.swagger.package}
二、基于NacosConfig拉取共享配置代替微服务的本地配置,
拉取共享配置
基于NacosConfig拉取共享配置代替微服务的本地配置。
(1)引入依赖
<!--nacos配置管理-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--读取bootstrap文件-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
(2)新建bootstrap.yaml文件
spring:
application:
name: cart-service # 服务名称
profiles:
active: dev
cloud:
nacos:
server-addr: 192.168.244.134:8848 # nacos地址
config:
file-extension: yaml # 文件后缀名
shared-configs: # 共享配置
- dataId: shared-jdbc.yaml # 共享mybatis配置
- dataId: shared-log.yaml # 共享日志配置
- dataId: shared-swagger.yaml # 共享日志配置
修改后的application.yaml文件内容如下:
server:
port: 8082
feign:
okhttp:
enabled: true
hm:
db:
database: hm-cart
swagger:
title: "黑马商城购物车接口文档"
package: com.hmall.cart.controller
配置热更新
配置热更新:当修改配置文件中的配置时,微服务无需重启即可使配置生效
前提条件:
1.nacos中要有一个与微服务名有关的配置文件
2.微服务中要以特定的方式读取需要的热更新的配置属性
@Data
@ConfigurationPrpperties(prefix="hm.cart")
public class CartProperties {
private int maxItems;
}
@Data
@Refreshscope
public class CartProperties{
@Value("${hm.cart.maxItems}")
private int maxItems;
}
需求:购物车的限定数量目前是写死在业务中的,将其改为读取配置文件属性,并将配置交给Nacos管理,实现热更新。
修改对应的CartServiceImpl类
@Service
@RequiredArgsConstructor
public class CartServiceImpl extends ServiceImpl<CartMapper, Cart> implements ICartService {
...
private final CartProperties cartProperties;
...
private void checkCartsFull(Long userId) {
int count = lambdaQuery().eq(Cart::getUserId, userId).count();
if (count >= cartProperties.getMaxItem()) {
throw new BizIllegalException(StrUtil.format("用户购物车课程不能超过{}", cartProperties.getMaxItem()));
}
}
在nacos中添加一个配置文件,将购物车的上限数量添加到配置中
hm:
cart:
maxAmount: 2 #购物车商品数量上限
重启服务后测试
后续需要修改购物车的商品最高限制要求直接去nacos的配置cart-service.yaml中修改,且不需要再重启服务。
总结
在分布式系统中,配置管理是非常关键的一环。Nacos(Dynamic Naming and Configuration Service)作为一个易于使用的动态服务发现、配置和服务管理平台,广泛应用于微服务架构中。Nacos 提供了强大的配置共享和热更新功能,使得开发者能够方便地在不同的应用和环境中管理和更新配置,减少了配置同步和管理的复杂性。
本篇博客将重点讨论如何实现 Nacos 配置的共享,以及如何利用 Nacos 的热更新功能,确保系统配置的高效管理和即时生效。