grpc服务器向客户端发消息,我可以从服务器向客户端GRPC发送自定义错误消息吗?...

本文档描述了作者在实现GRPC服务器和客户端时遇到的问题,即如何在服务器端创建自定义错误并将其有效地传递给客户端。尽管尝试了使用JavaScript Error对象并添加自定义属性,但这些属性在传递过程中被删除,转换为GRPC标准错误。作者询问是否可以发送自定义消息,以及如何避免属性丢失。示例代码展示了服务器和客户端的实现,以及.proto文件定义。
摘要由CSDN通过智能技术生成

我创建了一个简单的GRPC服务器和客户端。

我想要做的是在服务器中创建自定义错误并将其传递给客户端。我的代码如下:

Server.js

awk '$1 == "commit" {$2 = "https://github.com/account/repo/commit/" $2} 1'

Client.js

var error = require('error');

var PROTO_PATH = grpc.load(__dirname + '/proto/hello.proto');

var hello_proto = PROTO_PATH.hello;

function sayHello(call, callback) {

try {

var jsErr = new Error('MY_ERROR');

jsErr.newStatus = 401;

jsErr.newMessage = 'custom unAuthorized error';

console.log(Object.getOwnPropertyNames(jsErr));

console.log(jsErr);

callback(jsErr);

} catch(e) {

callback(e);

}

}

function sayHelloAgain(call, callback) {

callback(null, {message: 'Hello Again ' + call.request.name});

}

function main() {

var server = new grpc.Server();

server.addProtoService(hello_proto.Hello.service, {sayHello: sayHello,sayHelloAgain: sayHelloAgain });

server.bind('0.0.0.0:50051', grpc.ServerCredentials.createInsecure());

server.start();

}

main();

和我的原型文件

var grpc = require('grpc');

var PROTO_PATH = grpc.load(__dirname + '/proto/hello.proto');

var hello_proto = PROTO_PATH.hello;

function main() {

var client = new hello_proto.Hello('localhost:50051',grpc.credentials.createInsecure());

var user;

if (process.argv.length >= 3) {

user = process.argv[2];

} else {

user = 'world';

}

client.sayHello({name: user}, function(err, response) {

console.log(Object.getOwnPropertyNames(err));

console.log(err);

});

}

main();

当我运行cient时,每个人的结果都是这样的

服务器。

syntax = "proto3";

package hello;

service Hello {

rpc sayHello(sayHelloRequest) returns (sayHelloResponse) {}

rpc sayHelloAgain(sayHelloRequest) returns (sayHelloResponse) {}

}

message sayHelloRequest {

string name = 1;

}

message sayHelloResponse {

string message = 1;

}

客户。

[ 'stack', 'message', 'newStatus', 'newMessage' ]

{ [Error: MY_ERROR] newStatus: 401, newMessage: 'custom unAutorized error' }

因此,我创建的自定义javascript错误[ 'stack', 'message', 'code', 'metadata' ]

{ [Error: MY_ERROR] code: 2, metadata: Metadata { _internal_repr: {} } }属性已被删除,并且已转换为GRPC标准错误消息。

我的问题是

是否可以向客户端发送自定义消息?

我可以创建GRPC错误,而不是javascript错误吗?

向客户端发送自定义属性的一种方法是我认为将自定义数据添加到newStatus, newMessage。但我也不知道该怎么做。

醇>

grpc-go服务器端对客户端的每次请求是默认采用单协程处理。 在grpc-go框架中,服务器端会使用单协程来处理多个客户端请求。当客户端服务器发起请求时,服务器会使用一个协程来处理该请求。这个协程会负责处理请求的所有步骤,包括接收请求、解析请求、调用相应的服务方法进行处理、生成响应、发送响应等。使用单协程处理多个请求的好处是可以减少协程创建和销毁的开销,提高服务器的性能和资源利用率。 grpc-go框架中使用单协程处理多个请求的机制是通过一个协程池来实现的。服务器会预先创建一定数量的协程,并将这些协程放入协程池中。当有客户端请求到来时,服务器从协程池中选择一个空闲的协程来处理该请求。如果所有协程都正在处理请求,新的请求将会等待直到有协程可用。这样可以有效地复用协程,提高服务器的性能和并发处理能力。 需要注意的是,grpc-go框架中也支持自定义的处理方式。使用者可以通过配置选择使用单协程或多协程处理请求,以满足不同的业务需求。例如,对于一些需要并发处理大量请求的场景,可以配置服务器采用多协程处理请求,以提高并发处理能力和吞吐量。 总结来说,grpc-go服务器端默认采用单协程处理客户端的每次请求,通过协程池来复用协程,提高性能和资源利用率。但也可以根据需求进行配置,选择使用多协程处理请求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值