1.配置管理
微服务配置管理是指对微服务架构中各个服务的配置信息进行管理、更新、查询和审计等操作,以确保系统的正常运行和高效管理。例如,网关路由或某些业务配置在配置文件中写死了,每次修改都要重启服务。每个微服务都有很多重复的配置,维护成本高。这些问题都可以通过统一的配置管理器服务解决。而Nacos不仅仅具备注册中心功能,也具备配置管理的功能。
微服务共享的配置可以统一交给Nacos保存和管理,在Nacos控制台修改配置后,Nacos会将配置变更推送给相关的微服务,并且无需重启即可生效,实现配置热更新。
网关的路由同样是配置,因此同样可以基于这个功能实现动态路由功能,无需重启网关即可修改路由配置。
1.1配置共享
可以把微服务共享的配置抽取到Nacos中统一管理,这样就不需要每个微服务都重复配置了。分为两步:
-
在Nacos中添加共享配置
-
微服务拉取配置
1.1.1.添加共享配置
首先抽取配置中重复的部分,例如jdbc相关配置、日记配置、swagger以及OpenFeign的配置
我们在nacos控制台分别添加这些配置。
首先是jdbc相关配置,在配置管理->配置列表中点击
创建配置:
其中详细的配置如下:
spring:
datasource:
url: jdbc:mysql://${hm.db.host:192.168.150.101}:${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:123}
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的相关参数并没有写死,例如:
-
数据库ip
:通过${hm.db.host:192.168.150.101}
配置了默认值为192.168.150.101
,同时允许通过${hm.db.host}
来覆盖默认值 -
数据库端口
:通过${hm.db.port:3306}
配置了默认值为3306
,同时允许通过${hm.db.port}
来覆盖默认值 -
数据库database
:可以通过${hm.db.database}
来设定,无默认值
然后是统一的日志配置,命名为shared-log.
yaml
,配置内容如下:
logging:
level:
com.hmall: debug
pattern:
dateformat: HH:mm:ss:SSS
file:
path: "logs/${spring.application.name}"
然后是统一的swagger配置,命名为shared-swagger.yaml
,配置内容如下:
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}
注意,这里的swagger相关配置我们没有写死,例如:
-
title
:接口文档标题,我们用了${hm.swagger.title}
来代替,将来可以有用户手动指定 -
email
:联系人邮箱,我们用了${hm.swagger.email:
zhanghuyi@itcast.cn
}
,默认值是zhanghuyi@itcast.cn
,同时允许用户利用${hm.swagger.email}
来覆盖。
1.1.2.拉取共享配置
接下来要在微服务中拉取共享配置。将拉取到的共享配置与本地的application.yaml
配置合并,完成项目上下文的初始化。
不过,需要注意的是,读取Nacos配置是SpringCloud上下文(ApplicationContext
)初始化时处理的,发生在项目的引导阶段。然后才会初始化SpringBoot上下文,去读取application.yaml
也就是说引导阶段,application.yaml
文件尚未读取,根本不知道nacos 地址。
所以通常SpringCloud在初始化上下文的时候会先读取一个名为bootstrap.yaml
(或者bootstrap.properties
)的文件,如果我们将nacos地址配置到bootstrap.yaml
中,那么在项目引导阶段就可以读取nacos中的配置了。
因此,微服务整合Nacos配置管理的步骤如下:
1)引入依赖:
在微服务的pom.xml文件中添加Nacos配置管理的客户端依赖
<!--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
在微服务项目的resources目录下创建一个bootstrap.yml文件:
spring:
application:
name: cart-service # 服务名称
profiles:
active: dev
cloud:
nacos:
server-addr: 192.168.150.101 # nacos地址
config:
file-extension: yaml # 文件后缀名
shared-configs: # 共享配置
- dataId: shared-jdbc.yaml # 共享mybatis配置
- dataId: shared-log.yaml # 共享日志配置
- dataId: shared-swagger.yaml # 共享日志配置
3)修改application.yaml
由于一些配置挪到了bootstrap.yaml,因此application.yaml需要修改。
server:
port: 8082
feign:
okhttp:
enabled: true # 开启OKHttp连接池支持
hm:
swagger:
title: 接口文档
package: com.hmall.cart.controller
db:
database: hm-cart
重启服务,发现所有配置都生效了。
1.2.配置热更新
Nacos支持配置的热更新功能,即在不重启微服务的情况下更新配置信息。这通常通过以下几种方式实现:
前提条件:
1.nacos中要有一个与微服务名有关的配置文件。
2.微服务中要以特定方式读取需要热更新的配置属性(两种方式)
1.使用@RefreshScope
注解:
- 将
@RefreshScope
注解应用于需要动态刷新的类或方法上。当Nacos上的属性值发生变化时,通过调用/actuator/refresh
端点来刷新被@RefreshScope
注解的类或方法。
@Data
@ConfigurationProperties(prefix = "hm.cart")
public class CartProperties {
private int maxItems;
}
2.使用@ConfigurationProperties
注解:
@ConfigurationProperties
注解允许我们将配置文件中的属性绑定到 Java Bean 上。从而可以非常灵活地将外部配置(比如 application.properties 或 application.yml 文件中的配置)映射到我们的组件中。
@Data
@RefreshScope
public class CartProperties {
@Value("${hm.cart.maxItems}")
private int maxItems;
}
案例实现:实现购物车添加商品上限的配置热更新
需求:购物车的限定数量目前是写死在业务中的,将其改为读取配置文件属性,并将配置交给Nacos管理,实现热更新。
接着,我们在微服务中读取配置,实现配置热更新。
在微服务中新建一个属性读取类,代码如:
package com.hmall.cart.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@Component
@ConfigurationProperties(prefix = "hm.cart")
public class CartProperties {
private Integer maxAmount;
}
接着,在业务中使用该属性加载类:
我们在nacos控制台,将购物车上限配置为5:
无需重启服务,配置热更新就生效了。