.proto协议文件
// 版本
syntax = "proto3";
// 指定包名
package protoser;
// 文件生成位置
option go_package = "./protoser";
//
service ListenService {
rpc ListenServerEth (Req) returns (Res) {}
}
message Req {
string addr =1;
}
message Res {
string msg = 1;
}
makefile
SHELL=PATH='$(PATH)' /bin/sh
.PHONY: all
# protoc 用于将proto文件编程成各种语言源码文件的工具
# 生成对应语言代码工具
#go get google.golang.org/protobuf/cmd/protoc-gen-go
#go get google.golang.org/grpc/cmd/protoc-gen-go-grpc
#grpc
all:
protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative ./listen.proto
# protoc --go-grpc_out=plugins=grpc:./ --go_opt=paths=source_relative listen.proto
server端
type ListenEth struct {
// 必须嵌入,以具有向前兼容的实现
protoser.UnimplementedListenServiceServer
}
// 服务接口,用于给grpc注册
var ListenEthInstance = &ListenEth{}
// 服务方法
func (l *ListenEth) ListenServerEth(context.Context, *protoser.Req) (*protoser.Res, error) {
return &protoser.Res{
Msg: "call success",
}, nil
}
type GrpcServer struct {
}
服务管理
func NewGrpcserver() *GrpcServer {
return &GrpcServer{}
}
func (g *GrpcServer) StartListenGrpc() error {
l, err := net.Listen("tcp", ":8080")
if err != nil {
// panic(err)
return err
}
// 初始化grpc服务
server := grpc.NewServer()
// 服务注册
protoser.RegisterListenServiceServer(server, ListenEthInstance)
// Register在给定的gRPC服务器上注册服务器反射服务
reflection.Register(server)
if err := server.Serve(l); err != nil {
//panic(err)
return err
}
return nil
}
对外服务
type GrpcListenServer struct {
GServer *grpcser.GrpcServer
}
func NewGrpcListenServer() *GrpcListenServer {
g := grpcser.NewGrpcserver()
return &GrpcListenServer{
GServer: g,
}
}
func (g *GrpcListenServer) StartGrpcDaemon() {
if err := g.GServer.StartListenGrpc(); err != nil {
panic(err)
}
}
main 启动
func main() {
if err := rootCmd.Execute(); err != nil {
panic(err)
}
//server.SingleListenServer().StartDaemon()
}
// 需要实现cmdStructName下的Run成员变量
func mainRun(cmd *cobra.Command, args []string) {
// 启动listenServer
// server.SingleListenServer().StartDaemon()
// 启动grpc
server.NewGrpcListenServer().StartGrpcDaemon()
// expectSignal()
}
测试
func TestListenServerEth(t *testing.T) {
var serviceHost = "127.0.0.1:8080"
conn, err := grpc.Dial(serviceHost, grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
panic(err)
}
client := protoser.NewListenServiceClient(conn)
var res *protoser.Res
res, err = client.ListenServerEth(context.TODO(), &protoser.Req{})
if err != nil {
panic(err)
}
fmt.Println(res.Msg)
}
=== RUN TestListenServerEth
call success
--- PASS: TestListenServerEth (0.00s)
PASS