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