首选需要下载两个运行依赖:

@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);
})