一、概要

服务注册: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

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐