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

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

💥 该系列属于【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,然后重新发布:

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

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

相关推荐
考虑考虑17 小时前
Jpa使用union all
java·spring boot·后端
用户37215742613517 小时前
Java 实现 Excel 与 TXT 文本高效互转
java
浮游本尊18 小时前
Java学习第22天 - 云原生与容器化
java
渣哥20 小时前
原来 Java 里线程安全集合有这么多种
java
间彧20 小时前
Spring Boot集成Spring Security完整指南
java
间彧20 小时前
Spring Secutiy基本原理及工作流程
java
Java水解21 小时前
JAVA经典面试题附答案(持续更新版)
java·后端·面试
洛小豆1 天前
在Java中,Integer.parseInt和Integer.valueOf有什么区别
java·后端·面试
前端小张同学1 天前
服务器上如何搭建jenkins 服务CI/CD😎😎
java·后端
ytadpole1 天前
Spring Cloud Gateway:一次不规范 URL 引发的路由转发404问题排查
java·后端