gRPC 网桥

Envoy gRPC

gRPC 网桥沙盒是 Envoy gRPC 网桥过滤器 的一个示例用法。

该示例是用 Python 编写的基于 http 客户端的 CLI, 更新由 Go 编写的远程存储的键值存储示例,并且这两种语言都使用 stub 生成代码。

客户端通过代理发送消息,将 HTTP 请求从 http/1.1 升级到 http/2

[客户端](http/1.1) -> [客户端出口代理](http/2) -> [服务端入口代理](http/2) -> [服务端]

本示例中演示 Envoy 的另一个功能是 Envoy 能够通过路由的配置实现基于路由的授权。

运行沙盒

以下文档说明了上述对于 Envoy 容器编译环境进行设置的过程。

步骤 1:安装 Docker

确保你已安装较新版本的 dockerdocker-compose

一个最简单的方法来完成此事就是使用 Docker Desktop

步骤 2:克隆 Envoy 仓库

如果你还没有克隆 Envoy 仓库,用如下方式进行克隆:

git clone [email protected]:envoyproxy/envoy
git clone https://github.com/envoyproxy/envoy.git

步骤 3:生成协议 stub

protos 目录中提供了一个 docker-compose 文件,用于为 客户端服务端 生成 stub。

检查 docker-compose-protos.yaml 文件, 你将看到包含生成协议 stub 所需的 pythongo 的 gRPC protoc 命令。

生成 stub 的过程如下所示:

$ pwd
envoy/examples/grpc-bridge
$ docker-compose -f docker-compose-protos.yaml up
Starting grpc-bridge_stubs_python_1 ... done
Starting grpc-bridge_stubs_go_1     ... done
Attaching to grpc-bridge_stubs_go_1, grpc-bridge_stubs_python_1
grpc-bridge_stubs_go_1 exited with code 0
grpc-bridge_stubs_python_1 exited with code 0

你可以使用以下命令清理剩余的容器:

$ docker container prune

你可以在客户端和服务端各自的目录中查看生成的 kv 模块:

$ ls -la client/kv/kv_pb2.py
-rw-r--r--  1 mdesales  CORP\Domain Users  9527 Nov  6 21:59 client/kv/kv_pb2.py

$ ls -la server/kv/kv.pb.go
-rw-r--r--  1 mdesales  CORP\Domain Users  9994 Nov  6 21:59 server/kv/kv.pb.go

这些生成的 pythongo 的 stub 可以作为外部模块包含。

步骤 4:启动所有容器

构建沙盒示例并启动示例服务,运行以下命令:

$ pwd
envoy/examples/grpc-bridge
$ docker-compose pull
$ docker-compose up --build -d
$ docker-compose ps

               Name                             Command               State                         Ports
---------------------------------------------------------------------------------------------------------------------------------------
grpc-bridge_grpc-client-proxy_1        /docker-entrypoint.sh /bin ... Up      10000/tcp, 0.0.0.0:9911->9911/tcp, 0.0.0.0:9991->9991/tcp
grpc-bridge_grpc-client_1              /bin/sh -c tail -f /dev/null   Up
grpc-bridge_grpc-server-proxy_1        /docker-entrypoint.sh /bin ... Up      10000/tcp, 0.0.0.0:8811->8811/tcp, 0.0.0.0:8881->8881/tcp
grpc-bridge_grpc-server_1              /bin/sh -c /bin/server         Up      0.0.0.0:8081->8081/tcp

发送请求到键/值存储

使用 Python 服务发送 gRPC 请求:

$ pwd
envoy/examples/grpc-bridge

设置键:

$ docker-compose exec python /client/client.py set foo bar
setf foo to bar

获取键:

$ docker-compose exec python /client/client.py get foo
bar

修改存在的键:

$ docker-compose exec python /client/client.py set foo baz
setf foo to baz

获取修改后的键:

$ docker-compose exec python /client/client.py get foo
baz

在运行的 docker-compose 容器中,你应该看到 gRPC 服务打印的活动记录:

$ docker-compose logs grpc-server
grpc_1    | 2017/05/30 12:05:09 set: foo = bar
grpc_1    | 2017/05/30 12:05:12 get: foo
grpc_1    | 2017/05/30 12:05:18 set: foo = baz