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

gRPC从0到1系列【22】

文章目录

  • gRPC拦截器
      • 7.3.4 注册Interceptor
      • 7.3.5 底层原理分析
      • 7.3.6 最佳实践与注意事项
      • 7.3.7 总结

gRPC拦截器

7.3.4 注册Interceptor

✅ 1. 单个Interceptor注册

Server server = ServerBuilder.forPort(8080).addService(new GreeterServiceImpl()).intercept(new LoggingServerInterceptor()) // 添加拦截器.build();

✅ 2. 多个 Interceptor(链式)

Server server = ServerBuilder.forPort(8080).addService(new GreeterServiceImpl()).intercept(new AuthServerInterceptor())     // 先执行.intercept(new LoggingServerInterceptor())   // 后执行.intercept(new UserContextInterceptor())    // 最后执行(最靠近业务).build();

🔁 执行顺序

  • 请求阶段:从 addService 后第一个 intercept() 开始,依次执行。
  • 响应阶段:逆序执行(类似栈)

7.3.5 底层原理分析

✅ 1. 调用链构建

gRPC 内部将多个 ServerInterceptor 和 BindableService 组合成一个责任链

ServerCallHandler finalHandler = (call, headers) -> {return serviceImpl.bindService().apply(call, headers);
};for (ServerInterceptor interceptor : interceptors) {finalHandler = (call, headers) -> interceptor.interceptCall(call, headers, finalHandler);
}

最终调用时,形成嵌套结构:

Interceptor1.interceptCall(call,headers,(call, headers) -> Interceptor2.interceptCall(call,headers,(call, headers) -> ServiceImpl...)
)

✅ 2. 为什么能控制请求/响应

  • 请求控制:通过返回自定义 ServerCall.Listener,重写 onMessage()onHalfClose() 等方法。
  • 响应控制:通过包装 ServerCall,重写 sendMessage()close() 方法。

7.3.6 最佳实践与注意事项

✅ 最佳实践

  • 轻量级:Interceptor 应快速执行,避免阻塞 I/O。
  • 异常安全:捕获异常,避免导致整个服务崩溃。
  • 资源清理:在 close() 中释放资源(如 MDC 清理)。
  • 顺序合理:认证 → 日志 → 业务上下文。
  • 使用 Context:传递请求级数据,避免 ThreadLocal。

⚠️ 常见错误

错误后果修复
忘记调用 super.close()客户端 hang 住必须调用父类方法
在 interceptCall 中抛异常服务崩溃捕获异常并返回 Status.INTERNAL
修改不可变 Metadata运行时异常使用 new Metadata() 并 copy

7.3.7 总结

特性说明
功能强大支持请求/响应拦截、元数据操作、上下文注入
非侵入式业务代码零修改
链式组合多个拦截器可灵活组合
性能高效基于回调,无反射开销
适用场景认证、日志、监控、限流、调试、多租户等

ServerInterceptor 是 gRPC 服务端开发的基石组件,掌握它能极大提升系统可观测性与安全性。建议在所有生产级 gRPC 服务中合理使用拦截器。

🔚 提示:客户端也有 ClientInterceptor,机制类似,可用于统一设置请求头、重试等。

http://www.dtcms.com/a/449842.html

相关文章:

  • 闹钟定时器(Alarm Timer)初始化:构建可挂起的定时器基础框架
  • 云南公司建网站多少钱wordpress修改菜单的原始链接
  • 自己如何建设个网站首页站酷网官方入口网页版
  • 华为matebook16s 2022数字键无法使用解决方法
  • 邯郸网站建设品牌公司app和网站开发区别
  • 并查集的优化
  • LeetCode:93.最长回文子串
  • 设计作品网站有哪些宝塔建的数据库安装不了wordpress
  • 锐捷无线控制器基础配置
  • mineru处理后的文档生成对应层级的标题
  • 台山网站建设公司公司网站建设如何撤销
  • 辛集做网站公司麻豆秋白色蕾丝半身裙
  • Java:面向对象:内部类:静态内部类与非静态内部类的比较
  • 基于32位MCU的LVGL移植
  • 基于STM32单片机的语音控制智能停车场设计
  • (Kotlin协程十三)Dispatchers.Main, IO, Default 分别适用于什么场景?它们的底层是什么?
  • 郑州网站建设 seo郑州网络营销公司哪家好
  • 中山精品网站建设信息手机可以创建网站吗
  • 学习Java第三十二天——黑马点评43~47
  • 宿迁网站推广公司做企业宣传网站
  • 优选算法-双指针:6.和为s的两个数字
  • [linux仓库]System V 进程通信详解:System V消息队列、信号量
  • css过渡属性
  • Linux系统--文件系统--动静态库
  • Spring进阶 - SpringMVC实现原理(二)DispatcherServlet处理请求的过程
  • SQL 面试高频:INNER JOIN vs LEFT JOIN 怎么考?
  • 【51单片机】【protues仿真】基于51单片机智能路灯控制系统
  • 3d模型免费素材网站wordpress如何修改行距
  • 再探类对象——C++入门进阶
  • 公司网站如何维护wordpress去掉title前空格及keywords最后的逗号