grpc 报错解决 code = Unavailable desc = transport is closing

本文探讨了gRPC客户端报错'rpcerror:code=Unavailabledesc=transportisclosing'的原因,通常是因为连接长时间未使用而被服务端断开。通过调整gRPC参数,如设置MaxConnectionIdle为5分钟,可以有效防止因网络proxy问题导致的连接异常关闭。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近遇到 grpc 客户端报错 rpc error: code = Unavailable desc = transport is closing,原因是连接长时间没有使用,被服务端断开,

但是看过grpc源码的都知道,如果failfast 设置为false的话,应该会重试的;并且 连接关闭之后grpc.clientConn也会维护这个状态,所以不应该出现这个问题才对,

这个是个很奇怪的事情

后来考虑了一下有可能是网络之间proxy等的问题,因为长时间不活跃关闭了,但是不通知grpc的client和server端

在 grpc.NewServer(opt...) 的时候加上 以下参数,就是连接长时间不使用,就释放

验证完美解决问题

grpc.KeepaliveParams(keepalive.ServerParameters{
			MaxConnectionIdle: 5 * time.Minute, //这个连接最大的空闲时间,超过就释放,解决proxy等到网络问题(不通知grpc的client和server)
		}

 

 

在使用Nginx作为反向代理服务器来代理gRPC服务时,遇到“not an SSL/TLS record”错误通常是因为Nginx配置不正确,导致它无法正确处理gRPC的HTTP/2协议。以下是一些可能的解决方案和配置示例: ### 解决方案 1. **确保Nginx版本支持HTTP/2**: - Nginx从1.9.5版本开始支持HTTP/2。确保你使用的Nginx版本支持HTTP/2。 2. **配置SSL/TLS**: - gRPC默认使用HTTP/2协议,而HTTP/2在生产环境中通常需要SSL/TLS加密。确保Nginx配置了正确的SSL证书和密钥。 3. **正确配置Nginx以支持gRPC**: - 在Nginx配置文件中,添加`grpc_pass`指令,并确保使用了正确的协议和端口。 ### 示例配置 ```nginx server { listen 443 ssl http2; server_name your_domain.com; ssl_certificate /path/to/your/fullchain.pem; ssl_certificate_key /path/to/your/privkey.pem; location /your_grpc_service/ { grpc_pass grpc://localhost:50051; # 如果gRPC服务使用HTTP/2 over TLS,可以使用grpcs # grpc_pass grpcs://localhost:50051; } } ``` ### 详细步骤 1. **安装支持HTTP/2的Nginx版本**: - 可以通过包管理器安装最新版本的Nginx,或者从源码编译安装。 2. **配置SSL证书**: - 将SSL证书和私钥路径配置到Nginx配置文件中。 3. **配置gRPC反向代理**: - 在`location`块中使用`grpc_pass`指令,并指定gRPC服务的协议和地址。 ### 常见问题 - **Nginx版本不支持HTTP/2**: - 确保Nginx版本至少为1.9.5,并且编译时启用了HTTP/2支持。 - **SSL/TLS配置错误**: - 检查SSL证书和私钥路径是否正确,确保证书有效。 - **协议不匹配**: - 确保`grpc_pass`指令中使用的协议与gRPC服务使用的协议一致。如果gRPC服务使用TLS加密,使用`grpcs`协议。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值