1.grpc 近程加法计算
proto 装置及 proto-gen 装置省略
2.proto 文件编写
syntax="proto3"; // 指定 proto3 格局
package service;
option go_package="./;service"; //go 打包的 package
service 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 main
import (
"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 main
import (
"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.go
go run ./client/client.go
代码构造