Skip to content

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 发起请求时:

  1. 网关会根据 hello.proto 中提供的定义转换请求。
  2. 转换后的请求被发送到 HelloService/hello
  3. 返回的 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)。

Based on Spring Framework.