当前位置: 首页 > news >正文

gRPC从0到1系列【20】

文章目录

  • 七、gRPC拦截器
    • 7.1 拦截器概述
      • 7.1.1 什么是gRPC拦截器?
      • 7.1.2 拦截器的类型划分
      • 7.1.3 核心接口
      • 7.1.4 调用链
      • 7.1.5 流程图
    • 7.2 工作原理与生命周期
      • 7.2.1 拦截器处理流程
      • 7.2.2 拦截器的执行顺序

七、gRPC拦截器

7.1 拦截器概述

7.1.1 什么是gRPC拦截器?

gRPC 拦截器是一种AOP (面向切面编程) 的实现,允许你在 RPC 调用的生命周期的特定节点(如调用前、调用后、出错时)注入自定义逻辑,而无需修改 RPC 方法本身的业务代码。

你可以把拦截器想象成 RPC 调用的 “安检员” 或 “门卫”

  • 在调用到达业务逻辑之前:检查调用者的身份(认证)、记录请求日志、修改或添加元数据。
  • 在业务逻辑执行之后:记录响应日志、收集性能指标(如耗时)、修改或添加响应的元数据。
  • 在发生异常时:记录错误日志、将业务异常转换为标准的 gRPC Status 错误。

拦截器的核心价值在于解耦:将与业务无关的通用功能(如日志、监控、安全)从业务代码中分离出来,实现代码的模块化和复用。

7.1.2 拦截器的类型划分

gRPC 拦截器分为 客户端服务端 两大类,每类又根据 RPC 模式细分:

✅ 1. 服务器端拦截器【ServerInterceptor】

RPC 类型拦截器方法签名(Java)
Unary(一元)UnaryServerInterceptor
Server StreamingServerStreamingServerInterceptor
Client StreamingClientStreamingServerInterceptor
Bidirectional StreamingBidiStreamingServerInterceptor

通用做法:使用 ServerInterceptor 接口(底层自动适配所有类型)

✅ 2. 客户端拦截器【ClientInterceptor】

RPC 类型拦截器方法签名(Java)
UnaryUnaryClientInterceptor
Streaming(三种流)StreamingClientInterceptor

通用做法:使用 ClientInterceptor 接口

7.1.3 核心接口

// 服务端拦截器
public interface ServerInterceptor {<ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(ServerCall<ReqT, RespT> call,Metadata headers,ServerCallHandler<ReqT, RespT> next);
}// 客户端拦截器
public interface ClientInterceptor {<ReqT, RespT> ClientCall<ReqT, RespT> interceptCall(MethodDescriptor<ReqT, RespT> method,CallOptions callOptions,Channel next);
}

7.1.4 调用链

客户端: 
[App][Interceptor1][Interceptor2]... → [Network]服务端:
[Network][Interceptor1][Interceptor2]... → [Business Logic]
  • next 参数:代表“下一个拦截器或最终处理者”
  • 必须调用 next.xxx(),否则调用链中断!

7.1.5 流程图

在这里插入图片描述

7.2 工作原理与生命周期

7.2.1 拦截器处理流程

拦截器的工作基于责任链模式 (Chain of Responsibility)。你可以为一个 gRPC 通道(Channel)或服务注册多个拦截器,它们会按特定顺序形成一个 “拦截器链”。

一元 RPC (Unary RPC) 的拦截流程 (以服务端为例):

ClientInterceptorChainLoggingInterceptorAuthInterceptorBusinessLogic1. Send RPC Request2. Invoke interceptor3. Check credentials in Metadata4. Proceed to next interceptor5. Log request details6. Proceed to business logic7. Execute business code8. Return response9. Log response details10. Return response11. Return response12. Send RPC Response4. Return error (UNAUTHENTICATED)5. Send RPC Erroralt[Valid][Invalid]ClientInterceptorChainLoggingInterceptorAuthInterceptorBusinessLogic

核心方法:

  • Context: 每个 RPC 调用都关联一个 Context对象,它像一个 “上下文” 或 “环境”,可以在拦截器链和业务逻辑之间传递数据(如用户身份信息)。它是不可变的,但可以通过 withValue() 创建一个包含新值的子上下文。
  • next 在拦截器的实现中,ServerCallHandler (服务端) 或 ClientCall (客户端) 对象通常被命名为 next。调用 next.startCall()或 next.invoke()意味着将 RPC 调用传递给链中的下一个拦截器。如果当前拦截器是最后一个,则 next 指向实际的业务逻辑实现。如果不调用 next,整个调用链将被中断。

7.2.2 拦截器的执行顺序

package com.example.grpc.interceptor;import io.grpc.*;/*** gRPC 拦截器核心概念演示*/
public class InterceptorConcepts {/*** 拦截器执行顺序示意图* * 客户端拦截器执行顺序: 添加顺序 → 实际调用 → 响应顺序* 服务器拦截器执行顺序: 添加顺序 → 实际处理 → 响应顺序*/// 客户端调用流程public static void demonstrateClientFlow() {System.out.println("=== 客户端拦截器执行顺序 ===");System.out.println("1. 请求拦截器 (正向顺序)");System.out.println("2. 实际RPC调用");System.out.println("3. 响应拦截器 (逆向顺序)");}// 服务器调用流程  public static void demonstrateServerFlow() {System.out.println("=== 服务器拦截器执行顺序 ===");System.out.println("1. 请求拦截器 (正向顺序)");System.out.println("2. 实际服务处理");System.out.println("3. 响应拦截器 (逆向顺序)");}
}
  • 客户端拦截器执行顺序: 添加顺序 → 实际调用 → 响应顺序
  • 服务器拦截器执行顺序: 添加顺序 → 实际处理 → 响应顺序
http://www.dtcms.com/a/446091.html

相关文章:

  • CTFHub 信息泄露通关笔记10:SVN泄露(2种方法)
  • 手机网站开发环境搭建网站建设个人网银
  • 使用 jintellitype 库在 Java 程序中实现监听 Windows 全局快捷键(热键)
  • Python驱动Ksycopg2连接和使用Kingbase:国产数据库实战指南
  • 广州网站网站建设福建建站公司
  • ⚡ arm 32位嵌入式 Linux 系统移植 QT 程序
  • VR大空间资料 02 —— 常用Body IK对比
  • 什么是网站建设需求重庆建设工程信息网查询系统
  • 高校思政专题网站建设南京有哪些知名的网站建设
  • 【SpringCloud(2)】微服务注册中心:Eureka、Zookeeper;CAP分析;服务注册与服务发现;单机/集群部署Eureka;连接注册中心
  • ionic 浮动框详解与应用
  • 开源 C++ QT QML 开发(五)复杂控件--Gridview
  • 下载建设银行官方网站工程承包合同协议书
  • 第九章:装饰器模式 - 动态增强的艺术大师
  • OpenAI 发布 GPT-5 Instant:AI 有了 “情感温度计“
  • 苏州做网站公司选苏州聚尚网络做百度百科的网站
  • SSE与轮询技术实时对比演示
  • 示范专业网站建设深圳联雅网站建设
  • php 8.4.13 更新日志
  • MongoDB 认证失败(错误码 18)
  • 深圳网站建设主页什么公司需要建立网站吗
  • 陕西省建设信息管理网站网站开发 家具销售 文献
  • 数学标准库
  • 怎么做跳转不影响原网站排名云抢购网官方网站
  • 漳州手机网站建设公司陕西专业网站建设哪家好
  • 利用 VsCode + EIDE 进行嵌入式开发(保姆级教程)
  • 长春企业网站制作优化微商好货源app下载
  • PlayerChoice系统介绍
  • 网站要实名认证旅游网站建设方案之目标
  • [ SpringWeb ] 搭建和配置