如何配置端点和 esp 以发布具有启用的 ServerReflection 功能的 gRPC
How to configure endpoints and esp to publish gRPC with enabled ServerReflection feature
我创建了一个简单的 gRPC API 服务,并使用 GKE-ESP-endpoints 发布了它。有用。现在我想发布具有 ServerReflection
功能的服务。反射已添加到 gRPC 服务器中,当某些 grpc 客户端,例如 grpcurl
,直接向服务器发送 list
请求时,服务器 returns 正确的答案与可访问的 gRPC 列表服务:
$ grpcurl --plaintext localhost:8000 list
grservices.diagnostic
当相同的请求发送到负载均衡器的 public ip 时,答案是 Failed to list services: rpc error: code = NotFound desc = Method does not exist.
esp 日志:
"POST /grpc.reflection.v1alpha.ServerReflection/ServerReflectionInfo HTTP/2.0" 404 0 "-" "grpc-go/1.14.0-dev"
端点日志:
Endpoints management skipped for an unrecognized HTTP call: POST /grpc.reflection.v1alpha.ServerReflection/ServerReflectionInfo
对我来说,原因似乎是因为 endpoints
不知道 grpc.reflection.v1alpha.ServerReflection
服务并且不允许将请求路由到 gRPC 容器。我查看了我可以用谷歌搜索的所有示例,但没有看到启用 ServerReflection
和不启用 ServerReflection
.
的 gRPC api-config.yaml
文件之间的任何变化
我曾尝试更改 api_config.yaml
并将其应用于部署,但不幸的是没有成功,因为我应该有 {{grpc.reflection.[=44 的描述符 {{.pb}} 文件=]}}.
所以我的问题是如何配置端点和 esp 以提供 reflection
?
非常感谢任何想法和建议。
api_config.yaml:
type: google.api.Service
config_version: 3
#
# Name of the service configuration.
#
name: diagnostic.endpoints.[id-project].cloud.goog
#
# API title to appear in the user interface (Google Cloud Console).
#
title: diagnostic gRPC API
apis:
- name: grservices.diagnostic
# -name: grpc.reflection.v1alpha.ServerReflection
#
# API usage restrictions.
#
#usage:
# rules:
# # Diagnostic methods can be called without an API Key.
# - selector: grservices.diagnostic.GetDateTime
# allow_unregistered_calls: true
#
# - selector: grservices.diagnostic.GetTimeZones
# allow_unregistered_calls: true
#
## - selector: grpc.reflection.v1alpha.ServerReflection.ServerReflectionInfo
## allow_unregistered_calls: true
usage:
rules:
# Allow unregistered calls for all methods.
- selector: "*"
allow_unregistered_calls: true
浏览器期望 HTTP 响应包含有效的 CORS headers。但是后端是gRPC,无法处理CORS。
您可以找到您的解决方案Here
解决方法很简单。我刚刚下载 reflection.proto
并使用 reflection.proto
和我自己的 proto
服务文件编译了新的 .pb
文件:
wget https://raw.githubusercontent.com/grpc/grpc/master/src/proto/grpc/reflection/v1alpha/reflection.proto
python -m grpc.tools.protoc --include_imports --include_source_info --proto_path=. --proto_path="../googleapis" --python_out=. --grpc_python_out=. --descriptor_set_out=api_descriptor.pb reflection.proto diagnostic.proto
# delete _pb2.py files of reflection. The files are already presented in virtenv as the part of grpcio-reflection package
rm reflection_pb2.py
rm reflection_pb2_gprc.py
# upload the new config to endpoints
gcloud endpoints services deploy api_descriptor.pb api_config.yaml
测试:
$ grpcurl -insecure ${EXT_IP}:443 list
grservices.diagnostic
$ grpcurl -insecure ${EXT_IP}:443 list grservices.diagnostic
GetDateTime
GetTimeZones
grpcurl -insecure ${EXT_IP}:443 grservices.diagnostic.GetDateTime
{
"datetime": "2018-07-23 17:21:16"
}
$ grpcurl -insecure ${EXT_IP}:443 grservices.diagnostic/GetdateTime
$ grpcurl -d '{"time_zone": "Israel"}' -insecure ${EXT_IP}:443 grservices.diagnostic.GetDateTime
{
"datetime": "2018-07-23 20:25:41Z+0300"
}
api_config.yaml
文件的更改部分:
apis:
- name: grservices.diagnostic
- name: grpc.reflection.v1alpha.ServerReflection
我创建了一个简单的 gRPC API 服务,并使用 GKE-ESP-endpoints 发布了它。有用。现在我想发布具有 ServerReflection
功能的服务。反射已添加到 gRPC 服务器中,当某些 grpc 客户端,例如 grpcurl
,直接向服务器发送 list
请求时,服务器 returns 正确的答案与可访问的 gRPC 列表服务:
$ grpcurl --plaintext localhost:8000 list
grservices.diagnostic
当相同的请求发送到负载均衡器的 public ip 时,答案是 Failed to list services: rpc error: code = NotFound desc = Method does not exist.
esp 日志:
"POST /grpc.reflection.v1alpha.ServerReflection/ServerReflectionInfo HTTP/2.0" 404 0 "-" "grpc-go/1.14.0-dev"
端点日志:
Endpoints management skipped for an unrecognized HTTP call: POST /grpc.reflection.v1alpha.ServerReflection/ServerReflectionInfo
对我来说,原因似乎是因为 endpoints
不知道 grpc.reflection.v1alpha.ServerReflection
服务并且不允许将请求路由到 gRPC 容器。我查看了我可以用谷歌搜索的所有示例,但没有看到启用 ServerReflection
和不启用 ServerReflection
.
api-config.yaml
文件之间的任何变化
我曾尝试更改 api_config.yaml
并将其应用于部署,但不幸的是没有成功,因为我应该有 {{grpc.reflection.[=44 的描述符 {{.pb}} 文件=]}}.
所以我的问题是如何配置端点和 esp 以提供 reflection
?
非常感谢任何想法和建议。
api_config.yaml:
type: google.api.Service
config_version: 3
#
# Name of the service configuration.
#
name: diagnostic.endpoints.[id-project].cloud.goog
#
# API title to appear in the user interface (Google Cloud Console).
#
title: diagnostic gRPC API
apis:
- name: grservices.diagnostic
# -name: grpc.reflection.v1alpha.ServerReflection
#
# API usage restrictions.
#
#usage:
# rules:
# # Diagnostic methods can be called without an API Key.
# - selector: grservices.diagnostic.GetDateTime
# allow_unregistered_calls: true
#
# - selector: grservices.diagnostic.GetTimeZones
# allow_unregistered_calls: true
#
## - selector: grpc.reflection.v1alpha.ServerReflection.ServerReflectionInfo
## allow_unregistered_calls: true
usage:
rules:
# Allow unregistered calls for all methods.
- selector: "*"
allow_unregistered_calls: true
浏览器期望 HTTP 响应包含有效的 CORS headers。但是后端是gRPC,无法处理CORS。
您可以找到您的解决方案Here
解决方法很简单。我刚刚下载 reflection.proto
并使用 reflection.proto
和我自己的 proto
服务文件编译了新的 .pb
文件:
wget https://raw.githubusercontent.com/grpc/grpc/master/src/proto/grpc/reflection/v1alpha/reflection.proto
python -m grpc.tools.protoc --include_imports --include_source_info --proto_path=. --proto_path="../googleapis" --python_out=. --grpc_python_out=. --descriptor_set_out=api_descriptor.pb reflection.proto diagnostic.proto
# delete _pb2.py files of reflection. The files are already presented in virtenv as the part of grpcio-reflection package
rm reflection_pb2.py
rm reflection_pb2_gprc.py
# upload the new config to endpoints
gcloud endpoints services deploy api_descriptor.pb api_config.yaml
测试:
$ grpcurl -insecure ${EXT_IP}:443 list
grservices.diagnostic
$ grpcurl -insecure ${EXT_IP}:443 list grservices.diagnostic
GetDateTime
GetTimeZones
grpcurl -insecure ${EXT_IP}:443 grservices.diagnostic.GetDateTime
{
"datetime": "2018-07-23 17:21:16"
}
$ grpcurl -insecure ${EXT_IP}:443 grservices.diagnostic/GetdateTime
$ grpcurl -d '{"time_zone": "Israel"}' -insecure ${EXT_IP}:443 grservices.diagnostic.GetDateTime
{
"datetime": "2018-07-23 20:25:41Z+0300"
}
api_config.yaml
文件的更改部分:
apis:
- name: grservices.diagnostic
- name: grpc.reflection.v1alpha.ServerReflection