参考文档 grpc的文档:http://doc.oschina.net/grpc
https://my.oschina.net/u/3860449/blog/2396031
这里主要是参考文档实现的小demo,当作学习记录。
项目基本组成,红框中是需要编写的文件,
常规流程如下:
1、编写protobuf文件:HelloWorld.proto
syntax = "proto3";
option java_package = "ex.grpc";
option objc_class_prefix = "HSW";
package helloworld;
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {}
rpc printAge (printAgeRequest) returns (printAgeReply) {}
}
message HelloRequest {
string name = 1;
string city = 2;
}
message HelloReply {
string message = 1;
}
message printAgeRequest {
string age = 1;
}
message printAgeReply {
string text = 1;
}
2、服务端文件:greeter_server.js
'use strict';
const path = require('path');
const grpc = require('grpc');
const protoLoader = require('@grpc/proto-loader');
// 从 proto 文件加载服务描述符
const PROTO_PATH = path.resolve(__dirname, 'protos/HelloWorld.proto');
const packageDefinition = protoLoader.loadSync(
PROTO_PATH,
{
keepCase: true,
longs: String,
enums: String,
defaults: true,
oneofs: true
}
);
const hello_proto = grpc.loadPackageDefinition(packageDefinition).helloworld;
// SayHello的实现,调用call.request为protobuf文件的请求体,将返回体通过callback函数回传至客户端。
function sayHello2(call, callback) {
try {
let data = 'hello ' + call.request.name + ' and city is ' + call.request.city;
callback && callback(null, {message: data})
} catch (err) {
console.log('错误');
callback && callback(err)
}
}
function printAge2(call, callback) {
try{
let text = 'current age is ' + call.request.age;
callback && callback(null, {text})
} catch (err) {
console.log('错误');
callback && callback(err)
}
}
// 服务器的启动方法
/*
1、通过 Greeter 服务描述符创建一个 Server 构造函数。
2、实现服务的方法。
3、通过调用 Server 的构造函数以及方法实现去创建一个服务器的实例。
4、用实例的 bind() 方法指定地址以及我们期望客户端请求监听的端口。
5、调用实例的 start() 方法启动一个RPC服务器。
*/
function main() {
const server = new grpc.Server();
server.addService(hello_proto.Greeter.service, {
SayHello: sayHello2,
printAge: printAge2
});
server.bind('127.0.0.1:50051', grpc.ServerCredentials.createInsecure());
server.start();
console.log('server start......')
}
main()
3、客户端调用 greeter_client.js
'use strict';
const path = require('path');
const grpc = require('grpc');
const protoLoader = require('@grpc/proto-loader');
const PROTO_PATH = path.resolve(__dirname, 'protos/HelloWorld.proto');
const packageDefinition = protoLoader.loadSync(
PROTO_PATH,
{
keepCase: true,
longs: String,
enums: String,
defaults: true,
oneofs: true
}
);
const hello_proto = grpc.loadPackageDefinition(packageDefinition).helloworld;
function main() {
console.log('client start.......')
// 调用 Greeter 的存根构造函数,指定服务器地址和端口。
const client = new hello_proto.Greeter( '127.0.0.1:50051', grpc.credentials.createInsecure());
// 构造调用服务的方法:使用事件或者回调函数去获得结果
function getMessage(error, response) {
if (error) {
console.log(error);
return;
}
console.log('Greeting: ', response.message)
}
function getText(error, response) {
if (error) {
console.log(error);
return;
}
console.log('Text is : ', response.text)
}
// 调用存根上的方法,传入请求和回调函数
client.sayHello({name: 'locy', city: '上海'}, getMessage);
client.printAge({age: '45'}, getText)
}
main()
4、运行
首先在项目所在目录 $ node greeter_server.js
启动服务器;
然后在相关路径下,运行$ node greeter_client.js
启动客户端;