跳到主要内容

RPC同步调用

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 组件详解
  6. 依赖关系分析
  7. 性能与可靠性
  8. 故障排查指南
  9. 结论
  10. 附录

简介

本技术文档围绕 yudao-cloud 的 RPC 同步调用能力展开,重点讲解基于 OpenFeign 的声明式服务调用实现,涵盖接口定义、参数与响应处理、服务发现与负载均衡、以及服务降级与熔断等关键主题。同时给出配置方法(超时、重试、熔断器)、最佳实践与排障建议,帮助开发者正确、稳定地使用 RPC 调用功能。

项目结构

yudao-cloud 将 RPC 能力以 Spring Boot Starter 的形式封装,核心位于 yudao-spring-boot-starter-rpc,并通过环境与租户等自动配置模块扩展 Feign 的能力,如多环境标签透传、按 tag 过滤服务实例、以及统一的请求拦截器等。

Mermaid Diagram Code:

graph TB
subgraph "RPC启动器"
RPCPom["yudao-spring-boot-starter-rpc/pom.xml"]
end
subgraph "环境与多环境"
EnvCfg["YudaoEnvRpcAutoConfiguration.java"]
LBFactory["EnvLoadBalancerClientFactory.java"]
LBClient["EnvLoadBalancerClient.java"]
ReqInter["EnvRequestInterceptor.java"]
EnvUtils["EnvUtils.java"]
end
subgraph "业务自动配置"
TenantCfg["YudaoTenantRpcAutoConfiguration.java"]
OpLogCfg["YudaoOperateLogRpcAutoConfiguration.java"]
ApiLogCfg["YudaoApiLogRpcAutoConfiguration.java"]
DictCfg["YudaoDictRpcAutoConfiguration.java"]
end
subgraph "示例应用"
AppYaml["application.yaml"]
end
RPCPom --> EnvCfg
EnvCfg --> LBFactory
LBFactory --> LBClient
EnvCfg --> ReqInter
ReqInter --> EnvUtils
TenantCfg --> RPCPom
OpLogCfg --> RPCPom
ApiLogCfg --> RPCPom
DictCfg --> RPCPom
AppYaml --> RPCPom

图表来源

章节来源

核心组件

  • OpenFeign 与 OkHttp:提供声明式 HTTP 客户端能力,底层使用 OkHttp 作为 HTTP 客户端。
  • Spring Cloud LoadBalancer:提供客户端侧负载均衡能力,支持按 tag 过滤服务实例。
  • Resilience4j 熔断器:为 Feign 提供降级与熔断能力。
  • 环境与多环境标签:通过请求拦截器将 tag 透传至下游服务,结合 EnvLoadBalancerClient 实现按 tag 的服务实例筛选。
  • 业务自动配置:租户、操作日志、API 日志、字典等模块通过 EnableFeignClients 引入对应 API 接口,自动启用 Feign 客户端。

章节来源

架构总览

下图展示了 RPC 同步调用在 yudao-cloud 中的整体架构:应用通过@EnableFeignClients启用Feign客户端,自动装配OpenFeign、OkHttp与Resilience4j;负载均衡由Spring Cloud LoadBalancer提供,EnvLoadBalancerClientFactory与EnvLoadBalancerClient实现按tag过滤与随机权重选择;EnvRequestInterceptor负责将tag透传到下游服务。

Mermaid Diagram Code:

graph TB
Caller["调用方应用"] --> Feign["OpenFeign 客户端"]
Feign --> OkHttp["OkHttp 客户端"]
Feign --> LB["Spring Cloud LoadBalancer"]
LB --> Factory["EnvLoadBalancerClientFactory"]
Factory --> LBC["EnvLoadBalancerClient"]
Feign --> Inter["EnvRequestInterceptor"]
Inter --> Tag["tag 透传"]
Tag --> Downstream["被调用服务实例"]

图表来源

组件详解

OpenFeign 与 OkHttp 配置

  • 依赖引入:OpenFeign、OkHttp、LoadBalancer、Resilience4j 等。
  • OkHttp 作为底层 HTTP 客户端,提升连接复用与性能。
  • Resilience4j 为 Feign 提供熔断与降级能力,配合 fallbackFactory 使用。

章节来源

负载均衡与多环境标签

  • EnvLoadBalancerClientFactory:在创建 ReactiveLoadBalancer 时,包装为 EnvLoadBalancerClient,实现按 tag 过滤服务实例。
  • EnvLoadBalancerClient:根据当前上下文的 tag,优先筛选匹配的实例;若无匹配实例则回退到全部实例,再通过 Nacos 提供的随机权重算法选择目标实例。
  • EnvRequestInterceptor:在 Feign 请求中将 tag 写入请求头,透传给下游服务。
  • EnvUtils:提供 tag 的读取、设置与主机名解析等工具方法。

Mermaid Diagram Code:

classDiagram
class EnvLoadBalancerClientFactory {
+getInstance(serviceId) ReactiveLoadBalancer
}
class EnvLoadBalancerClient {
+choose(request) Mono~Response~
-getInstanceResponse(instances, tag) Response
}
class EnvRequestInterceptor {
+apply(requestTemplate) void
}
class EnvUtils {
+setTag(requestTemplate, tag) void
+getTag(request) String
+getTag(environment) String
+getTag(serviceInstance) String
}
EnvLoadBalancerClientFactory --> EnvLoadBalancerClient : "包装"
EnvRequestInterceptor --> EnvUtils : "使用"

图表来源

章节来源

业务模块的 Feign 自动配置

  • 租户模块:通过 @EnableFeignClients 引入 TenantApi,自动装配租户相关的 Feign 客户端与请求拦截器。
  • 操作日志模块:引入 OperateLogApi,自动启用 Feign 客户端。
  • API 日志模块:引入 ApiAccessLogApi 与 ApiErrorLogApi,自动启用 Feign 客户端。
  • 字典模块:引入 DictDataApi,自动启用 Feign 客户端。

Mermaid Diagram Code:

sequenceDiagram
participant Biz as "业务模块"
participant Feign as "Feign 客户端"
participant LB as "负载均衡"
participant Inter as "请求拦截器"
participant Svc as "被调用服务"
Biz->>Feign : 发起RPC调用
Feign->>Inter : 应用拦截器(透传tag)
Inter-->>Feign : 注入tag到请求头
Feign->>LB : 选择服务实例
LB-->>Feign : 返回实例(按tag过滤)
Feign->>Svc : 发送HTTP请求
Svc-->>Feign : 返回响应
Feign-->>Biz : 返回结果

图表来源

章节来源

服务发现、负载均衡与服务降级

  • 服务发现:通过 Spring Cloud LoadBalancer 与注册中心集成,自动拉取服务实例列表。
  • 负载均衡:EnvLoadBalancerClientFactory 包装负载均衡器,EnvLoadBalancerClient 根据 tag 过滤实例并进行随机权重选择。
  • 服务降级:通过 Resilience4j 为 Feign 提供熔断与降级能力,结合 fallbackFactory 实现优雅降级。

章节来源

RPC 调用配置方法(超时、重试、熔断器)

  • 超时与连接池:通过 OkHttp 客户端配置连接超时、读取超时、写入超时等参数。
  • 重试策略:可结合 Resilience4j 或 Feign 自带的重试机制,针对幂等请求进行重试。
  • 熔断器:启用 Resilience4j,配置熔断阈值、滑动窗口、慢调用比例等参数,配合 fallbackFactory 实施降级。
  • 负载均衡:通过 LoadBalancerClientFactory 与 EnvLoadBalancerClient 实现按 tag 的实例筛选与权重选择。

章节来源

接口定义、参数传递与响应处理

  • 接口定义:在各业务模块的 API 包中定义 Feign 接口,标注 @FeignClient 或通过 @EnableFeignClients 引入。
  • 参数传递:通过 @RequestParam、@RequestBody、@RequestHeader 等注解传递参数;EnvRequestInterceptor 会自动注入 tag。
  • 响应处理:返回标准的业务对象或通用响应包装;结合异常处理与熔断降级策略。

章节来源

最佳实践

  • 明确区分幂等与非幂等请求,仅对幂等请求启用重试。
  • 合理设置超时时间,避免长尾请求拖垮调用方。
  • 使用 tag 实现多环境隔离与灰度发布,确保请求头中包含正确的 tag。
  • 为关键接口配置熔断与降级,保证系统整体可用性。
  • 在 Feign 接口设计中保持参数与响应的清晰语义,便于维护与测试。

依赖关系分析

yudao-spring-boot-starter-rpc 作为 RPC 能力的聚合依赖,引入 OpenFeign、OkHttp、LoadBalancer 与 Resilience4j;环境模块通过自动配置扩展 Feign 的能力,实现多环境标签透传与按 tag 过滤实例;业务模块通过 EnableFeignClients 引入各自 API 接口,形成统一的 RPC 调用体系。

Mermaid Diagram Code:

graph TB
RPC["yudao-spring-boot-starter-rpc"] --> Feign["spring-cloud-starter-openfeign"]
RPC --> OkHttp["feign-okhttp"]
RPC --> LB["spring-cloud-starter-loadbalancer"]
RPC --> CB["spring-cloud-starter-circuitbreaker-resilience4j"]
EnvCfg["YudaoEnvRpcAutoConfiguration"] --> LBFactory
LBFactory --> LBClient
EnvCfg --> ReqInter
ReqInter --> EnvUtils
BizModules["业务模块自动配置"] --> Feign

图表来源

章节来源

性能与可靠性

  • 连接复用:OkHttp 提升连接复用率,降低握手开销。
  • 负载均衡:按 tag 过滤与随机权重选择,兼顾隔离与均衡。
  • 熔断降级:Resilience4j 提供熔断与降级,避免级联故障。
  • 超时控制:合理设置超时,防止慢调用拖垮整体性能。

[本节为通用指导,无需列出具体文件来源]

故障排查指南

  • 确认 Feign 客户端是否正确启用:检查 @EnableFeignClients 是否包含目标 API 接口。
  • 检查 tag 透传:确认 EnvRequestInterceptor 是否生效,请求头中是否存在 tag。
  • 负载均衡问题:确认 EnvLoadBalancerClientFactory 是否被加载,实例列表是否包含匹配 tag 的服务实例。
  • 熔断与降级:检查 Resilience4j 配置与 fallbackFactory 实现,验证熔断触发条件。
  • 配置导入:确认 application.yaml 中的配置导入顺序与命名空间设置是否正确。

章节来源

结论

yudao-cloud 基于 OpenFeign 提供了声明式的 RPC 同步调用能力,并通过 Spring Cloud LoadBalancer 与 Resilience4j 实现高可用与高性能。环境模块进一步增强了多环境隔离与灰度能力,业务模块通过自动配置统一接入 Feign 客户端。遵循本文的最佳实践与配置建议,可有效提升系统的稳定性与可维护性。

附录

  • 示例应用配置参考:application.yaml 中的配置导入与命名空间设置。
  • 业务模块自动配置参考:租户、操作日志、API 日志、字典等模块的 @EnableFeignClients 使用方式。

章节来源

用户文档
AI 助手
Agent 列表
请选择一个 Agent 开始对话
AI 问答