通过Nginx实现gRPC服务的负载均衡 | gRPC双向数据流的交互控制系列(3) - Go语言中文社区

通过Nginx实现gRPC服务的负载均衡 | gRPC双向数据流的交互控制系列(3)


前情提要

本系列的第一篇文章 通过一个例子介绍了go语言实现gRPC双向数据流的交互控制,第二篇文章介绍了如何通过Websocket与gRPC交互。通过这两篇文章,我们可以一窥gRPC双向数据流的开发方式,但是在生产环境当中一台服务器(一个服务端程序)是不够的,我们往往会面临各种复杂情况:访问量上来了一台服务器不够怎么办?服务器挂了怎么办?有实战经验的读者肯定知道答案:上负载均衡(Load Balancing)啊!

gRPC服务如何做负载均衡?

gRPC官方博客上有一篇文章《gRPC Load Balancing》(https://grpc.io/blog/loadbalancing),详细介绍了几种方案,并分析了几种方案各自的优劣。并附了一张解决方案表:

gRPC负载均衡解决方案表

在gRPC的Github上还有一篇文章叫《Load Balancing in gRPC》(https://github.com/grpc/grpc/blob/master/doc/load-balancing.md),如果英文看着费劲可以看一篇中文的《gRPC服务发现&负载均衡》(https://segmentfault.com/a/1190000008672912)。


测试Nginx对gRPC服务的支持

因为上面几篇文章介绍的很详细了,所以本文不再展开讨论。我们可以注意到上表中被红框圈起来的部分写着“Nginx coming soon”,现在这个Nginx的解决方案已经来了——2018年3月17日,Nginx官方宣布nginx 1.13.10支持gRPC (https://www.nginx.com/blog/nginx-1-13-10-grpc/)

第一步:下载nginx最新的stable版(本文发稿时是1.14.0,如果会用docker的也可以下载其alpine版本)。
第二步:配置nginx的config文件如下

server {
   # ⚠️ nginx的监听端口按你的实际情况设置
    listen  80     http2;
    access_log /var/log/nginx/access.log main;
    location / {
        # ⚠️ 把下面的 grpc://127.0.0.1:3000换成你自己的grpc服务器地址
        grpc_pass grpc://127.0.0.1:3000;
    }
}

第三步:把go语言实现gRPC双向数据流的交互控制 一文中的client.go 中的服务端地址改为nginx服务的地址(比如:127.0.0.1:80)

第四步:
(1)运行server.go
(2)运行nginx服务
(3)运行client.go

如果没什么意外,gRPC客户端发出的消息可以通过nginx后被gRPC服务端收到。


nginx日志

我们可以通过nginx日志观察到相应的信息。

一个小坑

上述连接虽然已经实现,但是如果我们的客户端有连续一分钟没有输入信息,会出现接收信息出错的情况。


连接被nginx断开

这种情形在没有使用nginx的时候不会出现,由于以前使用nginx给websocket做反向代理时也出现过类似情况,故而推断是nginx对超过一段时间的连接进行了断开。

添加心跳

解决上述问题可以采取的一个方法是增加心跳(如果您发现了什么别的好办法可以解决这个问题,比如在nginx里配置一些参数,请留言告诉我

版权声明:本文来源简书,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://www.jianshu.com/p/611d586f58cd
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-01-12 11:46:51
  • 阅读 ( 2036 )
  • 分类:Go Web框架

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢