目录
gRPC Go语言调用Go语言
在生成protogo的文件后,创建client和server的.go文件
server
package main
import (
"context"
"google.golang.org/grpc"
"grpc/pb"
"log"
"net"
)
type rpcServer struct {
pb.UnimplementedGRPCServer
}
func (r rpcServer) Ping(ctx context.Context, req *pb.Ping) (res *pb.Pong, err error) {
log.Println(req.GetMsg())
return &pb.Pong{
Msg: "reply from server",
}, nil
}
func main() {
l, err := net.Listen("tcp", ":10086")
if err != nil {
panic(err)
}
s := grpc.NewServer()
pb.RegisterGRPCServer(s, &rpcServer{
})
s.Serve(l)
}
client
package main
import (
"context"
"google.golang.org/grpc"
"grpc/pb"
"log"
)
func main() {
conn, err := grpc.Dial("localhost:10086", grpc.WithInsecure())
if err != nil {
panic(err)
}
defer conn.Close()
client := pb.NewGRPCClient(conn)
req, err := client.Ping(context.Background(), &pb.Ping{
Msg: "msg from client"})
if err != nil {
panic(err)
}
log.Println(req.Msg)
}
运行结果
- server
- client
Go语言gRPC流式传输(参数)
服务端
package main
import (
"fmt"
"google.golang.org/grpc"
"grpc/pb"
"log"
"net"
)
type StreamAddServer struct {
pb.UnimplementedStreamAddServer
}
func (s StreamAddServer) Add(server pb.StreamAdd_AddServer) error {
var cnt = 0
for {
req, err := server.Recv()
if err != nil {
server.SendAndClose(&pb.Pong{
Msg: fmt.Sprintf("recv done... %d times total ", cnt)})
break
}
cnt++
log.Println(req.GetMsg())
}
return nil
}
func main() {
l, err := net.Listen("tcp", ":12222")
if err != nil {
panic(err)
return
}
s := grpc.NewServer()
pb.RegisterStreamAddServer(s, &StreamAddServer{
})
s.Serve(l)
}
客户端
package main
import (
"context"
"fmt"
"google.golang.org/grpc"
"grpc/pb"
"log"
"time"
)
func main() {
dial, err := grpc.Dial("127.0.0.1:12222", grpc.WithInsecure())
if err != nil {
panic(err)
return
}
client := pb.NewStreamAddClient(dial)
add, err := client.Add(context.Background())
if err != nil {
panic(err)
return
}
for i := 0; i < 10; i++ {
add.Send(&pb.Ping{
Msg: fmt.Sprintf("[%d]send from go client...", i)})
time.Sleep(500 * time.Millisecond)
}
recv, err := add.CloseAndRecv()
if err != nil {
panic(err)
return
}
log.Println(recv.GetMsg())
}