Java研学-SpringCloud(五)
一 Nacos 配置中心
1 引入依赖 – services.pom
每个微服务都需要
<!--配置中心--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency>
2 配置文件 – service-order
指定Nacos地址,并指定想导入Nacos中的那些配置信息(数据集)
spring.application.name=service-order
server.port=8000
spring.cloud.nacos.server-addr=127.0.0.1:8848# nacos前缀自动引用地址 项目启动后将配置中心的 service-order.properties 文件导入
spring.config.import=nacos:service-order.properties
3 创建数据集
# 订单支付超时时间,用户下单后需在 30分钟 内完成支付,否则订单自动取消。
order.timeout=30min
# 订单发货后 3天 自动确认收货(无需用户手动点击确认)。
order.auto-confirm=3d
4 获取配置文件内容 – OrderController
@RestController
public class OrderController {@AutowiredOrderService orderService;// 获取配置文件中的配置值@Value("${order.timeout}")String orderTimeOut;@Value("${order.autoconfirm}")String orderAutoConfirm;// 测试@GetMapping("/config")public String config(){return "order.timeout:"+orderTimeOut+";order.autoconfirm:"+orderAutoConfirm;}@GetMapping("/create")public Order createOrder(@RequestParam("productId") Long productId,@RequestParam("userId") Long userId) {Order order = orderService.createOrder(productId, userId);return order;}
}
5 启动测试
自配置中心获取数据,但此刻还不能够跟随配置中心同步变化
二 动态刷新
1 自动刷新属性 – OrderController
想要属性能够跟随配置中心变化,还需要注解@RefreshScope
,激活配置属性的刷新功能
@RefreshScope
@RestController
public class OrderController {@AutowiredOrderService orderService;// 获取配置文件中的配置值@Value("${order.timeout}")String orderTimeOut;@Value("${order.autoconfirm}")String orderAutoConfirm;@GetMapping("/config")public String config(){return "order.timeout:"+orderTimeOut+";order.autoconfirm:"+orderAutoConfirm;}@GetMapping("/create")public Order createOrder(@RequestParam("productId") Long productId,@RequestParam("userId") Long userId) {Order order = orderService.createOrder(productId, userId);return order;}
}
2 自动刷新测试
跟随配置中心变化
3 配置文件禁用导入检查 – service-product
当导入配置中心依赖后,但微服务还不需要使用配置中心,启动服务会导致报错,因此需要将配置设置为可选(引入的配置文件可以没有)或禁用Nacos的导入检查
spring.application.name=service-product
server.port=9000
spring.cloud.nacos.server-addr=127.0.0.1:8848# 不启动导入检查
spring.cloud.nacos.config.import-check.enabled=false
4 优化动态刷新
① 将配置常用数据抽取到Bean中 – OrderProperties
// 该 Bean 需为容器中的组件才能够成功绑定
@Component
// 指定属性前缀 order. 属性名可省略 order
@ConfigurationProperties(prefix = "order")
@Data
public class OrderProperties {// 可以对配置文件中的属性进行批量绑定 无需 @RefreshScopeString timeOut;// orderAutoConfirmString autoConfirm;
}
② 修改方法 – OrderController
// @RefreshScope 不再需要
@RestController
public class OrderController {@AutowiredOrderService orderService;// 所需属性@AutowiredOrderProperties orderProperties;@GetMapping("/config")public String config(){return "order.timeout:"+orderProperties.getTimeOut()+";order.autoconfirm:"+orderProperties.getAutoConfirm();}@GetMapping("/create")public Order createOrder(@RequestParam("productId") Long productId,@RequestParam("userId") Long userId) {Order order = orderService.createOrder(productId, userId);return order;}
}
5 测试动态刷新
6 注意
配置中心内容为高优先级配置
,项目内部的 application.properties 是低优先级配置
,当二者对同一属性都有编写时,高优先级会生效,也就是先导入优先和外部优先
。
具体流程为:项目启动时,将所有配置合并,产生冲突低优先级的配置被丢弃,然后生成一张生效的配置列表,存入项目的环境变量中,等待取用。
若存在多个导入的配置文件都属于高优先级配置
(外部优先),则按照先后顺序排列等级,以第一次声明的配置为准(先导入优先)
// service-order.properties 优先级更高
spring.config.import=nacos:service-order.properties,nacos:common.properties
三 监听配置 – NacosConfigManager
1 作用
当配置中心的配置文件发生变化,我们需要获取是哪一项发生了变化,可通过邮件通知。
因此需要在项目启动时监听配置文件变化,发生变化后拿到变化的值,然后发送邮件
2 监听方法 – OrderMainApplication
// 开启服务发现功能
@EnableDiscoveryClient
@SpringBootApplication
public class OrderMainApplication {public static void main(String[] args) {SpringApplication.run(OrderMainApplication.class, args);}// 参数上的所有组件会自动从容器中拿 -- Spring Boot 机制// 一次性任务 项目启动的同时触发@BeanApplicationRunner applicationRunner(NacosConfigManager nacosConfigManager) {// 项目启动时运行该任务return new ApplicationRunner() {@Overridepublic void run(ApplicationArguments args) throws Exception {// 查看是否成功触发System.out.println("RUN!!!");// 拿到配置服务ConfigService configService = nacosConfigManager.getConfigService();// 给配置服务添加一个监听器 参数为:数据集ID 组 监听器configService.addListener("service-order.properties", "DEFAULT_GROUP", new Listener() {// 监听器的监听任务是在线程池中运行的@Overridepublic Executor getExecutor() {// 给一个固定大小的线程池return Executors.newFixedThreadPool(4);}// 接收配置信息@Overridepublic void receiveConfigInfo(String configInfo) {System.out.println("变化为:"+configInfo);System.out.println("可发邮件通知");}});}};}
}
3 测试
四 数据隔离
1 作用
研发项目会存在多种环境如,开发,测试,生产,根据不同环境,每个微服务的同一套配置的值就会有所变动如,订单服务的数据库配置文件在不同环境需要链接不同的数据库,因此需要实现数据隔离。
2 实现原理
根据定义,Nacos 采用Namespace命名空间 → Group组 → Data-id数据集
的三层隔离结构,通过命名空间区分环境,组区分每个微服务,数据集区分配置,一套命名空间含有多个组,每个组下面有对应的多个数据集。
在SpringBoot项目中,可定义多个环境与各命名空间绑定,在项目启动时激活想要的环境,其绑定的命名空间下的所有配置就会对应生效。
3 新建命名空间
若不创建命名空间,则配置都存在于默认的public(保留空间)
4 新建组与数据集
订单组
商品组
5 克隆配置
复制配置文件到不同环境,便于更改配置文件内容
6 更新配置文件 – service-order
注释掉原配置文件application.properties
,使用新文件 –application.yml
,原配置文件import
对应的是public(保留空间),此时应更换其他环境
server:port: 8000spring:application:name: service-ordercloud:nacos:server-addr: 127.0.0.1:8848# 表示接下来要读取的 dev 命名空间下的配置config:namespace: devconfig:# - 此处短横线表示导入一个文件 order 组的 common.properties 文件import:- optional:nacos:common.properties?group=order- optional:nacos:database.properties?group=order
7 更新配置属性Bean – OrderProperties
// 该 Bean 需为容器中的组件才能够成功绑定
@Component
// 指定属性前缀 order. 属性名可省略 order
@ConfigurationProperties(prefix = "order")
@Data
public class OrderProperties {// 可以对配置文件中的属性进行批量绑定 无需 @RefreshScopeString timeOut;// orderAutoConfirmString autoConfirm;// 新属性String dbUrl;
}
8 更新方法 – OrderController
@RestController
public class OrderController {@AutowiredOrderService orderService;// 所需属性@AutowiredOrderProperties orderProperties;@GetMapping("/config")public String config(){return "order.timeout:"+orderProperties.getTimeOut()+ ";order.autoconfirm:"+orderProperties.getAutoConfirm()+ ";order.dbUrl:"+orderProperties.getDbUrl();}@GetMapping("/create")public Order createOrder(@RequestParam("productId") Long productId,@RequestParam("userId") Long userId) {Order order = orderService.createOrder(productId, userId);return order;}
}
9 启动测试
10 切换环境测试 – service-order
① 修改为测试环境 – application.yml
server:port: 8000spring:application:name: service-ordercloud:nacos:server-addr: 127.0.0.1:8848# 表示接下来要读取的 dev 命名空间下的配置config:namespace: testconfig:# - 此处短横线表示导入一个文件 order 组的 common.properties 文件import:- optional:nacos:common.properties?group=order- optional:nacos:database.properties?group=order
② 测试
11 多配置文件场景配置文件 – service-order
① 修改配置文件,不同环境所需配置文件数量可能不统一,yaml可支持多文档模式,- - -
表示多文档模式,根据spring:profiles:active
选择对应环境所需的配置文件
server:port: 8000spring:profiles:active: devapplication:name: service-ordercloud:nacos:server-addr: 127.0.0.1:8848# 表示接下来要读取的 dev 命名空间下的配置config:# 关闭检查import-check:enabled: false# 动态根据 active 变化 若不配置 默认为 publicnamespace: ${spring.profiles.active:public}---
spring:config:# - 此处短横线表示导入一个文件 order 组的 common.properties 文件import:- optional:nacos:common.properties?group=order- optional:nacos:database.properties?group=order# 表示在开发环境下生效 这两个文件生效 搭配 profiles active 激活使用activate:on-profile: dev---
spring:config:import:- optional:nacos:common.properties?group=order- optional:nacos:database.properties?group=order- optional:nacos:dahuang.properties?group=order# 表示在测试环境下生效 这两个文件生效activate:on-profile: test---
spring:config:import:- optional:nacos:common.properties?group=order- optional:nacos:database.properties?group=order- optional:nacos:xiaohuang.properties?group=order# 表示在生产环境下生效 这两个文件生效activate:on-profile: prod
② 测试,首先根据active: dev
标识dev
被激活,连接namespace
,其中 ${spring.profiles.active:public}
的值为dev
,然后判断on-profile:dev
为dev
时,所需要导入的配置文件。
③ 测试 test