OpenResty Edge gRPC 代理:分布式反向代理与负载均衡,网关侧 TLS 终止
要在 OpenResty Edge 中搭建 gRPC 反向代理,先在应用上启用 HTTP/2,创建一个指向 gRPC 后端的上游,再添加一条打开 gRPC 代理开关的页面规则。网关会把 gRPC 调用代理到上游,为仅支持明文的源站在网关侧终止 TLS,并将每次改动同步到所有网关服务器,无需重载或重启。下面我们完整搭建一遍,并用 grpcurl 验证。
准备 gRPC 样本服务器并用 grpcurl 测试
我们准备了一个 gRPC 样本服务器。该服务器的 IP 地址以 .166 结尾。监听的端口是 8080。
这个是样本 gRPC 服务的 protobuf 定义文件。
cat hello_world.proto
这个服务根据 name 参数返回一个欢迎信息。
我们可以使用 grpcurl 命令行工具来检查这个服务的输出。这个工具可以发送 gRPC 请求,然后以 JSON 格式显示收到的响应。由于我们的 gRPC 服务器不支持 TLS 加密,这里要使用 “-plaintext” 选项。
将 “world” 作为 name 参数的值。输入上面提到的 gRPC 服务器的地址。最后,输入 gRPC 服务的名称。
发送请求。不出所料,返回了 “hello world”。
在 OpenResty Edge 中将 gRPC 服务器添加为上游
接下来,我们将使用 OpenResty Edge 后面的这个 gRPC 服务器作为上游。
像往常一样,让我们进入 OpenResty Edge 的 Admin Web 控制台。这就是我们控制台的样本部署。每个用户都有自己的本地部署。
我们可以继续使用之前的示例应用,test-edge.com。
进入该应用。
为 gRPC 启用 HTTP/2
gRPC 使用 HTTP/2 进行传输。HTTP/2 在 OpenResty Edge 中是默认启用的。
这里我将展示如何在 Edge 的应用程序设置中启用 HTTP/2。
选择 “Enabled” 选项。
保存我们的改动。
然后我们去 SSL 页面,确保 SSL 证书已经配置妥当。
可以看到我们在以前的教程中配置的证书。
创建 gRPC 上游
跳转到 “Upstreams” 页面。
为我们的后端服务器创建一个新的上游。
我们给这个上游起个名字,“grpc backend”。
如果 gRPC 后端服务器启用了 TLS 加密功能,我们可以在这里选择 HTTPS。
在 gRPC 后端服务器的主机字段中填入前面提到的 IP 地址。
填写端口号:8080。
单击保存这个上游。
我们可以看到这个新的 “grpc backend” 上游已经成功被创建。
在页面规则中启用 gRPC 代理
现在让我们创建一个新的页面规则来实际使用这个上游。
创建一个新的页面规则。
添加一个匹配 URI 前缀的规则条件。
输入这些由 “grpcurl” 使用的请求 URI 前缀。
在这里添加一个代理。
打开这个开关,启用 gRPC 代理。
选择我们刚刚创建的 gRPC 上游。
将这个页面规则插入到现存的其他规则之前。
保存这条页面规则。
可以看到刚加的规则已经出现在页面规则列表里。
像往常一样,需要发布一个新的版本来推送我们刚才的改动。
点击这个按钮。
发布!
新版本现在已经同步到所有的网关服务器上了。
现在,新的页面规则已经被推送到所有的网关集群和服务器。
这些配置的变化不需要服务器重载、重启或二进制升级。所以它是非常高效和可扩展的。
通过网关用 grpcurl 测试 gRPC 代理
现在我们通过网关测试 gRPC 服务。
仍然使用 grpcurl 工具来访问 gRPC 服务。
使用域名 test-edge.com 和端口 443。这将命中 OpenResty Edge 网关。这次我们没有指定 plaintext 选项,因为 Edge 网关支持 TLS 加密。
发送请求。
不出所料,返回了 “hello world” 这个消息。
可以看到,gRPC 服务现在完全支持 TLS 加密来访问,尽管源服务器不支持。换句话说,OpenResty Edge 在网关侧终止 TLS,同时在内部网络里以明文与 gRPC 源站通信——你在公网侧得到加密的 gRPC,而后端完全不用改动。OpenResty Edge 也能以同样的方式代理其他协议;要按域名转发裸 TLS/TCP 流量,请参见在 OpenResty Edge 中配置 SNI 代理。
常见问题
如何在 OpenResty Edge 中搭建 gRPC 反向代理?
在应用上启用 HTTP/2,创建一个指向 gRPC 后端(主机与端口)的上游,再添加一条页面规则,匹配 gRPC 的请求 URI 前缀并打开"启用 gRPC 代理"开关指向该上游。发布一次版本后,网关就会把 gRPC 调用代理并转发到后端。
做 gRPC 代理必须启用 HTTP/2 吗?
需要。gRPC 使用 HTTP/2 进行传输,所以必须开启 HTTP/2 代理才能工作。在 OpenResty Edge 中它通常默认启用,你可以在创建 gRPC 页面规则前,在应用设置里确认或切换。
OpenResty Edge 能为明文的 gRPC 后端终止 TLS 吗?
可以。本教程里源站 gRPC 服务器没有 SSL/TLS,但客户端仍然通过域名 test-edge.com 端口 443 以完整 TLS 访问服务。网关在公网侧终止 TLS,再以明文转发到源站,因此后端无需处理证书。
如何测试 gRPC 代理?
使用 grpcurl。先以明文直接请求源站,确认后端可用;再向网关的 443 端口发送同样的请求(去掉 plaintext 选项),确认经 TLS 的代理链路。两者应返回相同结果——这里是 “hello world”。
修改 gRPC 代理配置需要重载或重启服务器吗?
不需要。发布一次版本就会把新的页面规则同步到所有网关集群和服务器,无需重载、重启或二进制升级,因此改动下发快、可在大规模集群上扩展。
关于 OpenResty Edge
OpenResty Edge 是一款专为微服务和分布式流量架构设计的全能型网关软件,由我们自主研发。它集流量管理、私有 CDN 构建、API 网关、安全防护等功能于一体,帮助您轻松构建、管理和保护现代应用程序。OpenResty Edge 拥有业界领先的性能和可扩展性,能够满足高并发、高负载场景下的苛刻需求。它支持调度 K8s 等容器应用流量,并可管理海量域名,轻松满足大型网站和复杂应用的需求。
如果你喜欢这个教程,请订阅这个博客网站和我们的 YouTube 频道 或 B 站频道。谢谢!
关于作者
章亦春是开源 OpenResty® 项目创始人兼 OpenResty Inc. 公司 CEO 和创始人。
章亦春(Github ID: agentzh),生于中国江苏,现定居美国湾区。他是中国早期开源技术和文化的倡导者和领军人物,曾供职于多家国际知名的高科技企业,如 Cloudflare、雅虎、阿里巴巴, 是 “边缘计算“、”动态追踪 “和 “机器编程 “的先驱,拥有超过 22 年的编程及 16 年的开源经验。作为拥有超过 4000 万全球域名用户的开源项目的领导者。他基于其 OpenResty® 开源项目打造的高科技企业 OpenResty Inc. 位于美国硅谷中心。其主打的两个产品 OpenResty XRay(利用动态追踪技术的非侵入式的故障剖析和排除工具)和 OpenResty Edge(最适合微服务和分布式流量的全能型网关软件),广受全球众多上市及大型企业青睐。在 OpenResty 以外,章亦春为多个开源项目贡献了累计超过百万行代码,其中包括,Linux 内核、Nginx、LuaJIT、GDB、SystemTap、LLVM、Perl 等,并编写过 60 多个开源软件库。
关注我们
如果您喜欢本文,欢迎关注我们 OpenResty Inc. 公司的博客网站 。也欢迎扫码关注我们的微信公众号:
翻译
我们提供了英文版原文和中译版(本文) 。我们也欢迎读者提供其他语言的翻译版本,只要是全文翻译不带省略,我们都将会考虑采用,非常感谢!































































