nginx用gRPC做反向代理,让速度飞起来

什么是grpc?

gRPC 是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计。目前提供 C、Java 和 Go 语言版本,分别是:grpc, grpc-java, grpc-go. 其中 C 版本支持 C, C++, Node.js, Python, Ruby, Objective-C, PHP 和 C# 支持.

gRPC 基于 HTTP/2 标准设计,带来诸如双向流、流控、头部压缩、单 TCP 连接上的多复用请求等特。这些特性使得其在移动设备上表现更好,更省电和节省空间占用。

划重点

基于 HTTP/2 标准设计

既然如此,grpc天然继承了http2最牛逼的优势:多路复用 (Multiplexing)

多路复用允许同时通过单一的 HTTP/2 连接发起多重的请求-响应消息。

那对于我们来说有什么好处呢?

好处是显而易见的:

对于用户

由于目前http1.1协议无法多路复用及浏览器的限制(不同浏览器对于同一时间的请求连接数量有限制) 直接导致请求限制阻塞,打开需要加载资源较多的网站时速度很慢,而HTTP由于可以在同一条连接内多重的请求-响应消息,大大降低了资源等待时间。

对于我们搞运维的

在平常的工作中大家部署最多的事情就是反向代理。

通常都是前置nginx后挂在多个应用容器(tomcat)

由于nginx反向代理走的是http1.1协议所以导致nginx接收到用户请求后都会通过http1.1协议对后端应用容器发起请求

大家知道发起一次的http,发起方就会临时建立一个socket作为与对端建立连接的通道。如果遇到高并发高请求量的时候。由于socket资源有限,很容易导致网络IO阻塞等一系列问题。

那如何解决这个问题呢?

方法很多,但是今天我们将用grpc去实现(如图)

这里写图片描述

nginx从1.13.10开始支持grpc

tomcat 从 8.0以上支持http2 及 h2c

由于grpc 基于 HTTP/2 标准设计 所以本质上是http2 在服务端和客户端都支持http2的情况下就可以建立http2连接。

nginx (需安装–with-http_ssl_module –with-http_v2_module 插件)只需在原来的反向代理处将

proxy_pass http://127.0.0.1:8080;

改写成:

grpc_pass grpc://127.0.0.1:8080

tomcat 只需在对应的端口Connector里加上下面这一条


 <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />

由于采用了HTTP2 多路复用的特性。 当nginx需要将大量代理请求发送给后端应用容器的时候,就会避免大部分由于socket资源有限而导致网络IO阻塞。同时由于采用多路复用的机制。发送请求及接受到请求的速度也加快。大大提高了服务器处理数据的速度和能力。

感兴趣的可以动手试试咯~

猜你喜欢

转载自blog.csdn.net/dearmark/article/details/80066819