当前位置: 首页 > news >正文

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

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

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

目录

一、引言

二、配置共享

1. 添加共享配置到nacos

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

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

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

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

(1)引入依赖

(2)新建bootstrap.yaml

(3)修改application.yaml

(4)测试

三、配置热更新

1. 添加配置到Nacos

2. 配置热更新


一、引言

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

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

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

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

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

二、配置共享

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

  • 在Nacos中添加共享配置

  • 微服务拉取配置

1. 添加共享配置到nacos

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

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

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/Shanghaidriver-class-name: com.mysql.cj.jdbc.Driverusername: ${hm.db.un:root}password: ${hm.db.pw:wangjx17}mybatis-plus:configuration:default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandlerglobal-config:db-config:update-strategy: not_nullid-type: auto

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

logging:level:com.hmall: debugpattern:dateformat: HH:mm:ss:SSSfile:path: "logs/${spring.application.name}"

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

knife4j:enable: trueopenapi:title: ${hm.swagger.title:黑马商城接口文档}description: ${hm.swagger.desc:黑马商城接口文档}email: zhanghuyi@itcast.cnconcat: 虎哥url: https://www.itcast.cnversion: v1.0.0group:default:group-name: defaultapi-rule: packageapi-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模块引入依赖:

  <!--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文件:

spring:application:name: cart-service # 服务名称profiles:active: devcloud: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

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

(4)测试

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

三、配置热更新

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

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

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

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

  • 在Nacos中添加配置

  • 在微服务读取配置

1. 添加配置到Nacos

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

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,然后重新发布:

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

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • PostgreSQL 内核资源管理
  • 2024下半年软考有哪些科目开考?该怎么选?
  • PHP开发过程中常见问题快速解决
  • Kakfa的核心概念-Replica副本(kafka创建topic并指定分区和副本的两种方式)
  • 136.使用Redis 解决分布式系统下的并发问题
  • 全球卫星星座规划
  • transformers调用llama的方式
  • Transformer系列-10丨一文理解透Transformer
  • webpack打包优化方案
  • 深度学习一(Datawhale X 李宏毅苹果书 AI夏令营)
  • WHAT - graphql 系列(二)- graphql-codegen
  • 【Linux篇】Linux命令基础
  • 大数据-92 Spark 集群 SparkRDD 原理 Standalone详解 ShuffleV1V2详解 RDD编程优化
  • 【Spring技术】
  • 校友会系统小程序的设计
  • [译] React v16.8: 含有Hooks的版本
  • 【Amaple教程】5. 插件
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • javascript数组去重/查找/插入/删除
  • Markdown 语法简单说明
  • nodejs:开发并发布一个nodejs包
  • PHP CLI应用的调试原理
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 关于 Cirru Editor 存储格式
  • 将 Measurements 和 Units 应用到物理学
  • 微信支付JSAPI,实测!终极方案
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • 2017年360最后一道编程题
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • ​iOS安全加固方法及实现
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • #if等命令的学习
  • (2)Java 简介
  • (2024)docker-compose实战 (9)部署多项目环境(LAMP+react+vue+redis+mysql+nginx)
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (java)关于Thread的挂起和恢复
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (八十八)VFL语言初步 - 实现布局
  • (二) 初入MySQL 【数据库管理】
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (三)终结任务
  • (十一)c52学习之旅-动态数码管
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • .NET CLR Hosting 简介
  • .net Stream篇(六)
  • .NET 表达式计算:Expression Evaluator
  • .net 反编译_.net反编译的相关问题
  • .pyc文件是什么?
  • .skip() 和 .only() 的使用
  • [ Algorithm ] N次方算法 N Square 动态规划解决
  • [ vulhub漏洞复现篇 ] Jetty WEB-INF 文件读取复现CVE-2021-34429
  • [ 转载 ] SharePoint 资料