由于项目中用到的gRPC,抽时间翻阅了一下gRPC相关的资料,现记录一下。
gRPC是谷歌开源的,需要定义接口协议文件,该文件是使用 protocol buffers
具体格式
https://developers.google.com/protocol-buffers/docs/overview
该文件定义后,可以通过一些工具转化为可供其他语言适应的类。如java, nodejs,python,go, c
grpc协议会将传输的数据序列化为二进制流进行传输,此外主要特点是,必须遵循严格的接口协议,调用远程的方法,就像调用本地的一样。
想要更加具体了解的可以看看这个文章
https://studygolang.com/articles/21897?fr=sidebar
定义.proto文件
代码语言:c复制syntax = "proto3";
package pet;
// 服务名为 Adopt
// 方法为 AdoptPet
service Adopt {
rpc AdoptPet(PetRequest) returns (PetReply) {}
}
// 请求时 需传递type
message PetRequest {
string type = 1;
}
// 返回体只包含name属性
message PetReply {
string name = 1;
}
服务端文件 server.js
代码语言:javascript复制const PROTO_PATH = __dirname '/pet.proto'
var grpc = require('@grpc/grpc-js') // 用于创建服务的的核心库
var protoLoader = require('@grpc/proto-loader') // 用于加载,解析,序列化 proto文件的库
var packageDefinition = protoLoader.loadSync(
PROTO_PATH,
{
keepCase: true,
longs: String,
enums: String,
defaults: true,
oneofs: true
}
)
var pet_proto = grpc.loadPackageDefinition(packageDefinition).pet;
function AdoptPet(call, callback) {
callback(null, { name: 'Tom' })
}
function start() {
var server = new grpc.Server();
server.addService(pet_proto.Adopt.service, { AdoptPet })
server.bindAsync('0.0.0.0:50052', grpc.ServerCredentials.createInsecure(), () => {
server.start();
})
}
start()
客户端client.js
代码语言:javascript复制var PROTO_PATH = __dirname '/pet.proto'
var grpc = require('@grpc/grpc-js')
var protoLoader = require('@grpc/proto-loader')
var packageDefinition = protoLoader.loadSync(
PROTO_PATH,
{
keepCase: true,
longs: String,
enume: String,
defaults: true,
oneofs: true,
}
)
var pet_proto = grpc.loadPackageDefinition(packageDefinition).pet;
function main() {
var target = 'localhost:50052'
var client = new pet_proto.Adopt(target, grpc.credentials.createInsecure())
client.AdoptPet({ type: 'dog' }, function (error, res) {
console.log('pet name:', res.name)
})
}
main()
需要安装 @grpc/grpc-js
, @grpc/proto-loader
两个库。