grpc+nginx架构部署指导

本文介绍使用nginx管理grpc流量、部署grpc+nginx架构的方法。

1. 环境信息

本节介绍本文示例使用的环境信息,如下:

 

软件名称 版本信息
操作系统 CentOS Linux release 7.2
gRPC 1.10.1-pre1
protobuf 3.5.0
NGINX 1.13.10

说明:
1) 根据nginx官网信息,nginx从1.13.10开始原生支持gRPC,所以必须使用1.13.10以上的版本进行NGINX+gRPC框架的部署;

2) 本文介绍的gRPC搭建示例是针对C++语言的。

2. 安装gRPC和protobuf

2.1 安装开发编译工具包

1. 首先执行下面的命令安装开发编译工具包:

yum groupinstall "Development Tools"

2. 安装完成后,通过rpm命令查看“autoconf”、“libtool”、“pkgconfig”软件包是否安装成功了:

 
[root@pay0 ~]# rpm -qa|grep autoconf
autoconf-2.69-11.el7.noarch
[root@pay0 ~]# rpm -qa|grep libtool
libtool-2.4.2-22.el7_3.x86_64
[root@pay0 ~]# rpm -qa|grep pkgconfig
pkgconfig-0.27.1-4.el7.x86_64
[root@pay0 ~]#

需要确保上述软件包已经安装成功了。

2.2 编译安装gRPC

1. 使用git工具下载gRPC代码:

[root@pay0 yaowang]# pwd
/opt/yaowang
[root@pay0 yaowang]# git clone -b $(curl -L https://grpc.io/release) https://github.com/grpc/grpc

2. 进入下载下来的grpc代码目录下,更新grpc需要的第三方插件:

[root@pay0 yaowang]# cd grpc
[root@pay0 grpc]# pwd
/opt/yaowang/grpc
[root@pay0 grpc]# git submodule update --init

3. 编译gRPC:

[root@pay0 grpc]# make

4. 安装gRPC:

[root@pay0 grpc]# make install

5. 查看gRPC是否安装成功:

[root@pay0 ~]# whereis grpc_cpp_plugin
grpc_cpp_plugin: /usr/local/bin/grpc_cpp_plugin
[root@pay0 ~]#

如果能够查询到系统中已经安装了grpc的相关插件,说明grpc安装成功了。

2.3 编译安装protobuf

正常情况下,在安装gRPC的过程中,会自动安装protobuf。protobuf在gRPC的“third_party”目录下:

[root@pay0 protobuf]# pwd
/opt/yaowang/grpc/third_party/protobuf
[root@pay0 protobuf]#

可以通过如下命令查询protobuf是否安装成功了:

[root@pay0 protobuf]# protoc --version
libprotoc 3.5.0
[root@pay0 protobuf]#

如果能够查询到protocbuf的版本号,则说明protobuf安装成功了。
如果protobuf没有安装,那么需要执行以下操作进行安装:

[root@pay0 grpc]# cd third_party/protobuf/
[root@pay0 protobuf]# pwd
/opt/yaowang/grpc/third_party/protobuf
[root@pay0 protobuf]# make
[root@pay0 protobuf]# make install

执行上述安装操作后,可以再次查询protobuf是否安装成功。

3. 构建gRPC示例

3.1 编译生成gRPC的示例程序

在gRPC和protobuf安装正常的情况下,进入到”example”目录中,编译生成gRPC的示例客户端和服务端,命令如下:

[root@pay0 grpc]# cd examples/cpp/helloworld/
[root@pay0 helloworld]# make

正常情况下,运行上述make命令后,会在”helloworld”目录下生成gRPC的示例程序服务端(greeter_server)及客户端(greeter_client)。
说明:如果此处make出现如下错误:

[root@pay0 helloworld]# make
g++ -std=c++11 `pkg-config --cflags protobuf grpc`  -c -o helloworld.grpc.pb.o helloworld.grpc.pb.cc
Package grpc was not found in the pkg-config search path.
Perhaps you should add the directory containing `grpc.pc'
to the PKG_CONFIG_PATH environment variable
No package 'grpc' found

出现上述错误,说明grpc没有添加到pkg-config的搜索路径中,需要先找到”grpc.pc”文件,然后将该文件拷贝到pkg-config的搜索路径下即可,如下:

[root@pay0 grpc]# cp ./libs/opt/pkgconfig/grpc.pc /usr/lib64/pkgconfig/

3.2 运行示例程序

1. 打开一个终端,运行服务端程序:

[root@pay0 helloworld]# ./greeter_server 
Server listening on 0.0.0.0:50051

2. 打开另外一个终端,运行客户端程序:

[root@pay0 helloworld]# ./greeter_client 
Greeter received: Hello world
[root@pay0 helloworld]#

如果在客户端终端中显示上述信息“Greeter received: Hello world”,则说明gRPC的客户端-服务端架构搭建成功了。
注意:如果在运行greeter_server或greeter_client过程中,提示如下错误:

[root@pay0 helloworld]# ./greeter_server 
./greeter_server: error while loading shared libraries: libgrpc++.so.1: cannot open shared object file: No such file or directory
[root@pay0 helloworld]#

这个错误是因为应用程序(greeter_server)找不到需要的共享库(libgrpc++.so.1),需要先找到错误提示中的共享库,然后将该共享库的路径添加到共享库环境变量中即可,例如:

[root@pay0 helloworld]# export LD_LIBRARY_PATH=/opt/yaowang/grpc/libs/opt/

4. 安装NGINX

通过下面步骤安装nginx:
1. 从nginx官网上获取版本号不低于1.13.10的源码包,本文使用的版本为1.13.10。
2. 将nginx源码包拷贝到OS中,并进行解压,得到nginx的源码;
3. 进入nginx源码目录中,执行如下的configure命令:

[root@pay0 nginx-1.13.10]# ./configure --with-http_ssl_module --with-http_v2_module

注意:http_ssl和http_v2模块是nginx支持gRPC必需的。
4. 编译并安装nginx:

[root@pay0 nginx-1.13.10]# make
[root@pay0 nginx-1.13.10]# make install

默认情况下,nginx会安装到/usr/local/nginx/目录。
5. 运行以下命令,检查nginx是否成功安装了:

[root@pay0 nginx]# pwd
/usr/local/nginx
[root@pay0 nginx]# ./sbin/nginx -v
nginx version: nginx/1.13.10
[root@pay0 nginx]#

上述结果显示nginx安装成功,安装的nginx版本号为1.13.10。

5. 构建NGINX示例

在nginx安装正常的情况下,执行以下操作构建nginx示例:
1. 进入到nginx的安装目录下,检查nginx配置文件是否正确:

[root@pay0 nginx]# ./sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@pay0 nginx]#

2. 如果配置文件检查正常,运行nginx程序:

[root@pay0 nginx]# ./sbin/nginx

3. 检查nginx运行状态及端口占用情况:

[root@pay0 nginx]# ps -ef|grep nginx
root     27242     1  0 16:33 ?        00:00:00 nginx: master process ./sbin/nginx
nobody   27243 27242  0 16:33 ?        00:00:00 nginx: worker process
root     27251 20758  0 16:34 pts/6    00:00:00 grep --color=auto nginx
[root@pay0 nginx]# 
[root@pay0 nginx]# netstat -anpo|grep 80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      27242/nginx: master  off (0.00/0/0)

从上述结果能够看出,nginx运行状态正常,并且其监听的端口号为80(默认配置)。
4. 在远端机器上打开一个web网页,输入nginx服务的IP和端口号,测试nginx是否能够正常提供web服务。正常情况下,远端机器会显示如下的web页面:

grpc+nginx架构部署指导_第1张图片

如果出现上图,说明NGINX的示例构建成功。

6. 搭建NGINX+gRPC框架

1. 修改nginx的配置文件(本文中为/usr/local/nginx/conf/nginx.conf),使nginx能够监听gRPC发送的请求消息,并将该消息转发到gRPC的服务端上。相关的配置如下:

grpc+nginx架构部署指导_第2张图片

2. 重新编译gRPC的客户端greeter_client,使其通信地址指向nginx的IP和端口(上一步的配置);
3. 运行greeter_client,能够看到终端会显示如下信息:

[root@pay0 helloworld]# ./greeter_client 
Greeter received: Hello world
[root@pay0 helloworld]#

这说明gRPC的客户端与服务端通信正常。
4. 再观察nginx的日志,能够看到如下信息:

[root@pay0 logs]# tail -f host.access.log 

127.0.0.1 - - [30/Mar/2018:16:58:50 +0800] "POST /helloworld.Greeter/SayHello HTTP/2.0" 200 18 "-" "grpc-c++/1.10.1-pre1 grpc-c/6.0.0-pre1 (linux; chttp2; glamorous)" "-"

上述日志信息说明,nginx获取并转发了来自gRPC的消息,即实现了通过nginx管理gRPC服务的目的。
到此,一个最简单的NGINX+gRPC的架构就搭建完成了。

你可能感兴趣的:(GRPC,NGINX,RPC,NGINX)