HTTP协议转gRPC协议

插件信息

名称字段属性
http协议转gRPC协议http_to_grpc协议转换

功能描述

将客户端 HTTP请求 转换成 gRPC请求 转发给上游服务,并将上游服务的 gRPC响应 转换成 HTTP响应 转发给客户端。该插件仅当路由驱动为http时生效。

Open Api

配置参数说明

参数名值类型是否必填值可能性默认值说明
typesarray_string["text/html","application/json"]需要压缩的响应content-type类型列表,不填则 匹配任何 MIME 类型, 不填则为所有
min_lengthint11待压缩内容的最小长度
varyboolfalsefalse是否加上Vary: Accept-Encoding响应头部

Open Api

插件配置参数

参数名值类型是否必填值可能性默认值说明
servicestringService.Hello服务名称,gRPC调用服务名
methodstringHello方法名称,gRPC调用方法名
authoritystring虚拟主机域名(Authority)
formatstringjson请求数据格式
reflectboolfalse反射,若gRPC服务器开启了反射,配置时可设置为true
protobuf_idstringprotobuf编码器ID,若reflect为false时,该值必填
headermap[string]string{"name":"apinto"}额外头部,转发请求时,会将其拼接到转发的请求头部中一并转发
  • 当服务名称不填时,则默认使用 HTTP请求路径的第一个/和第二个/之间的值作为服务名
  • 当方法名称不填时,则默认使用 HTTP请求路径的第二个/和第三个/之间的值作为服务名
  • 即,若HTTP请求路径上/Service.Hello/Hello,则此时服务名称为Service.Hello,方法名称为Hello

配置示例

{
    "authority":"",
    "format":"json",
    "headers":{

    },
    "method":"",
    "protobuf_id":"demo@transcode",
    "reflect":false,
    "service":""
}
全局配置

在使用http_to_grpc插件之前,需要在全局插件配置中将name为http_to_grpc的插件状态设置为enable,具体配置点此跳转

curl -X POST  'http://127.0.0.1:9400/api/setting/plugin' \
-H 'Content-Type:application/json' \
-d '{
    "plugins":[{
        "id":"eolinker.com:apinto:http_to_grpc",
        "name":"http_to_grpc",
        "status":"enable"
    }]
}'
配置gRPC上游服务
curl -X POST  'http://127.0.0.1:9400/api/service' -H 'Content-Type:application/json' -d '{
    "balance":"round-robin",
    "create":"2023-02-17 12:33:09",
    "description":"",
    "discovery":"",
    "driver":"http",
    "id":"grpc_demo@service",
    "name":"grpc_demo",
    "nodes":[
        "127.0.0.1:9001"
    ],
    "pass_host":"node",
    "profession":"service",
    "retry":0,
    "scheme":"HTTP",
    "timeout":2000,
    "update":"2023-02-27 19:59:45"
}' 
配置带有http转gRPC协议插件的路由
curl -X POST  'http://127.0.0.1:9400/api/router' -H 'Content-Type:application/json' -d '{
    "listen":8099,
    "method":[
        "GET",
        "POST"
    ],
    "host":[

    ],
    "location":"/Service.Hello/Hello",
    "rules":[

    ],
    "service":"grpc_demo@service",
    "template":"",
    "websocket":false,
    "disable":false,
    "plugins":{
        "http_to_grpc":{
            "disable":false,
            "config":{
                "authority":"",
                "format":"json",
                "headers":{

                },
                "method":"",
                "protobuf_id":"demo@transcode",
                "reflect":false,
                "service":""
            }
        }
    },
    "retry":0,
    "time_out":0,
    "description":""
}' 
使用网关访问gRPC服务端

官方提供gRPC服务端示例,可点击获取gRPC示例代码open in new window获取。

  1. 启动gRPC服务器
./grpcServer

2、请求Service.Hello服务的Hello方法

示例中,我们定义了Hello方法的功能:

  • HelloRequest中的name字段通过HelloResponsemsg字段封装成hello,%s的结果返回
  • 将请求的Header作为gRPC响应的Trailer头部返回

调用结果如下: