一. 安装 protocol/buf 编译器

wget "https://github.com/protocolbuffers/protobuf/releases/download/v3.9.1/protobuf-all-3.9.1.tar.gz"tar zxvf protobuf-all-3.9.1.tar.gzcd protobuf-3.9.1./configuremake && sudo make install
protoc --version
.proto
  syntax = "proto3";

  package message;

  service HelloService {
    rpc SayHello (HelloRequest) returns (HelloResponse);
  }

  message HelloRequest {
    string code = 1;
    string message = 2;
  }

  message HelloResponse {
    string code = 1;
    string message = 2;
  }
golang server
package main

import (
  "context"
  "fmt"
  "net"

  "mpa-dance-push/src/logger"
  pb "mpa-dance-push/src/message"

  "google.golang.org/grpc"
)

const port = ":50001"

type server struct{}

func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloResponse, error) {
  logger.Info.Printf("Received: %v", in.GetMessage())
  return &pb.HelloResponse{Message: "Hello " + in.GetMessage()}, nil
}

// InitRPCServer 初始化 rpc server
func InitRPCServer() {
  lis, err := net.Listen("tcp", port)
  if err != nil {
    logger.Error.Println("fail")
    return
  }
  fmt.Printf("[Init Tcp Server: Port => %s] \n", port)
  s := grpc.NewServer()
  pb.RegisterHelloServiceServer(s, &server{})
  if err := s.Serve(lis); err != nil {
    logger.Error.Printf("failed to serve: %v", err)
  }
}

func main() {
  InitRPCServer()
}
Node 客户端koa + ts
@grpc/proto-loader, grpcyarn add @grpc/proto-loader grpc --save-dev
  import { loadSync } from '@grpc/proto-loader'
  import { BaseService } from '@services/BaseService'
  import { credentials, loadPackageDefinition, PackageDefinition } from 'grpc'
  import { PROTO_PATH } from 'scretConfig'
  import { Server } from '../../server'
  import { WxProtoMessage } from './rpcMessageModel'

  export class GRPCService extends BaseService {

    private packageDefinition: PackageDefinition

    constructor(server: Server) {
      super(server)
      this.packageDefinition = loadSync(PROTO_PATH, {
        keepCase: true,
        longs: String,
        enums: String,
        defaults: true,
        oneofs: true
      })

      let message = loadPackageDefinition(this.packageDefinition).message as WxProtoMessage
      const client = new message.HelloService('localhost:50001', credentials.createInsecure())

      client.SayHello({ message: 'world' }, (_err: any, response: any) => {
        console.log(response.message)
      })
    }
  }