nginx-http2-grpc

NGINX 官方已发布1.13.10版本,其最主要更新功能点莫过于支持 gRPC 服务代理,即新增的模块ngx_http_grpc_module

这意味着可以很容易复用 Nginx 现有基础设施,简单几步即可构建出高可用的 gRPC 服务端集群,具体构建概要如下:

搭建 go-grpc 服务,参见 https://grpc.io/docs/quickstart/go.html

$ cd $GOPATH/src/google.golang.org/grpc/examples/helloworld

#启动服务端,默认端口 50051
$ go run greeter_server/main.go

#测试客户端
$ go run greeter_client/main.go

#交互成功可见输出结果
Greeting: Hello world

搭建 nginx-grpc 代理

nginx 构建支持 http2+grpc

$ wget http://nginx.org/download/nginx-1.13.10.tar.gz -O /tmp/nginx-1.13.10.tar.gz

$ cd /tmp && tar xzf nginx-1.13.10.tar.gz && cd nginx-1.13.10

$ ./configure --with-http_ssl_module --with-http_v2_module && make -j4 && make install && /usr/local/nginx/sbin/nginx -V

配置 nginx 支持 grpc 代理

#vhosts/grpc.conf 配置 demo 文件
upstream grpc.server{
server 127.0.0.1:50051;
}

server {
listen 80 http2;
access_log grpc.access.log main;

location / {
grpc_pass grpc.server;
}
}

从上述简单的配置可看出,grpc 模块可以和 upstream 模块结合使用,这意味着可复用 upstream 模块高可用配置,
当然,grpc 模块也提供类似配置,如grpc_next_upstream等。

验证 nginx-grpc 代理

启动 nginx 代理服务

$ sudo /usr/local/nginx/sbin/nginx -t && sudo /usr/local/nginx/sbin/nginx

grpc 服务测验

$ cd $GOPATH/src/google.golang.org/grpc/examples/helloworld

#!注意修改客户端连接服务端口为 80
$ go run greeter_client/main.go

#交互成功可见输出结果
Greeting: Hello world
#nginx 访问日志可见输出
127.0.0.1 - - [23/Mar/2018:17:21:10 +0800] "POST /helloworld.Greeter/SayHello HTTP/2.0" 200 18 "-" "grpc-go/1.11.0-dev" "-"

总体可见,通过 nginx 可以很轻松的构建出高可用的 grpc 服务代理。