微服务——配置管理

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配置管理的客户端依赖

java 复制代码
  <!--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文件:

java 复制代码
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需要修改。

java 复制代码
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注解的类或方法。
java 复制代码
@Data
@ConfigurationProperties(prefix = "hm.cart")
public class CartProperties {
    private int maxItems;
}

2.使用@ConfigurationProperties注解

  • **@ConfigurationProperties**注解允许我们将配置文件中的属性绑定到 Java Bean 上。从而可以非常灵活地将外部配置(比如 application.properties 或 application.yml 文件中的配置)映射到我们的组件中。
java 复制代码
@Data
@RefreshScope
public class CartProperties {
    @Value("${hm.cart.maxItems}")
    private int maxItems;
}

案例实现:实现购物车添加商品上限的配置热更新

需求:购物车的限定数量目前是写死在业务中的,将其改为读取配置文件属性,并将配置交给Nacos管理,实现热更新。

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

在微服务中新建一个属性读取类,代码如:

java 复制代码
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:

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

相关推荐
小旋风-java9 分钟前
springboot整合dwr
java·spring boot·后端·dwr
JAVA坚守者14 分钟前
Maven常见解决方案
java·maven
聊天宝快捷回复26 分钟前
必收藏,售后客服日常回复必备的话术 (精华版)
java·前端·数据库·经验分享·微信·职场发展·快捷回复
默子昂27 分钟前
yolo自动化项目实例解析(七)自建UI--工具栏选项
运维·yolo·自动化
wanyuanshi27 分钟前
map的键排序方法
java·数据结构·算法
热爱前端的小wen30 分钟前
maven的介绍与安装
java·spring·maven·springboot
深蓝易网38 分钟前
为什么优秀的工厂更重视生产现场
大数据·运维·人工智能·数据分析·制造
弥琉撒到我1 小时前
微服务SpringSession解析部署使用全流程
spring cloud·微服务·云原生·架构·springsession
马老师135217304161 小时前
网络安全的岗位分析
运维·安全·web安全·ccrc-dsa·dsa·数据安全评估师
追风小老头折腾程序1 小时前
Java单体服务和集群分布式SpringCloud微服务的理解
java·后端·spring·spring cloud