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

代码构造