聚合国内IT技术精华文章,分享IT技术精华,帮助IT从业人士成长

gRPC+Nginx试用

2020-09-09 18:20 浏览: 401 次 我要评论(0 条) 字号:

一,测试环境
$ cat /etc/issue
Ubuntu 18.04.3 LTS n l
$ uname -a
Linux lenky-virtual-machine 5.0.0-27-generic #28~18.04.1-Ubuntu SMP Thu Aug 22 03:00:32 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

二,安装Go环境
见这里:http://lenky.info/?p=2826

三,安装gRPC
1,先打开模块支持和开启中国代理(否则访问不了啊)。
$ export GO111MODULE=on
$ go env -w GOPROXY=https://goproxy.cn,direct
$ go env

2,执行如下命令进行安装
$ pwd
/home/lenky
$ go get -u google.golang.org/grpc
go: downloading google.golang.org/grpc v1.31.1
go: google.golang.org/grpc upgrade => v1.31.1
go: downloading github.com/golang/protobuf v1.3.3
go: downloading golang.org/x/net v0.0.0-20190311183353-d8887717615a
go: downloading golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a
go: downloading google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55
go: downloading golang.org/x/text v0.3.0

如果出现错误:stream error: stream ID 149; INTERNAL_ERROR
就多执行几次go get …

3,安装完了之后,在$GOPATH目录下就可以查看到gRPC源码
$ cd $GOPATH
$ find . -name “grpc@*”
./pkg/mod/google.golang.org/grpc@v1.20.1
./pkg/mod/google.golang.org/grpc@v1.31.1
./pkg/mod/google.golang.org/grpc@v1.29.1

版本v1.31.1是新安装的,v1.20.1和v1.29.1,应该是之前安装其他开源时带下来的。
$ ls -l
total 48
dr-x—— 29 lenky lenky 4096 4月 25 19:09 grpc@v1.20.1
dr-x—— 34 lenky lenky 4096 4月 25 19:09 grpc@v1.29.1
dr-x—— 32 lenky lenky 4096 9月 8 20:07 grpc@v1.31.1

$ date
2020年 09月 08日 星期二 20:12:21 CST

四,测试
$ cd && pwd
/home/lenky
$ git clone -b v1.31.0 https://github.com/grpc/grpc-go
$ cd grpc-go/
$ git checkout -b master origin/master
$ cd examples/helloworld/
$ go run greeter_server/main.go

另外开一个窗口,执行:
$ cd grpc-go/examples/helloworld/
$ go run greeter_client/main.go
2020/09/08 20:49:44 Greeting: Hello world

以上运行会下载grpc@v1.30.0,因为这个examples当前依赖这个版本:
~/grpc-go/examples$ cat go.mod
module google.golang.org/grpc/examples

go 1.11

require (
github.com/golang/mock v1.1.1
github.com/golang/protobuf v1.4.2
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be
google.golang.org/genproto v0.0.0-20200624020401-64a14ca9d1ad
google.golang.org/grpc v1.30.0
)

服务端输出:
$ go run greeter_server/main.go
2020/09/08 20:49:44 Received: world

五,安装Nginx
1,编译安装
$ cd
$ mkdir nginx-grpc
$ cd nginx-grpc/
$ ls
nginx-1.17.9.tar.gz
$ tar xf nginx-1.17.9.tar.gz
$ cd nginx-1.17.9/
$ sudo mkdir /opt/nginx-grpc
$ ./configure –prefix=/opt/nginx-grpc –with-http_stub_status_module –with-http_ssl_module –with-http_v2_module –with-http_gzip_static_module –with-http_sub_module
$ sudo make
$ sudo make install

2,运行
$ sudo vi /opt/nginx-grpc/conf/nginx.conf.test
在http下增加如下:

server {
listen 8888 http2;
access_log /opt/nginx-grpc/logs/access.log;
location / {
grpc_pass grpc://127.0.0.1:50051;
}
}
$ sudo /opt/nginx-grpc/sbin/nginx -c /opt/nginx-grpc/conf/nginx.conf.test

上面50051端口是~/grpc-go/examples/helloworld/greeter_server/main.go代码里的服务端口。

六,测试验证
修改~/grpc-go/examples/helloworld/greeter_client/main.go里的50051端口为8888,重新运行server和client,获得正确输出。

查看Nginx的access日志,如下:
$ cat /opt/nginx-grpc/logs/access.log
127.0.0.1 – – [09/Sep/2020:11:14:01 +0800] “POST /helloworld.Greeter/SayHello HTTP/2.0″ 200 18 “-” “grpc-go/1.30.0″

七,附:配置Nginx支持Web http2.0
1,准备证书(Web http2.0强制使用https加密链接)
$ cd /opt/nginx-grpc/conf/
$ sudo openssl genrsa -des3 -out server.key 1024
$ sudo openssl req -new -key server.key -out server.csr
$ sudo cp server.key server.key.org
$ sudo openssl rsa -in server.key.org -out server.key
$ sudo openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
验证而已,所以密码都是123456,其他信息随便填。

2,配置Nginx
只修改如下配置,其他不变:
server {
listen 443 ssl http2;
server_name localhost;

ssl_certificate server.crt;
ssl_certificate_key server.key;

$ sudo sbin/nginx -s reload

重启后,谷歌浏览器访问主机地址,比如:

https://192.168.118.128/

鼠标右键->检查->Network,右键点击表头,勾选Protocol,可以看到访问协议为h2。

Over~

参考:
1,https://github.com/grpc/grpc-go
2,https://grpc.io/docs/languages/go/quickstart/
3,通过Nginx实现gRPC服务的负载均衡 | gRPC双向数据流的交互控制系列(3)

https://www.jianshu.com/p/611d586f58cd



网友评论已有0条评论, 我也要评论

发表评论

*

* (保密)

Ctrl+Enter 快捷回复