首页 > *nix技术, http&spdy, nginx > gRPC+Nginx试用

gRPC+Nginx试用

2020年8月23日 发表评论 阅读评论 260 次浏览

一,测试环境
$ 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

转载请保留地址:http://www.lenky.info/archives/2020/08/2981http://lenky.info/?p=2981


备注:如无特殊说明,文章内容均出自Lenky个人的真实理解而并非存心妄自揣测来故意愚人耳目。由于个人水平有限,虽力求内容正确无误,但仍然难免出错,请勿见怪,如果可以则请留言告之,并欢迎来讨论。另外值得说明的是,Lenky的部分文章以及部分内容参考借鉴了网络上各位网友的热心分享,特别是一些带有完全参考的文章,其后附带的链接内容也许更直接、更丰富,而我只是做了一下归纳&转述,在此也一并表示感谢。关于本站的所有技术文章,欢迎转载,但请遵从CC创作共享协议,而一些私人性质较强的心情随笔,建议不要转载。

法律:根据最新颁布的《信息网络传播权保护条例》,如果您认为本文章的任何内容侵犯了您的权利,请以Email或书面等方式告知,本站将及时删除相关内容或链接。

  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.