微服务组件
# 微服务组件
# MQ 的使用
项目中的用途:
- 使用 MQ,将购票流程一分为二
- 增加排队购票功能
# 踩坑小记
实现 RocketMQ 发送:
spring.factories 功能在 Spring Boot 3 会被移除(即使依赖包内的自动配置失效),需要手动引入配置
1
解决方案:
1、resources 下创建目录文件
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
2、文件内容填写
org.apache.rocketmq.spring.autoconfigure.RocketMQAutoConfiguration
1
非必要的时候,可以通过开启 SpringBoot 异步注解(
@Async)来异步执行方法。
# 事务问题
- 尽量做短事务,不要做长事务,否则会大量占用数据库资源
- 本类方法间的调用,事务不生效
# 网关模块
# 依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
1
2
3
4
2
3
4
注意:
- gateway 只有一个依赖,不能引入 common,也不能引入 starter-web
- 网关是基于 netty 的,所以不需要引入 starter-web
# 配置路由转发
生产发布时,只有 gateway 需要配置【外网 IP】,其它模块都只开放【内网】访问,【外网】访问不了,保证应用安全。
# 输出请求日志
要输出请求日志需要增加启动参数(VM 选项):
-Dreactor.netty.http.server.accessLogEnabled=true
日志输出:
15:07.087 INFO r.netty.http.server.AccessLog :279 reactor-http-nio-2 127.0.0.1 - - [03/12月/2023:21:15:06 +0800] "GET /member/hello HTTP/1.1" 200 12 243
1
# Feign
Feign是 Netflix 公司开发的一个声明式的 REST 调用客户端,SpringCloud 的早期,就是将各种第三方组件整合到 SpringBoot 项目里,形成了 SpringCloud,现在慢慢的把第三方组件替换成自研的组件,比如 gateway 组件OpenFeign是在 Feign 的基础上,增加 SpringMVC 注解,让代码写起来像在写 Controller
使用
spring.application.name可以给各应用起一个名字,方便应用之间互相认识,在注册中心、配置中心、路由、服务调用、限流等微服务组件中,都会用到。
# 注册中心与配置中心
注册中心和配置中心可以用不同的组件
# 注册中心
通讯录,让应用之间相互认识:
- 健康检查(可以主动的让某一节点下线,常用于发布前下线)
- 路由转发(gateway 也可以根据 ip 进行路由转发,但是后期为了控制成本,会对机器做动态扩容,此时 ip 就不固定了)
- 远程调用(按名字调用)
# 配置中心
动态修改线上配置:
- 开关
- 阈值
- 枚举项
一般
application.yml用来放 SpringBoot 的配置;bootstrap.yml用来放 SpringCloud 的配置。
命名空间 —— 可用作项目隔离
集群 —— 平时生产发布时,可以对某一节点做下线处理,再重新部署;按应用名(注册中心名)来做负载均衡路由转发(相同应用名,会轮询访问)
即使 Nacos 挂掉,网关一样能够根据应用名进行路由转发。
# Seata 分布式事务
# 四种模式
| 模式 | 说明 | 特点 |
|---|---|---|
| AT 模式 | 默认模式,简单,需要增加 undo_log 表,生成反向 SQL,性能高 | 回滚后,原来没数据的,现在还是没数据 |
| TCC 模式 | try、confirm/cancel,三个阶段的代码都得自己实现,Seata 只负责调度 | 对业务代码侵入性较强,必要时可能还要修改数据库 |
| SAGA 模式 | 长事务解决方案,需要程序员自己编写两阶段代码(AT 模式不需要写第二阶段) | 基于状态机来实现的,需要一个 JSON 文件,可异步执行 |
| XA 模式 | XA 协议是由 X/Open 组织提出的分布式事务处理规范,基于数据库的 XA 协议来实现 2PC,又称为 XA 方案 | 适用于强一致性的场景,比如金融、银行等;需要数据库本身支持 XA 协议,可以跨数据库 |
# AT 模式
- Seata 的 AT 模式会自动生成反向 SQL,且没有反引号
`,所以要求表里不能有关键字 - AT 模式会有个全局锁,用于防止脏读:线程 1 的事务修改了库存,但还没提交事务,线程 2 读库存时,读的还是原来的库存
# Sentinel 降级
- Sentinel 限流降级
- Sentinel 熔断降级
一句话理解:限流是做在被调用方,熔断是做在调用方
# 常见的限流算法
- 静态窗口限流
- 动态窗口限流
- 漏桶限流
- 令牌桶限流
- 令牌大闸
例如:当前是第 2.5 秒
- 静态:统计第 2 秒到现在的请求数
- 动态:统计第 1.5 秒到现在的请求数
# 流控效果
- 快速失败 —— 即降级
- Warm Up(预热) —— coldFactor 为 3,即请求 QPS 从(阈值/3)开始,经多少预热时长才逐渐升至设定的 QPS 阈值。比如阈值是 100,时长是 10 秒,则从 33 开始经过 10 秒上升到 100
- 排队等待 —— 适合短时高峰,可加个超时时间,慢慢消费掉请求
# 流控模式
- 直接
- 关联 —— 对目标的限流是有条件的,需要关联的资源限流时,目标才会限流;两个关联的资源必须同时启动才能生效
- 链路
配置
入口资源的时候,需要在资源名称前面加个/
# Spring Cloud Alibaba
上次更新: 2026/10/10 17:43:40