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

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:devdev时,所需要导入的配置文件。
在这里插入图片描述
在这里插入图片描述
③ 测试 test
在这里插入图片描述
在这里插入图片描述

http://www.dtcms.com/a/336492.html

相关文章:

  • 如何理解“速度模式间接实现收放卷恒张力控制“
  • 题目2:使用递归CTE分析产品层级关系
  • 【从零开始学习Redis】项目实战-黑马点评D2
  • 【会议跟踪】ICRA 2021 Workshop:Visual-Inertial Navigation Systems
  • 多线程—飞机大战(加入播放音乐功能版本)
  • 【Virtual Globe 渲染技术笔记】6 着色
  • C语言---第一个C语言程序
  • Tomcat下载、安装及配置详细教程
  • Hybrid Beamforming Design for OFDM Dual-Function Radar-Communication System
  • LaTeX中表示实数集R的方法
  • 零基础搭建公网 Nginx:通过 cpolar 内网穿透服务实现远程访问
  • 朝花夕拾(四) --------python中的os库全指南
  • 【计算机数学】关于全概率和贝叶斯公式的使用场景说明
  • Linux目录相关的命令
  • 排列组合+数量+资料
  • 聊聊Vuex vs Pinia
  • MySQL执行计划解读
  • 人脸AI半球梯控/门禁读头的功能参数与技术实现方案
  • 网络常识-DNS如何解析
  • 集成运算放大器(反向加法,减法)
  • Linux Shell定时检查日期执行Python脚本
  • 【AIGC】DDPM scheduler解析:扩散模型里的“调度器”到底在调什么?
  • 线程的同步
  • 魔改chromium源码——解除 iframe 的同源策略
  • Go语言实战案例-使用ORM框架 GORM 入门
  • 0️⃣基础 认识Python操作文件夹(初学者)
  • E2B是一个开源基础设施,允许您在云中安全隔离的沙盒中运行AI生成的代码和e2b.dev网站
  • 基因编辑预测工具:inDelphi与Pythia
  • Linux学习记录
  • 图解简单选择排序C语言实现