0%

grpc-web使用补充

grpc-web使用中遇到了些问题,官方文档及社区并不活跃,很多坑还得自己踩,这里总结下

grpc: received message larger than max (1094796627 vs. 4194304)

遇到该报错,存在两种情况

大小设定

  1. grpc.max_send_message_length设置,单位bytes,-1表示没有限制
  2. 服务端/客户端设置相互独立

官方配置见https://grpc.github.io/grpc/core/group__grpc__arg__keys.html#gab4defdabac3610ef8a5946848592458c

–grpc-web_out

确定WEB输出模式是grpcwebtext还是grpcweb,如果是grpcweb,但最终发的是二进制,则会报received message larger than max,有1G之多。

1
$ protoc -I=. helloworld.proto --js_out=import_style=commonjs:. --grpc-web_out=import_style=commonjs,mode=grpcweb:.

413 (Request Entity Too Large)

  1. 确定nginx client_max_body_size配置
  2. 确认grpc-server端grpc.max_receive_message_length配置

自定义头部字段

有时发送请求希望自定义头部,比如这样实现动态代理grpc服务。

实现需要2部分设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

var client = new GreeterClient('http://' + window.location.hostname + ':9090', null, null);

// simple unary call
var request = new HelloRequest();
request.setName('World');

client.sayHello(request, {
'X-Grpc-node': 'hello world' // 自定义头部字段
}, (err, response) => {
if (err) {
console.log(`Unexpected error for sayHello: code = ${err.code}` + `, message = "${err.message}"`);
} else {
console.log(response.getMessage());
}
});

nginx设定读取自定义字段从而实现动态代理

1
2
3
4
5
6
7
8
9
10
11
server {
listen 9080;
server_name localhost;
underscores_in_headers on; # 控制自定义头部字段读取,需要开启

location / {
grpc_set_header Content-Type application/grpc;
grpc_pass grpc://$http_x_grpc_node; # 注意http前缀及下划线
}

}

Nginx动态代理gRPC服务

1
2
3
4
5
6
7

location / {
grpc_set_header Content-Type application/grpc;
grpc_pass grpc://$http_x_grpc_node;

...
}

注意http_x_grpc_node为HTTP自定义头部字段值。如果需要代理SSL服务,对应是grpcs://

代理gRPCs

1
2
3
4
5
6
7
8
9
10
location / {
grpc_set_header Content-Type application/grpc;
grpc_pass grpcs://$http_x_grpc_node;

# 注意,文件名称中支持变量
grpc_ssl_certificate /var/www/ssl/$http_x_grpc_ssl_cert;
grpc_ssl_certificate_key /var/www/ssl/$http_x_grpc_ssl_cert_key;

...
}

注意grpc_ssl_certificate,grpc_ssl_certificate_key文件值支持变量

补充

  1. 在确定RPC server是否正常启动时,可以使用telnet来测试端口联通性,比如telnet 192.168.1.203 16301

相关文档