Nginx接入gPRC
gPRC官网:https://grpc.io/
NGINX将在1.13.10版本中包含grpc相关功能
这个版本支持NGINX代理gRPC TCP连接。可以用来:
发布gRPC服务,包括未加密/加密的gRPC服务。
通过单个endpoint发布多个gRPC服务,使用NGINX路由到后端服务。 甚至可以和其他HTTP/2服务使用相同的endpoint,例如网站和 REST API。
反向代理gRPC服务,对gRPC服务集群进行负载均衡。
什么是gRPC?
gRPC是一种rpc协议,用于客户端和服务端之间的通信。 gRPC设计的很紧凑并且多语言支持良好,同时支持request/response模式和流式交互。 由于其广泛的语言支持和简单面向用户的设计,该协议越来越受欢迎,其中包含服务混搭(service mesh)实现 。
无论是明文还是TLS加密,gRPC都通过HTTP/2传输。 gRPC request使用HTTP POST请求。 gRPC response也使用类似的方式,并在response结束时使用HTTP trailer 发送状态码。
因为gRPC使用了HTTP/2的连接复用和流式传输功能,所以gRPC不能使用HTTP 1.x。
使用NGINX管理gRPC服务
下面是一个简单的gRPC程序作为DEMO。
简单gRPC服务
首先,我们在客户端和服务器应用程序之间插入NGINX。 NGINX为服务器应用程序提供了一个稳定可靠的网关。
注意这里需要使用带gRPC功能的NGINX。 如果您想从源代码构建NGINX,请记住包含http_ssl和http_v2模块:
NGINX监听gRPC流量,并使用grpc_pass指令代理流量。 下面的配置是将端口80上加密的gRPC流量转发到端口50051上的服务:
我们需要确保grpc_pass指令中的地址是正确的。 重新编译客户端以指向NGINX的IP地址和监听端口。
当运行修改后的客户端时,会看到与之前相同的响应,但请求是经由GINX转发。 我们可以在访问日志中看到请求记录:
注意: NGINX不支持在明文(非TLS)端口上同时支持HTTP/1和HTTP/2。 如果你想同时处理两个协议版本,你应该为每个协议版本创建一个监听端口。
发布TLS加密的gRPC服务
上面的示例使用未加密的HTTP/2(明文)进行通信。 这对测试和部署来说非常简单,但生产环境需要加密。 你可以使用NGINX来添加这个加密层。
首先创建一个自签名证书对并修改您的NGINX服务器配置,如下所示:
修改gRPC客户端以使用TLS,连接到端口1443,并禁用证书检查(使用自签名或不可信证书时需要如此)。 如果你使用的是Go,则需要将crypto/tls和google.golang.org/grpc/credentials添加到导入列表中,并将grpc.Dial()调用修改为以下内容:
这就是需要做的所有工作。 在生产环境中,你还需要将自签名证书替换为受信任的证书颁发机构(CA)颁发的证书。
反向代理加密的gRPC服务
如果想在内部调用对gRPC请求加密。 首先需要修改服务器应用程序以侦听TLS加密( grpcs)连接:
在NGINX配置中,您需要修改将gRPC流量代理到upstream server的协议:
路由
这里将会介绍如何使用NGINX代理多个gRPC后端服务。
使用NGINX,您可以识别服务和方法,然后使用location指令路由流量。 您可能已经猜出gRPC请求URL是从proto规范中的包,服务和方法名称派生的。 考虑如下SayHello RPC方法:
调用SayHello RPC方法需要从/helloworld.Greeter/SayHello发出POST请求,如以下日志条目所示:
使用NGINX路由请求非常简单:
你可以自己尝试一下。 例子中扩展了Hello World包(在helloworld.proto )添加一个名为Dispatcher的新服务,然后创建了一个实现Dispatcher方法的新服务。 客户端使用一个HTTP/2连接向Greeter和Dispatcher服务发出RPC请求。 NGINX会将请求路由到合适的gRPC服务器。
请注意/ location块。 该块处理与已知gRPC调用不匹配的请求。 您可以使用像这样的location块提供网页内容和其他非gRPC服务。
负载均衡
如何扩展gRPC服务以增加容量并提供高可用性? NGINX的upstream group就是做这事的:
当然,如果您的upstream正在监听TLS,则可以使用grpc_pass grpcs://upstreams 。
NGINX可以采用一系列负载均衡算法来分配后端gRPC服务器上的gRPC请求。 NGINX的内置状况检查将检测后端服务是否无法响应或者是否产生错误,如果检测到后端服务出问题,NGINX会自动移除该节点。 如果没有后端节点可用,则会返回/error502grpc。
upstream grpcservers {
hash $request_uri;
server 10.35.46.141:;
server 10.35.46.142:;
}
server {
listen http2;
access_log /var/log/nginx/access.log main;
location / {
grpc_pass grpc://grpcservers;
grpc_connect_timeout 300;
grpc_read_timeout 300;
grpc_send_timeout 300;
}
}
Nginx接入gPRC的更多相关文章
- 限流(四)nginx接入层限流
一.nginx限流模块 接入层指的是请求流量的入口,我们可以在这里做很多控制,比如:负载均衡,缓存,限流等. nginx中针对限流有两个模块可以处理: 1)ngx_http_limit_req_mod ...
- nginx接入let's encrypt
按以下步骤: 一.放开443端口 我的是云服务器,默认没开放443端口,需要先在控制台放开 二.使用let’s encrypt 生成证书 执行以下命令: git clone https://githu ...
- nginx限制请求之一:(ngx_http_limit_conn_module)模块
相关文章: <高可用服务设计之二:Rate limiting 限流与降级> <nginx限制请求之一:(ngx_http_limit_conn_module)模块> <n ...
- Django Uwsgi Nginx 部署
1.django的settings配置 参照博客 https://www.cnblogs.com/xiaonq/p/8932266.html # 1.修改配置 # 正式上线关闭调试模式, 不会暴露服务 ...
- 基于nginx的频率控制方案思考和实践
基于nginx的频率控制方案思考 标签: 频率控制 nginx 背景 nginx其实有自带的limit_req和limit_conn模块,不过它们需要在配置文件中进行配置才能发挥作用,每次有频控策略的 ...
- tomcat7 使用log4j进行日志记录
将 tomcat-juli.jar 文件放置到 $CATALINA_BASE/bin 目录(实际上,该目录下已经有了) 从 log4j 网站下载 jar 包,并放置于 $CATALINA_BASE/l ...
- 面向亿万级用户的QQ一般做什么?——兴趣部落的Web同构直出分享
作者:李强,腾讯web开发工程师 商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. 原文链接:http://wetest.qq.com/lab/view/348.html 一.什么是同构 ...
- 面向亿万级用户的QQ一般做什么?——兴趣部落的 Web 同构直出分享
欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 作者:李强,腾讯web开发工程师商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处.原文链接:http://wetest.qq.co ...
- Java 多线程 高可用原则
高可用原则 1 降级 降级开关的设计思路如下: 1. 集中管理开关:把开关推送到各个应用. 2. 可降级的多级读服务:比如服务调用降级为只读本地缓存.只读分布式缓存.只读默认降级数据(如库存状态默认有 ...
随机推荐
- day 28
目录 操作系统发展史 穿孔卡片 联机批处理系统 脱机批处理系统 多道技术(基于单核情况下研究) 单道 多道技术 并发与并行 进程 程序与进程 进程调度 先来先服务调度 短作业优先调度 时间片轮转法 分 ...
- org.apache.catalina.core.StandardService - Stopping service [Tomcat]
今天在启动springboot项目突然启动失败,但是在测试日志文件,以为是日志出错,下面这个是logback打印的异常信息. 2019-05-30 15:09:10.686 [restartedMai ...
- Httpd服务入门知识-Httpd服务常见配置案例之定义路径别名
Httpd服务入门知识-Httpd服务常见配置案例之定义路径别名 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.创建测试数据 [root@node101.yinzhengj ...
- 配置nginx的systemctl命令
启动nginx的命令为 /usr/local/nginx/sbin/nginx 停止nginx的命令为 /usr/local/nginx/sbin/nginx -s stop 重启ng ...
- LGOJP3193 [HNOI2008]GT考试
\(f[i][j]\)表示当前摆放到第\(i\)位,然后当前的匹配长度为\(j\) \(f[i][j]=\sum {f[i][k]*g[k][j]}\) \(g[i][j]\)表示将长度为\(i\)的 ...
- 2019牛客暑期多校训练营(第九场)B:Quadratic equation (二次剩余求mod意义下二元一次方程)
题意:给定p=1e9+7,A,B. 求一对X,Y,满足(X+Y)%P=A; 且(X*Y)%P=B: 思路:即,X^2-BX+CΞ0; 那么X=[B+-sqrt(B^2-4C)]/2: 全部部分都要 ...
- MapTask工作机制
(1)Read阶段:MapTask通过用户编写的RecordReader,从输入InputSplit中解析出一个个key/value. (2)Map阶段:该节点主要是将解析出的key/value交给用 ...
- windows强制删除文件和文件夹
包括只读类型 Deletes one or more files. DEL [/P] [/F] [/S] [/Q] [/A[[:]attributes]] namesERASE [/P] [/F] [ ...
- scala 学习笔记--闭了个包
object Test01 { def main(args: Array[String]): Unit = { //普通函数 val squ=(x:Int) => x*x // ps:_的简写形 ...
- day39线程
复习: C/S架构: 客户端 服务器模式 B/S架构: 浏览器 服务器模式 B/S架构的客户端对PC机的性能要求比较低.统一了应用的接口 B/S架构隶属于C/S架构 TCP UDP的区 ...