grpc-proxy

作用:

  • 接受请求方的gRPC请求,并透明的数据转发到对应的响应方
  • 接受响应方的gRPC回复,并透明的将数据回送到原请求方

    原理

  1. 在proxy内部,不需要对其进行任何形式编码,直接转发。因此,对于收到的protobuf,我们采用默认的protobuf codec
  2. 当proxy接收到任何一个请求流之后,需要根据该流携带的信息,判断出正确的对应的目的方,并建立该目的方的链接connection,从而将请求通过connection发送到目的方
  3. 当获得connection时,需要一个数据处理的handler,通过该connection去真正操作数据的转发(同时一边接受请求方数据并推送到响应方,一边接受响应方数据并回复到请求方)
  4. 负载均衡:实现通过不同负载均衡算法到不同的后端(通过k8s的svc实现)

    流程

  5. 接收客户端的请求,通过grpc库将客户端的上下文取出(不需要解码),然后就通过context.WithCancel(ctx) 取出其子上下文,然后指定服务端地址,将父上下文发送给服务端,收到返回后,将子上下文和服务端的连接返回给客户端

    客户端请求时,我们通过grpc库获取到流携带的信息,判断出正确的对应的目的方(通过请求的方法了解去向,相当于rpc的反向代理),然后将请求转发给服务端,服务端返回的值就直接通过这个连接返回了。

  6. 出现问题,就是在方法结束后,grpc的转发中间件就关闭了tcp的连接,而没有关闭文件描述符

  7. 补救方法,就是在客户端意外结束,或中间件在某个时刻要关闭时,就关闭文件描述符,然后再关闭tcp的连接(其实就是获取连接时,我们需要一个数据处理的handler去获取请求的地址,然后要通过defer关键字在调用完这个handler之后关闭它)