如何解决Envoy 代理不会将来自浏览器的 http1 请求转换为 http2
我的前端在端口 3000 上运行(基于 react),而 java 后端在端口 50051 上运行。
由于 gRPC 使用 HTTP2 协议,我使用 Envoy 代理将来自 react(基本上是 HTTP1 的浏览器)的 http 请求转换为 HTTP2,以便 java 后端能够读取它们。
不幸的是,这并没有发生,Envoy 以某种方式没有进行翻译,我在 java 后端收到此错误:
io.grpc.netty.shaded.io.netty.handler.codec.http2.Http2Exception: 意外的 HTTP/1.x 请求:OPTIONS /greet.GreetingService/greet
现在正如错误中提到的,java后端抱怨接收HTTP1请求,这意味着代理没有完成它的工作。
这是我用于 Envoy 的配置文件:
static_resources:
listeners:
- name: listener_0
address:
socket_address: { address: 127.0.0.1,port_value: 3000 }
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
codec_type: auto
stat_prefix: ingress_http
route_config:
name: local_route
virtual_hosts:
- name: local_service
domains: ["*"]
routes:
- match: { prefix: "/" }
route:
cluster: greeter_service
max_stream_duration:
grpc_timeout_header_max: 0s
cors:
allow_origin_string_match:
- prefix: "*"
allow_methods: GET,PUT,DELETE,POST,OPTIONS
allow_headers: keep-alive,user-agent,cache-control,content-type,content-transfer-encoding,custom-header-1,x-accept-content-transfer-encoding,x-accept-response-streaming,x-user-agent,x-grpc-web,grpc-timeout
max_age: "1728000"
expose_headers: custom-header-1,grpc-status,grpc-message
http_filters:
- name: envoy.filters.http.grpc_web
- name: envoy.filters.http.cors
- name: envoy.filters.http.router
clusters:
- name: greeter_service
connect_timeout: 0.25s
type: logical_dns
http2_protocol_options: {}
lb_policy: round_robin
load_assignment:
cluster_name: cluster_0
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: 127.0.0.1
port_value: 50051
正如您在配置文件中看到的那样,我正在使代理侦听端口 3000(因为前端正在其上运行)并在转换后将它们发送到端口 50051(Java 后端正在运行的位置) . 我正在通过 docker-compose 运行代理:
version: '3'
services:
envoy:
image: envoyproxy/envoy-dev:b145180d17cac80aa5f9a7801429d52017fea6d1
volumes:
- ./envoy.yaml:/etc/envoy/envoy.yaml
我通过 Intellij IDEA 运行 java 后端,我通过 npm start
运行前端。
每当我从前端发出请求时,我都看不到 envoy 容器中的任何日志,我觉得这些请求没有被代理拦截。
所以我想知道是不是因为我没有像我为代理所做的那样在 docker 容器中运行前端和后端?虽然不确定!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。