微服务——设置管理

打印 上一主题 下一主题

主题 928|帖子 928|积分 2784

1.设置管理

        微服务设置管理是指对微服务架构中各个服务的设置信息进行管理、更新、查询和审计等操作,以确保系统的正常运行和高效管理。比方,网关路由或某些业务设置在设置文件中写死了,每次修改都要重启服务。每个微服务都有许多重复的设置,维护成本高。这些问题都可以通过同一的设置管理器服务解决。而Nacos不仅仅具备注册中央功能,也具备设置管理的功能。


        微服务共享的设置可以同一交给Nacos保存和管理,在Nacos控制台修改设置后,Nacos会将设置变更推送给相关的微服务,并且无需重启即可见效,实现设置热更新
        网关的路由同样是设置,因此同样可以基于这个功能实现动态路由功能,无需重启网关即可修改路由设置。
1.1设置共享

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


  • 在Nacos中添加共享设置
  • 微服务拉取设置
1.1.1.添加共享设置

首先抽取设置中重复的部分,比方jdbc相关设置、日记设置、swagger以及OpenFeign的设置

我们在nacos控制台分别添加这些设置。
首先是jdbc相关设置,在设置管理->设置列表中点击创建立置

其中具体的设置如下:
  1. spring:
  2.   datasource:
  3.     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
  4.     driver-class-name: com.mysql.cj.jdbc.Driver
  5.     username: ${hm.db.un:root}
  6.     password: ${hm.db.pw:123}
  7. mybatis-plus:
  8.   configuration:
  9.     default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler
  10.   global-config:
  11.     db-config:
  12.       update-strategy: not_null
  13.       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,设置内容如下:
  1. logging:
  2.   level:
  3.     com.hmall: debug
  4.   pattern:
  5.     dateformat: HH:mm:ss:SSS
  6.   file:
  7.     path: "logs/${spring.application.name}"
复制代码
然后是同一的swagger设置,定名为shared-swagger.yaml,设置内容如下:
  1. knife4j:
  2.   enable: true
  3.   openapi:
  4.     title: ${hm.swagger.title:黑马商城接口文档}
  5.     description: ${hm.swagger.description:黑马商城接口文档}
  6.     email: ${hm.swagger.email:zhanghuyi@itcast.cn}
  7.     concat: ${hm.swagger.concat:虎哥}
  8.     url: https://www.itcast.cn
  9.     version: v1.0.0
  10.     group:
  11.       default:
  12.         group-name: default
  13.         api-rule: package
  14.         api-rule-resources:
  15.           - ${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设置管理的客户端依赖
  1.   <!--nacos配置管理-->
  2.   <dependency>
  3.       <groupId>com.alibaba.cloud</groupId>
  4.       <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
  5.   </dependency>
  6.   <!--读取bootstrap文件-->
  7.   <dependency>
  8.       <groupId>org.springframework.cloud</groupId>
  9.       <artifactId>spring-cloud-starter-bootstrap</artifactId>
  10.   </dependency>
复制代码
2)新建bootstrap.yaml
在微服务项目标resources目录下创建一个bootstrap.yml文件:
  1. spring:
  2.   application:
  3.     name: cart-service # 服务名称
  4.   profiles:
  5.     active: dev
  6.   cloud:
  7.     nacos:
  8.       server-addr: 192.168.150.101 # nacos地址
  9.       config:
  10.         file-extension: yaml # 文件后缀名
  11.         shared-configs: # 共享配置
  12.           - dataId: shared-jdbc.yaml # 共享mybatis配置
  13.           - dataId: shared-log.yaml # 共享日志配置
  14.           - dataId: shared-swagger.yaml # 共享日志配置
复制代码
3)修改application.yaml
由于一些设置挪到了bootstrap.yaml,因此application.yaml需要修改。
  1. server:
  2.   port: 8082
  3. feign:
  4.   okhttp:
  5.     enabled: true # 开启OKHttp连接池支持
  6. hm:
  7.   swagger:
  8.     title: 接口文档
  9.     package: com.hmall.cart.controller
  10.   db:
  11.     database: hm-cart
复制代码
重启服务,发现所有设置都见效了。
1.2.设置热更新

Nacos支持设置的热更新功能,即在不重启微服务的环境下更新设置信息。这通常通过以下几种方式实现:
前提条件:
1.nacos中要有一个与微服务名有关的设置文件。

2.微服务中要以特定方式读取需要热更新的设置属性(两种方式)
1.利用@RefreshScope注解


  • 将@RefreshScope注解应用于需要动态刷新的类或方法上。当Nacos上的属性值发生变革时,通过调用/actuator/refresh端点来刷新被@RefreshScope注解的类或方法。
  1. @Data
  2. @ConfigurationProperties(prefix = "hm.cart")
  3. public class CartProperties {
  4.     private int maxItems;
  5. }
复制代码
  2.利用@ConfigurationProperties注解


  • @ConfigurationProperties注解允许我们将设置文件中的属性绑定到 Java Bean 上。从而可以非常灵活地将外部设置(比如 application.properties 或 application.yml 文件中的设置)映射到我们的组件中。
  1. @Data
  2. @RefreshScope
  3. public class CartProperties {
  4.     @Value("${hm.cart.maxItems}")
  5.     private int maxItems;
  6. }
复制代码
案例实现:实现购物车添加商品上限的设置热更新

需求:购物车的限定命量现在是写死在业务中的,将其改为读取设置文件属性,并将设置交给Nacos管理,实现热更新。
接着,我们在微服务中读取设置,实现设置热更新。
微服务中新建一个属性读取类,代码如:
  1. package com.hmall.cart.config;
  2. import lombok.Data;
  3. import org.springframework.boot.context.properties.ConfigurationProperties;
  4. import org.springframework.stereotype.Component;
  5. @Data
  6. @Component
  7. @ConfigurationProperties(prefix = "hm.cart")
  8. public class CartProperties {
  9.     private Integer maxAmount;
  10. }
复制代码
接着,在业务中利用该属性加载类:

我们在nacos控制台,将购物车上限设置为5:

无需重启服务,设置热更新就见效了。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

慢吞云雾缓吐愁

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表