首选需要下载两个运行依赖:
@grpc/grpc-js 和 @grpc/proto-loader
以下内容摘自网络:
在gRPC里,客户端可以直接调用不同机器上的服务应用的方法,就像是本地对象一样,所以创建分布式应用和服务就很简单了。在很多RPC(Remote Procedure Call Protocol)系统里,gRPC是基于定义一个服务,指定一个可以远程调用的带有参数和返回类型的的方法。在服务端,服务实现这个接口并且运行gRPC服务处理客户端调用。在客户端,有一个stub提供和服务端相同的方法。
在各种环境里,gRPC客户端和服务端都能运行并且互相通讯 - 从谷歌内部服务到你自己的桌面 - 并且可以写在任何gRPC支持的语言。比如,可以简单的创建java作为gRPC的服务端,Go,Python或者Ruby作为客户端。另外,最新的谷歌APIs将会有gRPC版本的接口,可以方便的在应用里构建Google功能。
如果在node中使用grpc通讯:
首先定义proto文件结构如下:
//语法 proto3
syntax = "proto3";
//proto文件服务端和客户端定义的内容相同,可以理解为协商好的一个规则文件,服务端和客户端都要遵守这一个规则
//包名
package proto;
service ContainerService {
//rpc对应的ListRequest没有指定参数,表示这个接口不用往后端传递参数,returns表示后端返回的数据
rpc ContainerList(ListRequest) returns (ListReturn){}
rpc ContainerCreate(Container) returns (ContainerReturn){}
rpc ContainerStart(ContainerID) returns (ContainerReturn){}
rpc ContainerStop(ContainerID) returns (ContainerReturn){}
rpc ContainerRestart(ContainerID) returns (ContainerReturn){}
rpc ContainerRemove(ContainerID) returns (ContainerReturn){}
rpc ContainerLogs(ContainerID) returns (LogsReturn){}
rpc ContainerExec(ExecRequest) returns (ExecReturn){}
}
message ListRequest{
}
message ListReturn{
repeated Container Containers = 1;
}
message ContainerReturn{
int32 StatusCode = 1;
string Message = 2;
}
message ContainerID{
string ID = 1;
}
message LogsReturn{
repeated string logs = 1;
}
message ExecRequest{
string ID = 1;
string WorkingDir = 2;
repeated string Cmd = 3;
}
message ExecReturn{
repeated string results = 1;
}
message Container {
string ID = 1;
string Name = 2;
string Image = 3;
string Command = 4;
int64 Created = 5;
string State = 6;
string Status = 7;
repeated Port Ports = 8;
repeated Mount Mounts = 9;
}
message Port {
string Type = 1;
string IP = 2;
int32 PrivatePort = 3;
int32 PublicPort = 4;
}
message Mount{
string Type = 1;
string Name = 2;
string Source = 3;
string Destination = 4;
string Driver = 5;
string Mode = 6;
bool RW = 7;
}
2.加载protoLoader定义信息
/**
1、第一个参数为proto文件存放路径,根据自己存放路径进行调整
2、第二个参数为固定写法,一般不需要过多调整
*/
const packageDefinition = protoLoader.loadSync('container.proto',{
keepCase:true,
longs:String,
enums:String,
defaults:true,
oneofs:true
})
//第二步,导入声明的包
//.proto为proto文件的包名,即上边声明的proto文件
const _proto = grpc.loadPackageDefinition(packageDefinition).proto;
//第三步,建立链接
//建立与ContainerService这个组的链接,第一个参数为服务端ip地址,第二个参数固定写法
const client = new _proto.ContainerService('zmjkf.cn:9594',grpc.credentials.createInsecure())
//第三步,发送请求
//第一个参数为对象,key value按照proto对应的规则进行传参,第二个为回调可以获取后端返回数据
client.ContainerCreate({StatusCode:1,Message:'2'},(err,res)=>{
if(err){
console.log(err);
return;
}
console.log(res);
})