微服务:配置管理和配置热更新

参考:黑马程序员之微服务

💥 该系列属于【SpringBoot基础】专栏,如您需查看其他SpringBoot相关文章,请您点击左边的连接

目录

一、引言

二、配置共享

[1. 添加共享配置到nacos](#1. 添加共享配置到nacos)

[(1)jdbc的共享配置 shared-jdbc.yaml](#(1)jdbc的共享配置 shared-jdbc.yaml)

[(2)日志的共享配置 shared-log.yaml](#(2)日志的共享配置 shared-log.yaml)

[(3)swagger共享配置 shared-swagger.yaml](#(3)swagger共享配置 shared-swagger.yaml)

[2. 微服务从nacos拉取共享配置](#2. 微服务从nacos拉取共享配置)

(1)引入依赖

(2)新建bootstrap.yaml

(3)修改application.yaml

(4)测试

三、配置热更新

[1. 添加配置到Nacos](#1. 添加配置到Nacos)

[2. 配置热更新](#2. 配置热更新)


一、引言

微服务有几个问题需要解决:

  • 网关路由在配置文件中写死了,如果变更必须重启微服务

  • 某些业务配置在配置文件中写死了,每次修改都要重启服务

  • 每个微服务都有很多重复的配置,维护成本高

这些问题都可以通过统一的配置管理器服务解决。而Nacos不仅仅具备注册中心功能,也具备配置管理的功能:

二、配置共享

以把微服务共享的配置抽取到Nacos中统一管理,这样就不需要每个微服务都重复配置了。分为两步:

  • 在Nacos中添加共享配置

  • 微服务拉取配置

1. 添加共享配置到nacos

在nocos的配置列表中新建配置:

(1)jdbc的共享配置 shared-jdbc.yaml

bash 复制代码
spring:
  datasource:
    url: jdbc:mysql://${hm.db.host:192.168.88.128}:${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:wangjx17}

mybatis-plus:
  configuration:
    default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler
  global-config:
    db-config:
      update-strategy: not_null
      id-type: auto

(2)日志的共享配置 shared-log.yaml

bash 复制代码
logging:
  level:
    com.hmall: debug
  pattern:
    dateformat: HH:mm:ss:SSS
  file:
    path: "logs/${spring.application.name}"

(3)swagger共享配置 shared-swagger.yaml

bash 复制代码
knife4j:
  enable: true
  openapi:
    title: ${hm.swagger.title:黑马商城接口文档}
    description: ${hm.swagger.desc:黑马商城接口文档}
    email: zhanghuyi@itcast.cn
    concat: 虎哥
    url: https://www.itcast.cn
    version: v1.0.0
    group:
      default:
        group-name: default
        api-rule: package
        api-rule-resources:
          - ${hm.swagger.package}

2. 微服务从nacos拉取共享配置

接下来,我们要在微服务拉取共享配置。将拉取到的共享配置与本地的application.yaml配置合并,完成项目上下文的初始化。

不过,读取Nacos配置是SpringCloud上下文(ApplicationContext)初始化时处理的,发生在项目的引导阶段。然后才会初始化SpringBoot上下文,去读取application.yaml

也就是说引导阶段,application.yaml文件尚未读取,根本不知道nacos 地址,该如何去加载nacos中的配置文件呢?

SpringCloud在初始化上下文的时候会先读取一个名为bootstrap.yaml(或者bootstrap.properties)的文件,如果我们将nacos地址配置到bootstrap.yaml中,那么在项目引导阶段就可以读取nacos中的配置了。

(1)引入依赖

在cart-service模块引入依赖:

XML 复制代码
  <!--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

在cart-service中的resources目录新建一个bootstrap.yaml文件:

bash 复制代码
spring:
  application:
    name: cart-service # 服务名称
  profiles:
    active: dev
  cloud:
    nacos:
      server-addr: 192.168.88.128 # nacos地址
      config:
        file-extension: yaml # 文件后缀名
        shared-configs: # 共享配置
          - dataId: shared-jdbc.yaml # 共享mybatis配置
          - dataId: shared-log.yaml # 共享日志配置
          - dataId: shared-swagger.yaml # 共享日志配置

(3)修改application.yaml

bash 复制代码
server:
  port: 8082
feign:
  okhttp:
    enabled: true # 开启OKHttp连接池支持
hm:
  swagger:
    title: 购物车服务接口文档
    package: com.hmall.cart.controller
  db:
    database: hm-cart

(4)测试

购物车正常查询,因此共享配置全部生效。

三、配置热更新

有很多的业务相关参数,将来可能会根据实际情况临时调整。例如购物车业务,购物车数量有一个上限,默认是10,对应代码如下:

现在这里购物车是写死的固定值,我们应该将其配置在配置文件中,方便后期修改。

但现在的问题是,即便写在配置文件中,修改了配置还是需要重新打包、重启服务才能生效。能不能不用重启,直接生效呢?

这就要用到Nacos的配置热更新能力了,分为两步:

  • 在Nacos中添加配置

  • 在微服务读取配置

1. 添加配置到Nacos

首先,我们在nacos中添加一个配置文件,将购物车的上限数量添加到配置中:

bash 复制代码
hm:
  cart:
    maxAmount: 1 # 购物车商品数量上限

注意文件的dataId格式:

[服务名]-[spring.active.profile].[后缀名]

文件名称由三部分组成:

  • 服务名 :我们是购物车服务,所以是cart-service

  • spring.active.profile :就是spring boot中的spring.active.profile,可以省略,则所有profile共享该配置

  • 后缀名:例如yaml

这里我们直接使用cart-service.yaml这个名称,则不管是dev还是local环境都可以共享该配置

2. 配置热更新

接着,我们在微服务中读取配置,实现配置热更新。

cart-service中新建一个属性读取类:

接着,在业务中使用该属性加载类:

重启springboot测试:

此时购物车有一件商品:

再次添加:

把nocos的maxAmount配置修改成3,然后重新发布:

无需重启,再次测试购物车功能:

无需重启服务,配置热更新就生效了!

相关推荐
小曲程序7 分钟前
vue3 封装request请求
java·前端·typescript·vue
凡人的AI工具箱21 分钟前
15分钟学 Go 第 60 天 :综合项目展示 - 构建微服务电商平台(完整示例25000字)
开发语言·后端·微服务·架构·golang
陈王卜24 分钟前
django+boostrap实现发布博客权限控制
java·前端·django
小码的头发丝、24 分钟前
Spring Boot 注解
java·spring boot
午觉千万别睡过27 分钟前
RuoYI分页不准确问题解决
spring boot
java亮小白199729 分钟前
Spring循环依赖如何解决的?
java·后端·spring
飞滕人生TYF36 分钟前
java Queue 详解
java·队列
跳跳的向阳花36 分钟前
03-03、SpringCloud第三章,负载均衡Ribbon和Feign
spring cloud·ribbon·负载均衡
2301_811274311 小时前
大数据基于Spring Boot的化妆品推荐系统的设计与实现
大数据·spring boot·后端
武子康1 小时前
大数据-230 离线数仓 - ODS层的构建 Hive处理 UDF 与 SerDe 处理 与 当前总结
java·大数据·数据仓库·hive·hadoop·sql·hdfs