JsonToGrpc GatewayFilter 工厂
JsonToGrpc GatewayFilter 工厂用于将 JSON 负载(Payload)转换为 gRPC 请求。
该过滤器接受以下参数:
service: 处理请求的服务的短名称。method: 服务中处理请求的方法名称。protoDescriptor: Proto 描述符文件。
你可以使用 protoc 命令并指定 --descriptor_set_out 标志来生成此描述符文件:
bash
protoc --proto_path=src/main/resources/proto/ \
--descriptor_set_out=src/main/resources/proto/hello.pb \
src/main/resources/proto/hello.proto注意
目前不支持流式传输 (streaming)。
配置示例
以下是使用 Java 和 YAML 进行配置的示例:
Java 配置
java
@Bean
public RouteLocator routes(RouteLocatorBuilder builder) {
return builder.routes()
.route("json-grpc", r -> r.path("/json/hello").filters(f -> {
String service = "HelloService";
String method = "hello";
String protoDescriptor = "file:src/main/proto/hello.pb";
return f.jsonToGRPC(service, method, protoDescriptor);
}).uri(uri))
// ...
}YAML 配置 (application.yml)
yaml
spring:
cloud:
gateway:
routes:
- id: json-grpc
uri: https://localhost:6565
predicates:
- Path=/json/**
filters:
- name: JsonToGrpc
args:
service: HelloService
method: hello
protoDescriptor: file:proto/hello.pb工作流程: 当通过网关向 /json/hello 发起请求时:
- 网关会根据
hello.proto中提供的定义转换请求。 - 转换后的请求被发送到
HelloService/hello。 - 返回的 gRPC 响应会被转换回 JSON 格式发给客户端。
SSL 配置: 默认情况下,它使用默认的 TrustManagerFactory 创建 NettyChannel。但是,你可以通过创建一个 GrpcSslConfigurer 类型的 Bean 来自定义 TrustManager:
java
@Configuration
public class GRPCLocalConfiguration {
@Bean
public GRPCSSLContext sslContext() {
TrustManager trustManager = trustAllCerts();
return new GRPCSSLContext(trustManager);
}
}补充教学 —— 为什么要用 JsonToGrpc?
gRPC 是一种高性能的 RPC 框架,通常使用 Protobuf(二进制格式)进行通信,效率极高,非常适合微服务内部调用。但是,前端(浏览器/App)通常只懂 JSON/HTTP。
- 痛点:前端想调后端的 gRPC 服务,必须让后端专门写个 HTTP 接口来转发,或者搞个 BFF 层,很麻烦。
- 解决:Spring Cloud Gateway 的
JsonToGrpc过滤器充当了翻译官。 - 效果:前端直接发 JSON 给网关,网关自动翻译成 Protobuf 发给后端 gRPC 服务,拿到结果后再翻译回 JSON 给前端。这样前端开心(用 JSON),后端也开心(用 gRPC)。