问题描述
grpcurl -vv \
-import-path ./protos/src \
-proto protobuf/grpc/my_api.proto \
-H 'Authorization:Bearer <token>' \
-d '{"data":"yes"}' usvc.dev.company.com:443 com.protobuf.grpc.package/DoSomething
我得到了预期的回复。
我已经建立了一个 Envoy grpc 反向桥接如下:
# envoy-grpc.yaml
admin:
address:
socket_address:
address: 0.0.0.0
port_value: 9901
static_resources:
listeners:
- name: listener_0
address:
socket_address:
address: 0.0.0.0
port_value: 8050
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.httpconnectionManager
access_log:
- name: envoy.access_loggers.stdout
typed_config:
"@type": type.googleapis.com/envoy.extensions.access_loggers.stream.v3.StdoutAccessLog
stat_prefix: ingress_http
route_config:
name: local_route
virtual_hosts:
- name: local_service
domains: ["*"]
routes:
- match:
prefix: "/DoSomething"
route:
host_rewrite_literal: usvc.dev.company.com
cluster: grpc
timeout: 25.00s
typed_per_filter_config:
envoy.filters.http.grpc_http1_reverse_bridge:
"@type": type.googleapis.com/envoy.extensions.filters.http.grpc_http1_reverse_bridge.v3.FilterConfigPerRoute
- match:
prefix: ""
route:
host_rewrite_literal: usvc.dev.company.com
cluster: grpc
timeout: 25.00s
http_filters:
- name: envoy.filters.http.grpc_http1_reverse_bridge
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.grpc_http1_reverse_bridge.v3.FilterConfig
content_type: application/grpc+proto
withhold_grpc_frames: true
- name: envoy.filters.http.router
clusters:
- name: other
type: LOGICAL_DNS
connect_timeout: 20.000s
dns_lookup_family: V4_ONLY
lb_policy: ROUND_ROBIN
load_assignment:
cluster_name: some_service
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: localhost
port_value: 4630
- name: grpc
type: STRICT_DNS
connect_timeout: 20.000s
lb_policy: ROUND_ROBIN
typed_extension_protocol_options:
envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
"@type": type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions
explicit_http_config:
http2_protocol_options: {}
load_assignment:
cluster_name: grpc
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: usvc.dev.company.com
port_value: 443
layered_runtime:
layers:
- name: disable_apple_dns
static_layer:
envoy.restart_features.use_apple_api_for_dns_lookups: false
如何通过 localhost:8050
处的此代理传递 grpc 请求?到目前为止,我尝试使用 curl 作为:
curl -v localhost:8050/com.protobuf.grpc.package/DoSomething -H 'Content-type: application/grpc+proto' -H 'Authorization:Bearer <token>' -d '{"data":"yes"}'
然后我看到如下回复:
< HTTP/1.1 200 OK
< content-type: application/grpc
< grpc-status: 2
< grpc-message: envoy reverse bridge: upstream responded with unsupported content-type application/grpc,status code 200
< date: Wed,07 Jul 2021 06:49:34 GMT
< server: envoy
< content-length: 0
<
* Connection #0 to host localhost left intact
* Closing connection 0
无论如何我可以通过 curl 将此请求转换为 grpc
请求吗? grpcurl
没有 --proxy
标志,所以我使用了 curl
。但看起来 usvc.dev.company.com
不想回应。 usvc.dev.company.com
确实接受 grpc 请求。
我的特使配置是否有问题,它没有正确翻译/发送请求?目的是通过此代理(特使)发送 gRPC 请求,该代理将其转换为 HTTP1.1 请求并将其转发到目标以进行响应。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)