1.grpc 近程加法计算
proto装置及proto-gen装置省略
2.proto文件编写
syntax="proto3"; //指定proto3格局package service; option go_package="./;service"; //go 打包的packageservice Calculator{ rpc Add(Numbers) returns (CalResult){} //定义一个服务 参数为Numbers 后果为CalResult}message Numbers{ //申请参数message,有a和b int64 a = 1; int64 b = 2;}message CalResult{ //响应后果 CalResult int64 message = 1;}
生成go格式文件
protoc -I ./proto/ ./proto/calculator.proto --go_out=plugins=grpc:service
3.服务端
package mainimport ( "context" "fmt" "grpcdemo/service" "net" "google.golang.org/grpc" "google.golang.org/grpc/reflection")type Server struct{} //定义一个构造体实现Add()办法func (s *Server) Add(ctx context.Context, in *service.Numbers) (*service.CalResult, error){ return &service.CalResult{Message: in.A + in.B},nil}func main(){ lis,err := net.Listen("tcp",":8089") if err != nil { fmt.Printf("监听端口失败:%s",err) return } s := grpc.NewServer() service.RegisterCalculatorServer(s,&Server{}) reflection.Register(s) err = s.Serve(lis) if err != nil { fmt.Printf("开启服务失败:%s",err) return }}
实现的办法为
4.客户端调用
package mainimport ( "context" "fmt" "grpcdemo/service" "google.golang.org/grpc")func main() { conn, err := grpc.Dial(":8089",grpc.WithInsecure()) if err != nil{ fmt.Printf("连贯服务器失败:%s",err) return } defer conn.Close() c := service.NewCalculatorClient(conn) r,err := c.Add(context.Background(),&service.Numbers{A:1,B:2}) //指定调用申请参数 if err != nil { fmt.Printf("调用服务端失败:%s",err) return } fmt.Printf("调用胜利:%d \n",r.Message)}
5.启动服务端和客户端
go run ./server/server.gogo run ./client/client.go
代码构造