原文作者:Liam Crilly of F5
原文链接:将 NGINX 部署为 API 网关,第 3 局部:公布 gRPC 服务
转载起源:NGINX 官方网站
本文是“将 NGINX 开源版和 NGINX Plus 部署为 API 网关”系列博文的第三篇。
- 第 1 局部具体阐明了 NGINX 开源版和 NGINX Plus 作为基于 HTTP 的 RESTful API 的 API 网关的一些用例。
- 第 2 局部对这些用例进行了扩大,探讨了一系列可用于爱护生产环境中后端 API 服务的安全措施。
- 本文解释了如何将 NGINX 开源版和 NGINX Plus 部署为 gRPC 服务的 API 网关。文章最后公布于 2018 年,随着 NGINX Plus Release 23 中引入了对原生 gRPC 健康检查协定的反对,特此更新,以不便大家充分利用 NGINX 开源版和 NGINX Plus。更新详情请参阅下文“施行健康检查”一节。
注:除非另有阐明,否则本文中的所有信息都实用于 NGINX Plus 和 NGINX 开源版。为了便于浏览,当探讨内容同时实用于两个版本时,下文将它们统称为“NGINX”。
近年来,介绍微服务利用架构的概念和劣势的文章十分多,其中以 NGINX 博文居首。微服务利用的外围是 HTTP API,本系列博文的前两篇文章应用了一个假如的 REST API 来阐明 NGINX 如何解决此类利用。
只管基于 JSON 音讯格局的 REST API 在古代利用中十分风行,但它并不是所有场景或所有企业的现实之选。最常见的挑战是:
- 文档规范 —— 如果没有良好的开发者制度或强制性的文档要求,最初很容易产生大量不足精确定义的 REST API。Open API 标准已成为 REST API 的通用接口描述语言,但其应用却不是强制性的,须要开发组织外部的无力治理。
- 事件和长连贯 —— REST API 以及它们应用 HTTP 传输,简直决定了所有 API 调用都是申请 – 响应模式。当客户端利用须要服务器反馈音讯时,应用 HTTP 长轮询和 WebSocket 等解决方案会有所帮忙,但应用此类解决方案最终都须要构建一个独自、相邻的 API。
- 简单事务 —— REST API 是围绕惟一资源的概念构建的,每个资源都由一个 URI 示意。当利用须要调用多个资源更新时,要么须要多个 API 调用(效率低下),要么必须在后端实现简单的事务(与 REST 的外围准则相悖)。
近年来,gRPC 已倒退成为构建分布式应用,尤其是微服务利用的代替办法。gRPC 最后由 Google 开发,并于 2015 年开源,现已成为云原生计算基金会的一个我的项目。值得注意的是,gRPC 应用 HTTP/2 作为传输机制,并利用其二进制数据格式和多路复用流性能。
gRPC 的次要劣势包含:
- 紧耦合的接口定义语言(协定缓冲区)
- 对流数据的原生反对(双向)
- 高效的二进制数据格式
- 主动生成多语言的代码,反对真正的多语言开发环境,且不会产生互操作性问题
定义 gRPC 网关
本系列博文的前两篇形容了如何通过单个入口点(例如 https://api.example.com)交付多个 API。当 NGINX 部署为 gRPC 网关时,gRPC 流量的默认行为和特色促使 NGINX 也要采纳这种办法。尽管 NGINX 能够在同一主机名和端口上共享 HTTP 和 gRPC 流量,但最好还是将它们离开,次要有以下起因有:
- REST 和 gRPC 利用的 API 客户端须要不同格局的谬误响应
- REST 和 gRPC 拜访日志的相干字段有所不同
- 因为 gRPC 不波及旧版 Web 浏览器,因而它能够施行更严格的 TLS 策略
为了实现这种拆散,咱们须要批改 gRPC 网关主配置文件 grpc_gateway.conf 的 server{}
模块,它位于 /etc/nginx/conf.d 目录。
log\_format grpc\_json escape=json '{"timestamp":"$time_iso8601",'
'"client":"$remote_addr","uri":"$uri","http-status":$status,''"grpc-status":$grpc\_status,"upstream":"$upstream\_addr"''"rx-bytes":$request\_length,"tx-bytes":$bytes\_sent}';
map $upstream\_trailer\_grpc\_status $grpc\_status {
default $upstream\_trailer\_grpc_status; # grpc-status is usually a trailer
'' $sent\_http\_grpc_status; # Else use the header, whatever its source
}
server {
listen 50051 http2; # In production, comment out to disable plaintext port
listen 443 http2 ssl;
server_name grpc.example.com;
access\_log /var/log/nginx/grpc\_log.json grpc_json;
# TLS config
ssl_certificate /etc/ssl/certs/grpc.example.com.crt;
ssl\_certificate\_key /etc/ssl/private/grpc.example.com.key;
ssl\_session\_cache shared:SSL:10m;
ssl\_session\_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_protocols TLSv1.2 TLSv1.3;
咱们首先定义 gRPC 流量拜访日志中的条目格局(第 1-4 行)。在本例中,咱们应用 JSON 格局从每个申请中捕捉最相干的数据。请留神,HTTP method 不包含在内,因为所有 gRPC 申请都应用 POST
。咱们还记录了 gRPC 状态代码和 HTTP 状态代码。然而,gRPC 状态代码可通过不同的形式生成。在失常状况下,grpc-status
从后端返回 HTTP/2 音讯头,但在一些谬误状况下,它可能会被后端或 NGINX 本人返回 HTTP/2 音讯头。为了简化拜访日志,咱们应用 map
块(第 6-9 行)来评估新变量 $grpc_status
并从产生该变量的中央获取 gRPC 状态。
此配置蕴含两个 监听
指令(第 12 行和第 13 行),所以咱们能够测试明文(端口 50051)和受 TLS 爱护的(端口 443)流量。http2
参数将 NGINX 配置为承受 HTTP/2 连贯 —— 请留神,这与 ssl
参数无关。另请留神,端口 50051 是 gRPC 的惯例明文端口,但不举荐在生产环境中应用。
TLS 配置是惯例配置,但 ssl_protocols
指令(第 23 行)除外,该指令将 TLS 1.2 指定为最弱的可承受协定。HTTP/2 标准要求应用 TLS 1.2(或更高版本),以保障所有客户端都反对对 TLS 的 SNI (Server Name Indication) 扩大。这意味着 gRPC 网关能够与其余 server{}
模块中定义的虚构服务器共享端口 443。
运行示例 gRPC 服务
为理解 NGINX 的 gRPC 性能,咱们应用了一个简略的测试环境,该环境代表了 gRPC 网关的要害组件,并部署了多个 gRPC 服务。咱们应用官网 gRPC 指南中的两个示例利用:helloworld(用 Go 编写)和 RouteGuide(用 Python 编写)。RouteGuide 利用特地有用,因为它蕴含了四种 gRPC 服务办法:
- 简略 RPC(繁多申请 – 响应)
- 响应流 RPC
- 申请流 RPC
- 双向流 RPC
所有 gRPC 服务都作为 Docker 容器装置在咱们的 NGINX 主机上。无关构建该测试环境的残缺阐明,请参阅附录。
NGINX 作为 gRPC 网关的测试环境
咱们配置 NGINX 以理解 RouteGuide 和 helloworld service,以及可用容器的地址。
upstream routeguide_service {
zone routeguide_service 64k;
server 127.0.0.1:10001;
server 127.0.0.1:10002;
server 127.0.0.1:10003;
}
upstream helloworld_service {
zone helloworld_service 64k;
server 127.0.0.1:20001;
server 127.0.0.1:20002;
}
咱们为每个 gRPC 服务增加一个 upstream
模块(第 40-45 和 47-51 行),并应用运行 gRPC 服务器代码的各个容器的地址填充它们。
路由 gRPC 申请
通过 NGINX 监听 gRPC 的惯例明文端口 (50051),咱们将路由信息增加到配置中,以便客户端申请可能达到正确的后端 service。但首先咱们须要理解 gRPC method 调用如何示意为 HTTP/2 申请。下图为 RouteGuide service 的 route_guide.proto 文件的缩略版,阐明了 package、service 和 RPC method 如何造成 URI,如 NGINX 所见。
协定缓冲区 RPC method 如何转换为 HTTP/2 申请
因而,HTTP/2 申请中携带的信息只需匹配包名(此处为 routeguide
或 helloworld
)即可用于路由。
# Routing
location /routeguide. {grpc_pass grpc://routeguide_service;}
location /helloworld. {grpc_pass grpc://helloworld_service;}
第一个 location
模块(第 26 行),不蕴含任何修饰符,定义了一个前缀匹配,以便 /routeguide.
匹配该包对应的 .proto 文件中定义的所有 service 和 RPC method。因而,grpc_pass
指令(第 27 行)将来自 RouteGuide 客户端的所有申请传递给上游 grouprouteguide_service。该配置(以及第 29 行和第 30 行的 helloworld 服务的并行配置)提供了 gRPC 包与其后端 service 之间的简略映射。
请留神,grpc_pass
指令的参数以 grpc://
形式申请,该申请形式应用明文 gRPC 连贯代理申请。如果后端配置了 TLS,咱们能够应用 grpcs://
通过端到端加密来爱护 gRPC 连贯。
运行 RouteGuide 客户端后,咱们能够通过查看日志文件来确认路由行为。此处,咱们看到 RouteChat RPC method 被路由到在端口 10002 上运行的容器。
$ python route_guide_client.py
...
$ tail -1 /var/log/nginx/grpc_log.json | jq
{
"timestamp": "2021-01-20T12:17:56+01:00",
"client": "127.0.0.1",
"uri": "/routeguide.RouteGuide/RouteChat",
"http-status": 200,
"grpc-status": 0,
"upstream": "127.0.0.1:10002",
"rx-bytes": 161,
"tx-bytes": 212
}
准确路由
如上所示,将多个 gRPC 服务简略、高效的路由到不同后端,只须要多数几行配置。然而,生产环境中的路由要求可能更加简单,须要基于 URI 中的其余元素(gRPC 服务甚至单个 RPC method)进行路由。
以下配置片段扩大了后面的示例,以便将双向流式 RPC methodRouteChat
路由到同一个后端,而将其余所有 RouteGuide
办法路由到不同的后端。
# Service-level routing
location /routeguide.RouteGuide/ {grpc_pass grpc://routeguide_service_default;}
# Method-level routing
location = /routeguide.RouteGuide/RouteChat {grpc_pass grpc://routeguide_service_streaming;}
第二个 location
指令(第 7 行)应用“=
”(等号)来示意这是 RouteChat
RPC method 的 URI 上的准确匹配。准确匹配在前缀匹配之前进行解决,这意味着 RouteChat
URI 不会思考其余 location
块。
响应谬误
gRPC 谬误与传统 HTTP 流量的谬误有些不同。客户端冀望谬误条件示意为 gRPC 响应,这使得当 NGINX 配置为 gRPC 网关时,默认的 NGINX 谬误页面集(HTML 格局)将不适宜应用。咱们的解决办法是为 gRPC 客户端指定一组自定义的谬误响应。
# Error responses
include conf.d/errors.grpc_conf; # gRPC-compliant error responses
default_type application/grpc; # Ensure gRPC for all error responses
残缺的 gRPC 谬误响应集是一个绝对较长且大部分是动态响应的配置,因而咱们将它们保留在一个独自的文件 errors.grpc_conf 中,并应用 include
指令(第 34 行)援用它们。与 HTTP/REST 客户端不同,gRPC 客户端利用不须要解决大量的 HTTP 状态代码。gRPC 文档指定了 NGINX 等两头代理必须如何将 HTTP 错误代码转换为 gRPC 状态代码,以便客户端始终可能接管到适合的响应。咱们应用 error_page
指令来执行这个映射。
# Standard HTTP-to-gRPC status code mappings
# Ref: https://github.com/grpc/grpc/blob/master/doc/http-grpc-status-mapping.md
#
error_page 400 = @grpc_internal;
error_page 401 = @grpc_unauthenticated;
error_page 403 = @grpc_permission_denied;
error_page 404 = @grpc_unimplemented;
error_page 429 = @grpc_unavailable;
error_page 502 = @grpc_unavailable;
error_page 503 = @grpc_unavailable;
error_page 504 = @grpc_unavailable;
每个规范 HTTP 状态代码都应用 @
前缀传递到指定 location,这样就能够生成合乎 gRPC 要求的响应。例如,HTTP 404 响应在外部被重定向到 @grpc_unimplemented
location,该 location 文件定义如下:
location @grpc_unimplemented {
add_header grpc-status 12;
add_header grpc-message unimplemented;
return 204;
}
@grpc_unimplemented
命名 location 仅可用于外部 NGINX 解决 —— 因为没有可路由的 URI,客户端无奈间接申请该 location。在 location 中,咱们填充强制性 gRPC 标头并应用 HTTP 状态代码 204
(No
Content
) 发送它们(不蕴含响应注释),从而结构 gRPC 响应。
咱们能够应用 curl(1)
命令模仿一个行为不端的 gRPC 客户端去申请一个不存在的 gRPC method。然而请留神,因为协定缓冲区应用二进制数据格式,curl
通常不适宜作为 gRPC 测试客户端。要在命令行上测试 gRPC,可思考应用 grpc_cli
。
$ curl -i --http2 -H "Content-Type: application/grpc" -H "TE: trailers" -X POST https://grpc.example.com/does.Not/Exist
HTTP/2 204
server: nginx/1.19.5
date: Wed, 20 Jan 2021 15:03:41 GMT
grpc-status: 12
grpc-message: unimplemented
下面援用的 grpc_errors.conf 文件还蕴含 NGINX 可能生成的其余谬误响应的 HTTP 到 gRPC 状态代码映射,例如超时和客户端证书谬误。
应用 gRPC 元数据验证客户端
gRPC 元数据容许客户端在 RPC method 调用的同时发送附加信息,而无需将这些数据作为协定缓冲区标准文件(.proto 文件)的一部分。元数据是一个简略的键值对(key-value)列表,每个键值对都作为独自的 HTTP/2 标头传输。因而,NGINX 拜访元数据非常容易。
在元数据的泛滥用例中,客户端身份验证对 gRPC API 网关来说是最常见的。以下配置片段显示了 NGINX Plus 如何应用 gRPC 元数据执行 JWT 身份验证(JWT 身份验证是 NGINX Plus 的独有性能)。在此示例中,JWT 在 auth-token
元数据中发送。
location /routeguide. {
auth_jwt realm=routeguide token=$http_auth_token;
auth_jwt_key_file my_idp.jwk;
grpc_pass grpc://routeguide_service;
}
对 NGINX Plus 来说,每个 HTTP 申请标头都可作为一个名为 $http__header_
的变量来应用。标头名称中的连字符 (-
) 转换为变量名称中的下划线 (_
),因而 JWT 可用作 $http_auth_token
(第 2 行)。
如果 API 密钥用于身份验证(可能是现有的 HTTP/REST API),那么这些密钥也能够在 gRPC 元数据中携带,并由 NGINX 验证。本博客系列的第 1 局部提供了 API 密钥身份验证的配置。
施行健康检查
当对多个后盾服务器进行负载平衡时,肯定要防止将申请发送到已敞开或不可用的后盾服务器。借助 NGINX Plus,咱们能够应用被动健康检查被动向后盾服务器发送带外申请,并在它们未按预期响应健康检查时将其从负载平衡轮换中移除。通过这种形式,咱们能够确保客户端申请永远不会被传输到进行服务的后盾服务器。
以下配置片段为 RouteGuide 和 helloworld gRPCservice 启用了被动健康检查;为了突出显示相干配置,该片段省略了一些指令,这些指令蕴含在后面几节中应用的 grpc_gateway.conf 文件中。
server {
listen 50051 http2; # Plaintext
# Routing
location /routeguide. {
grpc_pass grpc://routeguide_service;
health_check type=grpc grpc_status=12; # 12=unimplemented
}
location /helloworld. {
grpc_pass grpc://helloworld_service;
health_check type=grpc grpc_status=12; # 12=unimplemented
}
}
对于每个路由,咱们当初还指定 health_check
指令(第 17 和 21 行)。正如 type=grpc
参数所指定的,NGINX Plus 应用 gRPC 健康检查协定向上游 group 中的每个服务器发送健康检查。然而,咱们简略的 gRPC 服务没有实现 gRPC 健康检查协定,因而咱们心愿它们应用示意“unimplemented”(grpc_status=12
) 的状态代码进行响应。当它们应用这种状态代码进行响应时,就足以表明咱们正在与一个流动的 gRPC 服务进行通信。
有了这个配置,咱们能够敞开任何后端容器,且 gRPC 客户端不会呈现提早或超时。被动健康检查是 NGINX Plus 的独有性能;无关 gRPC 健康检查的更多信息,请浏览咱们的博客。
利用速率限度和其余 API 网关管制
grpc_gateway.conf 中的示例配置适宜生产环境应用,其中对 TLS 进行了一些小的批改。基于 package、service 或 RPC method 路由 gRPC 申请的能力表明现有的 NGINX 性能能够以 HTTP/REST API 或惯例 Web 流量完全相同的形式利用于 gRPC 流量。在每种状况下,相干的 location
模块都能够通过进一步的配置(例如速率限度或带宽管制)进行扩大。
总结
在对于将 NGINX 开源版和 NGINX Plus 部署为 API 网关系列博文的第三篇也是最初一篇博文中,咱们重点介绍了将 gRPC 作为构建微服务利用的云原生技术。咱们展现了 NGINX 如何可能像交付 HTTP/REST API 一样无效地交付 gRPC 利用,以及如何通过 NGINX 作为多用途 API 网关公布这两种 API。
无关本文应用的测试环境的阐明位于下面的附录中,您能够从咱们的 GitHub Gist 存储库中下载所有文件。
查看本系列博文的其余文章:
- 第 1 局部解释了如何在一些基于 HTTP 的根本的 API 网关用例中配置 NGINX。
- 第 2 局部探讨了爱护后端服务免受歹意或不良客户端攻打的更高级用例。
如欲试用作为 API 网关 的 NGINX Plus,请立刻下载 30 天收费试用版,或与咱们分割以探讨您的用例。在试用期间,您能够应用位于咱们的 GitHub Gist 存储库的残缺配置文件集。
附录:设置测试环境
以下阐明将测试环境装置在一个虚拟机上,不便隔离和重复使用。当然也如果有条件也能够装置在物理服务器上。
为了简化测试环境,咱们应用 Docker 容器来运行 gRPC 服务。这么做的的益处是咱们不须要在测试环境中应用多个主机,但依然能够像在生产环境中一样,让 NGINX 通过网络调用建设代理连贯。
Docker 还反对咱们在不同的端口上运行每个 gRPC 服务的多个实例,而无需批改代码。每个 gRPC 服务监听容器内的端口 50051,该端口映射到虚拟机上惟一的 localhost 端口。这反过来开释了端口 50051,NGINX 能够将其用作监听端口。因而,当测试客户端应用其预配置的端口 50051 连贯时,它们会连贯到 NGINX。
装置 NGINX 开源版或 NGINX Plus
- 依据 NGINX Plus 管理员指南中的阐明装置 NGINX 开源版或 NGINX Plus。
- 将以下文件从 GitHub Gist 存储库复制到 /etc/nginx/conf.d :
- grpc_gateway.conf
- errors.grpc_conf
留神:如果未应用 TLS,则正文掉 grpc_gateway.conf 中的 ssl_*
指令。
3. 启动 NGINX 开源版或 NGINX Plus。
$ sudo nginx
装置 Docker
对于 Debian 和 Ubuntu,运行:
$ sudo apt-get install docker.io
对于 CentOS、RHEL 和 Oracle Linux,运行:
$ sudo yum install docker
装置 RouteGuide 服务容器
1. 通过以下 Dockerfile 为 RouteGuide 容器构建 Docker 镜像。
# This Dockerfile runs the RouteGuide server from
# https://grpc.io/docs/tutorials/basic/python.html
FROM python
RUN pip install grpcio-tools
RUN git clone -b v1.14.x https://github.com/grpc/grpc
WORKDIR grpc/examples/python/route_guide
EXPOSE 50051
CMD ["python", "route_guide_server.py"]
您能够在构建之前将 Dockerfile 复制到本地子目录,也能够将 Dockerfile 的 Gist 的 URL 指定为 dockerbuild
命令的参数:
$ sudo docker build -t routeguide https://gist.githubusercontent.com/nginx-gists/87ed942d4ee9f7e7ebb2ccf757ed90be/raw/ce090f92f3bbcb5a94bbf8ded4d597cd47b43cbe/routeguide.Dockerfile
2. 确认镜像是通过运行 dockerimages
构建的。
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
routeguide latest 63058a1cf8ca 1 minute ago 1.31 GB
python latest 825141134528 9 days ago 923 MB
3. 启动 RouteGuide 容器。
$ sudo docker run --name rg1 -p 10001:50051 -d routeguide
$ sudo docker run --name rg2 -p 10002:50051 -d routeguide
$ sudo docker run --name rg3 -p 10003:50051 -d routeguide
4. 运行 docker ps
,查看三个容器是否都已启动。(为了便于浏览,咱们将示例输入拆分成了多行。)
$ sudo docker ps
CONTAINER ID IMAGE COMMAND STATUS ...
d0cdaaeddf0f routeguide "python route_g..." Up 2 seconds ...
c04996ca3469 routeguide "python route_g..." Up 9 seconds ...
2170ddb62898 routeguide "python route_g..." Up 1 minute ...
... PORTS NAMES
... 0.0.0.0:10003->50051/tcp rg3
... 0.0.0.0:10002->50051/tcp rg2
... 0.0.0.0:10001->50051/tcp rg1
输入中的 PORTS
列显示了每个容器如何将不同的本地端口映射到容器内的端口 50051。
装置 helloworld Service 容器
1. 通过以下 Dockerfile 为 helloworld 容器构建 Docker 镜像。
# This Dockerfile runs the helloworld server from
# https://grpc.io/docs/quickstart/go.html
FROM golang
RUN go get -u google.golang.org/grpc
WORKDIR $GOPATH/src/google.golang.org/grpc/examples/helloworld
EXPOSE 50051
CMD ["go", "run", "greeter_server/main.go"]
您能够在构建之前将 Dockerfile 复制到本地子目录,也能够将 Dockerfile 的 Gist 的 URL 指定为 dockerbuild
命令的参数:
$ sudo docker build -t helloworld https://gist.githubusercontent.com/nginx-gists/87ed942d4ee9f7e7ebb2ccf757ed90be/raw/ce090f92f3bbcb5a94bbf8ded4d597cd47b43cbe/helloworld.Dockerfil 下载和构建镜像可能须要几分钟工夫。呈现音讯 Successfully built 和一个十六进制字符串(image ID)即示意构建实现。
下载和构建镜像可能须要几分钟工夫。呈现音讯 Successfullybuilt
和一个十六进制字符串(image ID)即示意构建实现。
2. 确认镜像是通过运行 dockerimages
构建的。
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
helloworld latest e5832dc0884a 10 seconds ago 926MB
routeguide latest 170761fa3f03 4 minutes ago 1.31GB
python latest 825141134528 9 days ago 923MB
golang latest d0e7a411e3da 3 weeks ago 794MB
3. 启动 helloworld 容器。
$ sudo docker run --name hw1 -p 20001:50051 -d helloworld
$ sudo docker run --name hw2 -p 20002:50051 -d helloworld
每个命令执行胜利时,都会呈现一个长的十六进制字符串,代表正在运行的容器。
4. 运行 dockerps
,查看两个 helloworld 容器是否都已启动。
$ sudo docker ps
CONTAINER ID IMAGE COMMAND STATUS ...
e0d204ae860a helloworld "go run greeter..." Up 5 seconds ...
66f21d89be78 helloworld "go run greeter..." Up 9 seconds ...
d0cdaaeddf0f routeguide "python route_g..." Up 4 minutes ...
c04996ca3469 routeguide "python route_g..." Up 4 minutes ...
2170ddb62898 routeguide "python route_g..." Up 5 minutes ...
... PORTS NAMES
... 0.0.0.0:20002->50051/tcp hw2
... 0.0.0.0:20001->50051/tcp hw1
... 0.0.0.0:10003->50051/tcp rg3
... 0.0.0.0:10002->50051/tcp rg2
... 0.0.0.0:10001->50051/tcp rg1
装置 gRPC 客户端利用
1. 装置编程语言的先决条件,其中一些可能已装置在测试环境中。
- 对于 Ubuntu 和 Debian,运行:
$ sudo apt-get install golang-go python3 python-pip git
- 对于 CentOS、RHEL 和 Oracle Linux,运行:
$ sudo yum install golang python python-pip git
请留神,python-pip
须要启用 EPEL 存储库(依据须要先运行 sudoyuminstallepel-release
)。
2. 下载 helloworld 利用:
$ go get google.golang.org/grpc
3. 下载 RouteGuide 利用:
$ git clone -b v1.14.1 https://github.com/grpc/grpc
$ pip install grpcio-tools
测试设置
1. 运行 helloworld 客户端:
$ go run go/src/google.golang.org/grpc/examples/helloworld/greeter_client/main.go
2. 运行 RouteGuide 客户端:
$ cd grpc/examples/python/route_guide
$ python route_guide_client.py
3. 查看 NGINX 日志,确认测试环境可失常运行:
$ tail /var/log/nginx/grpc_log.json
更多资源
想要更及时全面地获取 NGINX 相干的技术干货、互动问答、系列课程、流动资源?
请返回 NGINX 开源社区:
- 官网:https://www.nginx.org.cn/
- 微信公众号:https://mp.weixin.qq.com/s/XVE5yvDbmJtpV2alsIFwJg
- 微信群:https://www.nginx.org.cn/static/pc/images/homePage/QR-code.png?v=1621313354
- B 站:https://space.bilibili.com/628384319