一、概要
服务注册: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、熔断降级
- 基于 Resilience4j 或 Sentinel
- 超时、异常、并发达到阈值自动熔断
- 网关层保护下游服务,防止雪崩
5、跨域配置
spring:
cloud:
gateway:
globalcors:
cors-configurations:
'[/**]':
allowedOrigins: "*"
allowedMethods: GET,POST,PUT,DELETE