微服务网关(五)grpc代理模块

news2024/12/23 15:37:13

微服务网关(五)grpc代理模块

GRPC是谷歌出品的一个高性能、开源、通用的RPC框架,基于HTTP/2标准设计,支持普通RPC也支持双向流式传递,相对于thrift连接,它可以多路复用,可传递header头数据

在http请求当中我们可以设置header用来传递数据,grpc底层采用http2协议也是支持传递数据的,采用的是metadata。http传递的是文本形式的文件

Metadata 对于 gRPC 本身来说透明, 它使得 client 和 server 能为对方提供本次调用的信息。rpc传递的是二进制文件

就像一次 http 请求的 RequestHeader 和 ResponseHeader,http header 的生命周期是一次 http 请求, Metadata 的生命周期则是一次 RPC 调用。

GRPC透明代理

不需要实现grpc的IDL结构体

GRPC代理服务器的代理实现:

image-20230124165722192

请求流程:
image-20230124170945836

一次grpc服务端的启停

整体上与TCP类似,不过多赘述,只举出不同之处的主体代码

grpcserver.go

func GrpcServerRun() {
   ....
      go func(serviceDetail *dao.ServiceDetail) {
         addr := fmt.Sprintf(":%d", serviceDetail.GRPCRule.Port)
         rb, err := dao.LoadBalancerHandler.GetLoadBalancer(serviceDetail)
         ....
         lis, err := net.Listen("tcp", addr)
         ....
         //设置负载均衡策略
         grpcHandler := reverse_proxy.NewGrpcLoadBalanceHandler(rb)
         s := grpc.NewServer(
            grpc.ChainStreamInterceptor(
               grpc_proxy_middleware.GrpcFlowCountMiddleware(serviceDetail),
               grpc_proxy_middleware.GrpcFlowLimitMiddleware(serviceDetail),
               grpc_proxy_middleware.GrpcJwtAuthTokenMiddleware(serviceDetail),
               grpc_proxy_middleware.GrpcJwtFlowCountMiddleware(serviceDetail),
               grpc_proxy_middleware.GrpcJwtFlowLimitMiddleware(serviceDetail),
               grpc_proxy_middleware.GrpcWhiteListMiddleware(serviceDetail),
               grpc_proxy_middleware.GrpcBlackListMiddleware(serviceDetail),
               grpc_proxy_middleware.GrpcHeaderTransferMiddleware(serviceDetail),
            ),
            grpc.UnknownServiceHandler(grpcHandler),
         )
         ....
          //开启服务
         if err := s.Serve(lis); err != nil {
            log.Fatalf(" [INFO] grpc_proxy_run %v err:%v\n", addr, err)
         }
      }(tempItem)
   }
}

func GrpcServerStop() {
   for _, grpcServer := range grpcServerList {
      grpcServer.GracefulStop()
      log.Printf(" [INFO] grpc_proxy_stop %v stopped\n", grpcServer.Addr)
   }
}

grpc_reverse_proxy.go

func NewGrpcLoadBalanceHandler(lb load_balance.LoadBalance) grpc.StreamHandler {
   return func() grpc.StreamHandler {
      nextAddr, err := lb.Get("")
      if err != nil {
         log.Fatal("get next addr fail")
      }
      director := func(ctx context.Context, fullMethodName string) (context.Context, *grpc.ClientConn, error) {
         c, err := grpc.DialContext(ctx, nextAddr, grpc.WithInsecure())
         md, _ := metadata.FromIncomingContext(ctx)
         outCtx, _ := context.WithCancel(ctx)
         outCtx = metadata.NewOutgoingContext(outCtx, md.Copy())
         return outCtx, c, err
      }
      return proxy.TransparentHandler(director)
   }()
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/344325.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ubuntu20.04 安装Azure Kinect Sensor

本文主要记录Ubuntu20.04 安装Azure Kinect Sensor SDKAzure Kinect 人体跟踪 SDK官网:https://learn.microsoft.com/zh-cn/azure/Kinect-dk/body-sdk-downloadLinux版本目前只支持18.04和20.04Azure Kinect 传感器 SDK 官网:https://learn.microsoft.co…

ubuntu20.04下配置深度学习环境GPU

卸载子系统 C:\Users\thzn>wsl --list 适用于 Linux 的 Windows 子系统分发版: docker-desktop (默认) docker-desktop-data Ubuntu-18.04 Ubuntu-22.04 Ubuntu-20.04 C:\Users\thzn>wsl --unregister Ubuntu-18.04 ubuntu 换源 https://www.cnblogs.com/Horizon-asd/p…

【编程基础之Python】4、安装Python开发工具

【编程基础之Python】4、安装Python开发工具安装Python开发工具为什么需要开发工具Anaconda自带的开发工具PyCharm安装PyCharm运行PyCharm并创建项目总结安装Python开发工具 为什么需要开发工具 通常情况下,为了提高开发效率,需要使用相应的开发工具&a…

Three.js 无限平面快速教程【Plane】

Three.js 提供了 Plane 概念来表示在 3d 空间中无限延伸的二维表面。 这对于光标交互很有用,因此你可能需要了解如何设置此平面、将其可视化并根据需要进行调整。 推荐:使用 NSDT场景设计器 快速搭建 3D场景。 Three.js 的 Plane 文档很好而且准确&…

Locust初次体验【解决webUI没数据】

官方文档:What is Locust? — Locust 2.14.2 documentation webUI模式跑起来没有数据。。。。???; E:\T_Work\other\WB_Locust\my_locustfiles>locust [2023-02-14 09:57:44,530] PC-20190108TSZQ/INFO/locust.m…

Java 基础面试题——基本数据类型与包装类

目录1.Java 有哪几种基本数据类型?分别对应哪些包装类?2.Java 中为什么要保留基本数据类型?为什么要使用包装类?3.基本数据类型的转换规则有哪些?4.基本数据类型与包装类有什么区别?5.什么是装箱&#xff1…

MongoDB--》索引的了解及具体操作

目录 索引—index 索引的类型 索引的管理操作 索引的使用 索引—index 使用索引的原因:索引支持在MongoDB中高效地执行查询。如果没有索引,MongoDB必须执行全集合扫描,即扫描集合中的每个文档,以选择与查询语句匹配的文档。这…

基于android的即时通讯APP 聊天APP

基于android的即时通讯APP 或者 聊天APP 一 项目概述 该项目是基于Android 的聊天APP系统,该APP包含前台,后台管理系统,前台包含用户通讯录,用户详情,用户聊天服务,用户二维码,发现功能,发现详情 , 个人中心, 个人信…

【RSTP的原理和配置】

一、RSTP 概述 RSTP使用了IEEE 802.1W协议,视为STP的改进版本,收敛速度快,兼容STP。 RSTP可以兼容STP,但是会丧失快速收敛等优势; 1、RSTP对STP的改进; 1.1、端口角色的增补、简化了生成树协议的理解及部…

【基于transform和CNN的多级蒸馏:超分】

A hybrid of transformer and CNN for efficient single image super-resolution via multi-level distillation (基于transform和CNN的多级蒸馏单幅图像超分辨率算法) 近年来,基于卷积神经网络(CNN)的单幅图像超分辨…

Boost库的编译

废话就不多说了,直接上boost编译的方法。 1、下载boost库源码 https://github.com/missionlove/boost 2、使用vs命令行工具,选择对应的Command工具 3、切换目录到Boost源码 bootstrap.bat 文件所在的目录下 4、运行bootstrap.bat 脚本 start bootst…

CSS单位之vw、vh、vmin、vmax、%

CSS单位之vw、vh、vmin、vmax、% vm/vh:相对于视窗(Viewport)的高度和宽度。 1vh 等于1/100的视窗高度,1vw 等于1/100的视窗宽度。 视窗(Viewport)是指浏览器内部的可视区域大小,即window.innerWidth/window.innerHei…

研报精选230213

目录 【行业230213西南证券】医疗创新器械-内窥镜行业专题:核心三问,内窥镜技术趋势图谱和投资机会【行业230213国金证券】基础化工行业研究:成长接力,继续看好有边际变化的新材料【行业230213民生证券】有色金属周报:…

Hazel游戏引擎(004)

本人菜鸟,文中若有代码、术语等错误,欢迎指正 我写的项目地址:https://github.com/liujianjie/GameEngineLightWeight(中文的注释适合中国人的你) 文章目录前言操作步骤讲解GitHubHazel项目此项目定位项目属性修改Sand…

【蓝桥集训】第一天——前缀和

作者:指针不指南吗 专栏:Acwing 蓝桥集训每日一题 🐾输出的时候,注意数据类型🐾 文章目录1.截断数组2.前缀和3.子矩阵的和4.k倍区间1.截断数组 给定一个长度为 n 的数组 a1a_1a1​,a2a_2a2​,…,ana_nan​。 现在&…

Windows提权流程及手法

Windows提权一、信息收集二、WinSystemHelper三、Sherlock四、MSF提权五、参考链接一、信息收集 收集本机systeminfo中补丁信息 在提权辅助平台 https://i.hacking8.com/tiquan/ 中查询可利用exp 查询exp,选择对应的Exp下载运行 https://i.hacking8.com/ https:/…

在google设置静态页面 CDN加速

一、 创建bucket,设置bucket 链接:https://console.cloud.google.com/storage/browser 创建bucket 设置bucket公开访问 在bucket列表中,进入刚创建的bucket。 选择页面顶部附近的权限标签。 在权限部分中,点击 person_add 授…

Linux操作系统学习(了解环境变量)

文章目录环境变量初识除了上述介绍的PATH&#xff0c;还有一些常见的环境变量如&#xff1a;查看环境变量方法 &#xff1a;环境变量的基本概念&#xff1a;本地变量&#xff1a;环境变量初识 环境变量解释起来比较抽象&#xff0c;先看示例&#xff1a; #include <stdio.…

如果你是O型血的准妈妈,新生儿溶血症一定要提前了解,有备无患

婚姻&#xff0c;最重要的是同理心&#xff0c;合适的家庭&#xff0c;但一个刚刚分娩的宝贝妈妈认为&#xff0c;爱也可能需要血型匹配。原因是宝马刚出生的宝宝在医院治疗黄疸&#xff0c;因为宝马是O型血&#xff0c;而丈夫不是O型血&#xff0c;医院治疗黄疸的宝宝很多。这…

完美解决:重新安装VMware Tools灰色。以及共享文件夹的创建(centos8)

解决&#xff1a;重新安装VMware Tools灰色问题&#xff1a;重新安装VMware Tools灰色解决方案-挂载VMware中的linux.iso1. vmtools的linux.iso挂载及安装2. 共享文件夹的创建及配置问题&#xff1a;重新安装VMware Tools灰色 发现一个小问题&#xff0c;我的vm虚拟机安装后发…