沉梦手记 沉梦手记
首页
  • 基础篇
  • 集合篇
  • 并发篇
  • JVM
  • 新特性
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 数据库基础
  • MySql
  • Redis
  • 达梦数据库
  • Spring
  • SpringBoot
  • Mybatis
  • Shiro
  • 设计须知
  • UML画图
  • 权限校验
  • 设计模式
  • API网关
  • 网络通信
  • 消息队列
  • SpringCloud
  • 分布式事务
  • 云存储
  • 搜索引擎
  • 前端环境搭建
  • HTML与CSS
  • JS学习
  • Axios入门
  • Vue Router入门
  • Pinia入门
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • 开发工具篇
  • 工具库篇
  • 开发技巧篇
  • 工具类系列
  • 运维与部署
  • 音视频处理
  • 随笔
  • 博客搭建
  • 网站收藏箱
  • 断墨寻径摘录
  • 费曼学习法
  • 脚手架搭建
  • 瑞吉外卖
  • 黑马点评
  • vue-blog
  • 沉梦接口开放平台
  • 用户中心
  • 聚合搜索平台
  • 仿12306项目
  • 壁纸小程序项目
  • RuoYi-Vue
Github (opens new window)

沉梦听雨

时间是最好的浸渍剂,而沉淀是最好的提纯器🚀
首页
  • 基础篇
  • 集合篇
  • 并发篇
  • JVM
  • 新特性
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 数据库基础
  • MySql
  • Redis
  • 达梦数据库
  • Spring
  • SpringBoot
  • Mybatis
  • Shiro
  • 设计须知
  • UML画图
  • 权限校验
  • 设计模式
  • API网关
  • 网络通信
  • 消息队列
  • SpringCloud
  • 分布式事务
  • 云存储
  • 搜索引擎
  • 前端环境搭建
  • HTML与CSS
  • JS学习
  • Axios入门
  • Vue Router入门
  • Pinia入门
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • 开发工具篇
  • 工具库篇
  • 开发技巧篇
  • 工具类系列
  • 运维与部署
  • 音视频处理
  • 随笔
  • 博客搭建
  • 网站收藏箱
  • 断墨寻径摘录
  • 费曼学习法
  • 脚手架搭建
  • 瑞吉外卖
  • 黑马点评
  • vue-blog
  • 沉梦接口开放平台
  • 用户中心
  • 聚合搜索平台
  • 仿12306项目
  • 壁纸小程序项目
  • RuoYi-Vue
Github (opens new window)
  • 脚手架搭建
  • 瑞吉外卖

  • 黑马点评

  • vue-blog

  • 沉梦接口开放平台

  • 用户中心

  • 聚合搜索平台

  • 仿12306项目

    • 基础业务与登录认证
    • 超卖与分布式锁
    • 微服务组件
      • MQ 的使用
        • 踩坑小记
      • 事务问题
      • 网关模块
        • 依赖
        • 配置路由转发
        • 输出请求日志
      • Feign
      • 注册中心与配置中心
        • 注册中心
        • 配置中心
      • Seata 分布式事务
        • 四种模式
        • AT 模式
      • Sentinel 降级
        • 常见的限流算法
        • 流控效果
        • 流控模式
      • Spring Cloud Alibaba
    • 缓存与前端
    • 项目技术亮点
  • 壁纸小程序项目

  • RuoYi-Vue

  • 项目笔记
  • 仿12306项目
沉梦听雨
2024-07-29
目录

微服务组件

# 微服务组件

# 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)来异步执行方法。

# 事务问题

  1. 尽量做短事务,不要做长事务,否则会大量占用数据库资源
  2. 本类方法间的调用,事务不生效

# 网关模块

# 依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
1
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 分布式事务

官网首页:Apache Seata (opens new window)

快速开始 | Spring Cloud Alibaba (opens new window)

# 四种模式

模式 说明 特点
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 熔断降级

一句话理解:限流是做在被调用方,熔断是做在调用方

官方文档:introduction | Sentinel (opens new window)

# 常见的限流算法

  1. 静态窗口限流
  2. 动态窗口限流
  3. 漏桶限流
  4. 令牌桶限流
  5. 令牌大闸

例如:当前是第 2.5 秒

  • 静态:统计第 2 秒到现在的请求数
  • 动态:统计第 1.5 秒到现在的请求数

# 流控效果

  1. 快速失败 —— 即降级
  2. Warm Up(预热) —— coldFactor 为 3,即请求 QPS 从(阈值/3)开始,经多少预热时长才逐渐升至设定的 QPS 阈值。比如阈值是 100,时长是 10 秒,则从 33 开始经过 10 秒上升到 100
  3. 排队等待 —— 适合短时高峰,可加个超时时间,慢慢消费掉请求

# 流控模式

  1. 直接
  2. 关联 —— 对目标的限流是有条件的,需要关联的资源限流时,目标才会限流;两个关联的资源必须同时启动才能生效
  3. 链路

配置 入口资源 的时候,需要在资源名称前面加个 /

# Spring Cloud Alibaba

  • alibaba/spring-cloud-alibaba (github.com) (opens new window)
  • Spring Boot 单体应用升级 Spring Cloud 微服务最佳实践 | Spring Cloud Alibaba (aliyun.com) (opens new window)
上次更新: 2026/10/10 17:43:40
超卖与分布式锁
缓存与前端

← 超卖与分布式锁 缓存与前端→

Theme by Vdoing | Copyright © 2023-2026 沉梦听雨 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式