nginx也许并不是service mesh最好的选择,envoy才是

背景

前几天好几个公众号推送了这样一篇文章:《Service Mesh利器:NGINX将支持gRPC》,更有甚者鼓吹nginx是第一个支持grpc的代理。看到这几篇文章的时候,我总想说点关于国内的互联网发展。

这几年国内互联网行业变化飞快。先是微服务,当时国内各大线下交流会议都是各种微服务框架的分享,比如zookeeper采坑之类,微服务的十二要素啊,服务治理什么的。然后接着就是直播行业,这时线下会议又变成了视频秒开啊,如何连麦啊,cdn优化啊等等。不仅技术从业者都往这上面冲,各大投资者也是一个劲地往里砸钱,都不想错过这个风口。到去年,又有人开始鼓吹直播已死。这个时候听到更多的一个词又是devops,这个时候,可能听到的更多就是全链路监控告警,apm优化,devops实践等等。到了今年,情况就更夸张了,kubernetes、区块链、人工智能,尤其是区块链,只要上市公司有一点区块链概念沾边,估价就蹭蹭蹭地网上涨停,比如迅雷、人人网。接下来只怕是公司有一点人工智能的概念,那也会不得了。到今年年末明年年初,我断定,service mesh又肯定会成为各大线下会议的主要课题。

百花齐放固然是好,但技术的革新不可能如此的快。著名的一万小时理论告诉我们,如果要精通一门技术,一年的时间是远远不够的。我觉得国内互联网氛围有点浮躁了,这不好,尤其是对刚毕业的年轻人。

什么是grpc

gRPC is a modern open source high performance RPC framework that can run in any environment. It can efficiently connect services in and across data centers with pluggable support for load balancing, tracing, health checking and authentication. It is also applicable in last mile of distributed computing to connect devices, mobile applications and browsers to backend services.

简单点说,grpc就是谷歌出的rpc框架,数据交换格式基于protobuf,数据传输基于http2。谷歌提供了大部分常用语言的sdk。

grpc代理选择:envoy

我有幸参与了一个grpc的项目,当时版本还是的0.x。说句题外话,如果是我负责选型,我断不会轻易同意将不稳定的第三方软件应用到产品里,就是非用不可,也一定要深入了解它才行。我踩过太多这样的坑了。

当时为了做grpc的负载均衡,我特地仔细研究过grpc的官方文档,google的开发人员提到了nghttpx和envoy这两种代理。

nghttpx是一个基于nghttp2的代理,nghttp2是一个http2的库,前面提到grpc本质是基于http2的通信,所以要想做grpc的代理,必须要底层要能支持http2,这也是为什么最近发布的nginx1.13才支持代理grpc的原因,因为nginx老版本并不支持http2协议。

要想做好grpc的负载均衡,只是支持http2协议还不够,必须要有基本的负载均衡算法,比如,我们的应用是根据请求的信息,调度到不同的服务器上。要想实现这样的功能,就必须基于python或其他脚本语言配置。

而envoy在这一方面就强多了,它支持多种负载均衡算法:Round robin、Weighted least request、ring hash、Maglev、Random、Original destination。对于我上面提到的例子,只需要将请求的字段放如grpc的context中,然后配置envoy时根据该字段设置好server的ring hash就行,几句配置就搞定了。

当然,envoy的强大并不仅仅局限在负载均衡算法多样。它还有如下优点:

  1. 开源,基于Modern C++11
  2. 支持三层、四层、七层代理,支持http路由
  3. 支持服务发现、健康检查。
  4. 支持mongodb、dynamodb
  5. 多种负载均衡算法
  6. 动态配置。nginx并不支持哦。

这些功能都是开源免费的,但nginx可并不一定,很多进阶功能都需要购买使用nginx plus。

关于健康检查我多说一句,很多平台的健康检查就是检查某个http接口是否有响应,或是tcp连接是否建立,但这并不代表服务功能正常,这就跟单独开线程做心跳是一个道理,envoy支持数据能正常收发层面的健康检查。

总结

所以,nginx注定了并不是service mesh的最好选择,因为envoy比它提供了更丰富的功能。不过依然可能会有很多公司使用nginx,因为nginx的运维技术相对成熟,网上资料大把。

google、ibm公司还基于envoy弄了一套service mesh的框架Istio,有空我再介绍介绍istio。


本文链接:http://www.servercoder.com/2018/03/27/envoy-grpc-not-nginx/