Spring Cloud 微服务重点知识小结

一、概要

服务注册:Consul,是HashiCorp 公司开发的独立第三方中间件。

服务发现:Eureka、Nacos(阿里)

服务调用:OpenFiegn

负载均衡:Ribbon 已停更,Spring Cloud LoadBalancer 是官方替代

服务熔断、限流、降级:Hystrix停止维护,Sentinel(阿里)

网关:Spring Cloud Gateway

二、服务发现 Eureka

Eureka 保证服务能注册、能发现,哪怕数据不准**。**

设计目标:AP 系统(高可用优先)

核心原理:客户端拉取 + 心跳续约 + 最终一致性

1、标准流程

服务注册(Register)

服务启动时向 Eureka Server 发送 REST 请求注册自身信息(IP、端口、实例名等)。

心跳续约(Renew)

客户端默认 30s 发一次心跳,告诉 Server "我还活着"。

服务剔除(Eviction)

超过 90s 没收到心跳,Server 会标记服务过期,定时任务剔除。

服务拉取(Fetch)

消费者默认 30s 拉取一次服务列表,本地缓存,不每次都请求 Server。

服务下线(Cancel)

服务正常关闭时,主动发送下线请求,Server 立即剔除。

2、自我保护机制

(1) 触发条件
  • 15 分钟内,心跳续约成功率 < 85%
  • 通常是网络抖动、大规模重启、GC 停顿导致
(2) 机制行为
  • Server 不再剔除任何服务实例
  • 依然接收注册、查询、心跳
  • 网络恢复后,自动退出保护模式
(3) 自我保护原因

防止因为网络分区 / 短暂故障,把健康服务错误剔除,导致服务大面积 "假死"

(4) 生产环境方法
  • 测试环境可以关闭:eureka.enableSelfPreservation=false
  • 生产环境必须开启
  • 出现保护模式优先查:网络、GC、客户端配置、服务批量重启

3、服务上下线与健康检查

(1) 服务下线两种方式
  • 主动下线:服务正常 shutdown,发送 Cancel 请求,立即剔除
  • 被动剔除:超时无心跳,进入定时剔除队列,有延迟
(2) Eureka 健康检查特点
  • 只有客户端心跳,Server 不主动探测
  • 服务假死(进程活着但不能服务)不会被立刻发现
  • 依赖客户端状态上报,不如 Consul/Nacos 实时

4、Eureka 配置与生产调优

(1) 核心参数及其含义
  • lease-renewal-interval-in-seconds: 30:心跳间隔
  • lease-expiration-duration-in-seconds: 90:过期时间
  • fetch-registry: true:拉取注册表
  • register-with-eureka: true:注册自身
  • eureka.server.responseCacheAutoExpirationInSeconds:响应缓存过期
(2) 生产调优思路
  • 心跳与过期时间不要随便改短,避免频繁剔除
  • 集群至少 3 节点
  • 关闭无效的自动扩容配置
  • 日志级别合理,避免压垮 Server

5、常见生产问题与排查

(1) 服务已下线但还在列表里
  • 原因:没主动下线、自我保护开启、客户端本地缓存未刷新
  • 解决:重启消费者、等待 30s~60s、检查自我保护
(2) 进入自我保护模式
  • 排查:网络、GC、批量发布、心跳配置错误
  • 优先恢复网络 / 服务,不要强行关保护模式
(3) 注册慢 / 列表不一致
  • 原因:异步复制、客户端缓存、网络延迟
  • 解释:这是 AP 系统正常表现,最终一致

6、Eureka 和 Consul 原理区别是什么?

CAP 不同:Eureka 是 AP 高可用设计,Consul 基于 Raft 是 CP 强一致设计。

集群同步机制不同:Eureka 是对等节点异步复制,最终一致;Consul 是 Leader 写 + 多数派确认,强一致。

健康检查不同:Eureka 靠客户端心跳,Consul 支持服务端主动探测。

微服务选型 :微服务注册发现优先 Eureka/Nacos,因为服务发现允许短暂不一致,但必须保证高可用;Consul 更适合需要强一致、配置管理、多数据中心的场景。

三、微服务调用Open Feign

OpenFeign = 动态代理 + 注解解析 + HTTP 客户端封装 + 负载均衡整合

本质:把一个 Java 接口,自动变成 HTTP 请求,帮你省略 RestTemplate 手写代码。

1、执行流程

扫描 → 生成代理 → 解析注解 → 选服务 → 发请求,具体如下:

① 启动扫描@EnableFeignClients 扫描所有 @FeignClient 接口

② 生成代理 :为接口创建 JDK 动态代理对象 放入 Spring 容器

③ 解析注解 :代理类解析方法上的 @GetMapping@PostMapping 等信息

④ 构建请求:拼接 URL、请求头、参数,生成完整 HTTP 请求

⑤ 负载均衡 :整合 Ribbon/SCL,从注册中心获取服务地址

⑥ 发起调用:通过底层 HTTP 客户端(URLConnection/HttpClient/OkHttp)发送请求

⑦ 结果解析:接收响应,自动转成 Java 对象返回

⑧ 异常处理:超时、重试、熔断统一拦截处理

2、底层核心原理

(1) 动态代理原理
  • OpenFeign 用 JDK 动态代理 生成接口实现类
  • 调用接口方法 → 进入 InvocationHandler.invoke()
  • 核心:方法不自己实现,而是转成 HTTP 请求发出去
(2) 负载均衡原理
  • OpenFeign 默认集成 Ribbon(已废弃) ,新版用 Spring Cloud LoadBalancer
  • 原理:
    • 接口写的是服务名(service-product
    • Feign 交给负载均衡组件
    • 从注册中心拉取实例列表
    • 根据策略(轮询 / 随机)选择一台机器发起调用
(3) 契约(Contract)原理
  • Feign 原生注解 → 可以适配成 Spring MVC 注解
  • 让你像写 Controller 一样写 Feign 接口
  • 这就是 SpringMvcContract 的作用
(4) 编码器 / 解码器
  • Encoder:把 Java 对象转成 JSON/Form 表单
  • Decoder:把响应 JSON 转回 Java 对象
  • 默认用 Jackson 实现
(5) 底层原理小结
  • OpenFeign 基于 JDK 动态代理,把接口转成 HTTP 请求;
  • 通过 Contract 解析 SpringMVC 注解,生成请求模板;
  • 整合 负载均衡组件,把服务名转为真实 IP 端口;
  • 通过 HTTP 客户端发送请求,经过编码器、解码器、拦截器;
  • 支持超时、重试、拦截、熔断,是微服务同步调用的标准方案。

3、OpenFeign 超时与重试原理

原理:

  • 超时分两种:ConnectTimeout(连接超时)、ReadTimeout(读取超时)
  • 重试默认开启,默认重试 5 次
  • 重试由 Retryer 控制

生产重点:

  • 非幂等接口必须关闭重试(否则会重复提交 / 重复扣款)
  • 只给查询接口开启重试

4、OpenFeign 性能优化原理

  • 替换 HTTP 客户端 :默认 URLConnection 无连接池,换成 OkHttp / HttpClient
  • 开启连接池:复用 TCP 连接,大幅提升性能
  • 日志级别调优:生产用 BASIC/NONE,不要 FULL
  • 手动关闭重试:非幂等接口一定关闭

5、在 Feign 请求里传递 Header

有三种方案:

  • 方法参数加 @RequestHeader
  • 实现 RequestInterceptor 统一注入
  • @RequestHeader 注解在接口上

四、网关Spring Cloud Gateway

Spring Cloud Gateway的核心作用:路由转发、过滤、限流、熔断、安全、统一入口

1、核心概念

  • Route(路由): 网关的基础,ID + 目标 URL + 断言 + 过滤器,匹配成功就转发。
  • Predicate(断言, 匹配请求,决定走哪条路由**)**匹配条件:路径、请求头、请求方法、时间等。
  • **Filter(过滤器)**请求前后做处理:加请求头、加响应头、限流、修改参数。

2、执行流程

先断言匹配路由,再经过过滤器,最后转发服务。具体如下:

请求 → Gateway Handler Mapping

② 断言匹配路由

匹配成功 → 过滤器链(Filter Chain)

④ 执行前置过滤

转发请求到微服务

⑥ 执行后置过滤

返回响应

3、Gateway限流

(1) 实现方式

  • 基于 Redis + Lua 实现 令牌桶 / 漏桶 限流
  • 使用 RequestRateLimiter 过滤器
  • 支持:IP 限流、用户限流、接口限流

(2) 核心依赖

  • spring-cloud-starter-gateway
  • spring-boot-starter-data-redis-reactive

4、熔断降级

  • 基于 Resilience4jSentinel
  • 超时、异常、并发达到阈值自动熔断
  • 网关层保护下游服务,防止雪崩

5、跨域配置

复制代码
spring:
  cloud:
    gateway:
      globalcors:
        cors-configurations:
          '[/**]':
            allowedOrigins: "*"
            allowedMethods: GET,POST,PUT,DELETE
相关推荐
IT_陈寒2 小时前
JavaScript原型链解密:3个关键概念帮你彻底搞懂继承机制
前端·人工智能·后端
bugcome_com2 小时前
ASP.NET Web Forms 零基础入门教程
后端·asp.net
Aloha_up2 小时前
spring的几个八股
java·后端·spring
24白菜头2 小时前
若依框架Ruoyi-Vue-SpringBoot3部署
前端·javascript·笔记·后端·学习
MX_93592 小时前
基于注解方式配置声明式事务
java·开发语言·后端·spring
野犬寒鸦2 小时前
JVM垃圾回收机制深度解析(G1篇)(垃圾回收过程及专业名词详解)
java·服务器·jvm·后端·面试
程序员老乔2 小时前
Java 新纪元 — JDK 25 + Spring Boot 4 全栈实战(五):FFM API,告别JNI在Spring Boot中直连推荐引擎
java·开发语言·spring boot
我爱吃土豆12 小时前
HTTP首部讲解
后端·http·web