本文主要是对 grpc 客户端的写法进行描述,并有在请求中添加 header 的写法
- proto 定义,务必要和服务端定义的一致
syntax = "proto3";
package grpcPackage;
service grpcServiceName {
rpc grpcFunction (grpcFunctionInterface) returns (grpcFunctionReplyInterface){}
}
message grpcFunctionInterface {
repeated int64 empIDs = 1;
}
message grpcFunctionReplyInterface{
repeated Member emps = 1;
}
message Member {
string name = 1;
string userName = 2;
int64 id = 3;
}
- egg 的 grpc 配置
config.grpcConfig = {
servicePackage: 'grpc 包名(grpcPackage)',
serviceName: 'grpc 服务名(grpcServiceName)',
serviceAddress: 'grpc 服务地址',
servicePort: 'grpc 服务端口',
protoPath: 'proto 路径(相对路径)',
interfaceName: 'grpc 请求的函数名(grpcFunction)',
grpcParam: {
keepCase: true,
longs: String,
enums: String,
defaults: true,
oneofs: true,
},
};
- 创建 grpc 对象
// 参数均为配置中心读取的
const grpc = require('@grpc/grpc-js');
const protoLoader = require('@grpc/proto-loader');
const PROTO_PATH = path.join(__dirname, proto_path);
const packageDefinition = protoLoader.loadSync(PROTO_PATH, grpc_param);
const userGrpc = grpc.loadPackageDefinition(packageDefinition)[service_package];
const client = new userGrpc[service_name](
`${service_address}:${service_port}`,
grpc.credentials.createInsecure()
);
- 向请求中添加 header
// 添加 header
const metadata = new grpc.Metadata();
metadata.add('headerKey1', headerValue1);
metadata.add('headerKey2', headerValue2);
- 定义请求函数
// 定义请求函数
const getGrpcFunction = () => {
return new Promise<EmployeeList>(resolve => {
client[interface_name](params, metadata, (err, response) => {
if (err) ctx.logger.info('user.controller.userList.err', err);
resolve(response);
});
});
};
const grpcResponse = await getGrpcFunction();
上述的 grpcResponse 即 grpc 接口返回结果