一. 安装 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)
})
}
}