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

gRPC从0到1系列【23】

文章目录

  • gRPC拦截器
    • 7.4 ClientInterceptor
      • 7.4.1 什么是ClientInterceptor?
      • 7.4.2 ClientInterceptor工作流程
      • 7.4.3 常见应用场景
      • 7.4.4 实战示例
      • 7.4.5 重试、超时

gRPC拦截器

7.4 ClientInterceptor

gRPC 中的 ClientInterceptor(客户端拦截器)是一种强大的机制,允许开发者在客户端发起 gRPC 调用的前后插入自定义逻辑。这些逻辑可以用于日志记录、认证、监控、重试、超时控制、请求/响应修改等多种用途。

7.4.1 什么是ClientInterceptor?

ClientInterceptor 是 gRPC 客户端的一个扩展点,它可以在每次 RPC 调用执行前或执行后拦截请求和响应。它类似于 Web 开发中的“中间件”(middleware)。

在 gRPC 的 Java 实现中,ClientInterceptor 是一个接口:

public interface ClientInterceptor {<ReqT, RespT> ClientCall<ReqT, RespT> interceptCall(MethodDescriptor<ReqT, RespT> method,CallOptions callOptions,Channel next);
}
  • method:描述被调用的方法(包括方法名、请求/响应类型等)。
  • callOptions:调用选项(如 deadline、权威、压缩等)。
  • next:下一个 Channel(可以是另一个拦截器或最终的底层通道)。
  • 返回一个 ClientCall 对象,代表这次调用的封装。

相关核心类:

// 客户端调用接口
public abstract static class ClientCall<ReqT, RespT> {public abstract void start(Listener<RespT> responseListener, Metadata headers);public abstract void sendMessage(ReqT message);public abstract void halfClose();public abstract void cancel(String message, Throwable cause);public abstract void request(int numMessages);
}// 响应监听器
public abstract static class Listener<T> {public void onHeaders(Metadata headers) {}public void onMessage(T message) {}public void onClose(Status status, Metadata trailers) {}public void onReady() {}
}

7.4.2 ClientInterceptor工作流程

当你将一个或多个 ClientInterceptor 应用于 gRPC 客户端时,它们会按照注册顺序形成一个调用链

MyServiceGrpc.MyServiceBlockingStub stub = MyServiceGrpc.newBlockingStub(channel).withInterceptors(interceptor1, interceptor2);

调用链顺序为:

stub → interceptor1 → interceptor2 → 实际网络调用

每个拦截器可以选择:

  • 修改请求/响应;
  • 添加 metadata(如认证 token);
  • 记录日志;
  • 处理异常;
  • 控制调用流程(如提前终止、重试等)。

7.4.3 常见应用场景

在这里插入图片描述

7.4.4 实战示例

✅ 1. 添加认证信息

package cn.tcmeta.grpc.interceptor;import io.grpc.*;public class AuthInterceptor implements ClientInterceptor {private final String token;public AuthInterceptor(String token) {this.token = token;}@Overridepublic <ReqT, RespT> ClientCall<ReqT, RespT> interceptCall(MethodDescriptor<ReqT, RespT> method,CallOptions callOptions,Channel next) {ClientCall<ReqT, RespT> call = next.newCall(method, callOptions);return new ForwardingClientCall.SimpleForwardingClientCall<>(call) {@Overridepublic void start(Listener<RespT> responseListener, Metadata headers) {headers.put(Metadata.Key.of("authorization", Metadata.ASCII_STRING_MARSHALLER), "Bearer " + token);super.start(responseListener, headers);}};}
}

✅ 2. 日志记录

package cn.tcmeta.grpc.interceptor;import io.grpc.*;public class LoggingInterceptor implements ClientInterceptor {@Overridepublic <ReqT, RespT> ClientCall<ReqT, RespT> interceptCall(MethodDescriptor<ReqT, RespT> method,CallOptions callOptions,Channel next) {System.out.println("Calling method: " + method.getFullMethodName());ClientCall<ReqT, RespT> call = next.newCall(method, callOptions);return new ForwardingClientCall.SimpleForwardingClientCall<>(call) {@Overridepublic void sendMessage(ReqT message) {System.out.println("Sending request: " + message);super.sendMessage(message);}};}
}

7.4.5 重试、超时

可以通过包装 ClientCall.Listener 来监听失败,并在特定条件下重试.

虽然 CallOptions 支持 deadline,但拦截器可以动态设置:

CallOptions newOptions = callOptions.withDeadlineAfter(5, TimeUnit.SECONDS);
ClientCall<ReqT, RespT> call = next.newCall(method, newOptions);
http://www.dtcms.com/a/453111.html

相关文章:

  • Element Plus 完整教程:从背景到实践
  • Qt编写上下界面切换效果/前进到下一个界面/后退到上一个页面/零件工艺及管理设计系统
  • 第3章 多线程服务器的适用场合与常用编程模型
  • 网站开发什么课程佛山建站模板制作
  • Lua语法(2)
  • npm、npx、pnpm 深度解析:从原理到实战的全方位指南
  • Qt Qml Drag and Drop-鼠标拖动添加组件
  • 神经网络之为什么回归任务的输出是高斯分布的均值
  • 《深入理解 Django 中间件:请求-响应生命周期与执行顺序全解析》
  • HC32项目搭建
  • 台式真空共晶炉口碑企业
  • 网站开发宣传标语网站建设基本情况
  • [效率]学习哔哩哔哩视频的的笔记|对于书签的想法思考
  • 网站一级页面标题怎么做wordpress js库
  • Python 数字类型与类型转换
  • Python int()函数
  • 【Qt】绘图
  • Java 集合框架全解析:从数据结构到源码实战
  • 北京商地网站建设公司photoshop设计一个精美的网站主页
  • 【MYSQL】统计用户旅行距离的SQL解决方案:排序规则与稳定性全解析
  • 基于单片机的罐体压力控制器设计与实现
  • C# datagridview读取XML数据和保存到XML的例子
  • OPENPPP2 静态隧道链路迁移平滑(UDP/IP)
  • 使用Unity引擎开发Rokid主机应用的模型交互操作
  • 数据中台的数据源与数据处理流程
  • Oracle数据库impdp/expdp
  • Java学习之旅第第二季-10:包装类
  • 微信网站与响应式网站有哪些如何建立营销型网站
  • PanguHA,一款Windows双机热备工具
  • PostgreSQL 从入门到精通:Windows 环境下安装与使用指南