grpc-proxy
作用:
- 在proxy内部,不需要对其进行任何形式编码,直接转发。因此,对于收到的protobuf,我们采用默认的protobuf codec
- 当proxy接收到任何一个请求流之后,需要根据该流携带的信息,判断出正确的对应的目的方,并建立该目的方的链接connection,从而将请求通过connection发送到目的方
- 当获得connection时,需要一个数据处理的handler,通过该connection去真正操作数据的转发(同时一边接受请求方数据并推送到响应方,一边接受响应方数据并回复到请求方)
负载均衡:实现通过不同负载均衡算法到不同的后端(通过k8s的svc实现)
流程
接收客户端的请求,通过grpc库将客户端的上下文取出(不需要解码),然后就通过
context.WithCancel(ctx)
取出其子上下文,然后指定服务端地址,将父上下文发送给服务端,收到返回后,将子上下文和服务端的连接返回给客户端客户端请求时,我们通过grpc库获取到流携带的信息,判断出正确的对应的目的方(通过请求的方法了解去向,相当于rpc的反向代理),然后将请求转发给服务端,服务端返回的值就直接通过这个连接返回了。
出现问题,就是在方法结束后,grpc的转发中间件就关闭了tcp的连接,而没有关闭文件描述符
- 补救方法,就是在客户端意外结束,或中间件在某个时刻要关闭时,就关闭文件描述符,然后再关闭tcp的连接(其实就是获取连接时,我们需要一个数据处理的handler去获取请求的地址,然后要通过defer关键字在调用完这个handler之后关闭它)