gRPC服务端编写
- 创建gRPC Server对象,你可以理解为他是Server端的抽象对象
- 将server(其包含需要被调用的服务端接口)注册到gRPC Server的内部注册中心
这样可以在接收到请求时,通过内部的服务发现,发现该服务器端口并转接进行逻辑处理 - 创建Listen,监听TCP端口
- gRPC Server开始 lis。Accept,直到 Stop
先重写hello_grpc.pb.go里的SayHello方法,需要把相应的目录给import
package main
import (
pb "GoPro/gRPC/hello-server/proto"
"context"
"fmt"
"net"
"google.golang.org/grpc"
)
type server struct {
pb.UnimplementedSayHelloServer
}
func (s *server) SayHello(ctx context.Context, req *pb.HelloRequests) (*pb.HelloResponse, error) {
return &pb.HelloResponse{ResponseMsg: "hello" + req.RequestName}, nil
}
实现使用
func main() {
// 开启端口
listen, _ := net.Listen("tcp", ":9090")
// 创建gRPC服务
grpcServer := grpc.NewServer()
// 在gRPC服务端中去注册我们编写的服务
pb.RegisterSayHelloServer(grpcServer, &server{})
// 启动服务
err := grpcServer.Serve(listen)
if err != nil {
fmt.Printf("failed to serve :%v ", err)
return
}
}
gRPC客户端编写
- 创建与给定目标(服务端)的连接交互
- 创建 server的客户端对象
- 发送RPC请求,等待同步响应,得到回调后返回响应结果
- 输出响应结果
package main
import (
"context"
"fmt"
pb "gRPC_test/hello-server/proto"
"log"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
)
func main() {
// 连接到server端
conn, err := grpc.Dial("127.0.0.1:9090", grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
log.Fatalf("did not connect: #{err}")
}
// 所有连接用完都要关闭连接
defer conn.Close()
// 建立连接
client := pb.NewSayHelloClient(conn)
// context.Background()找到对应的上下文请求
// 执行rpc调用(这个方法在服务端来实现并返回结果)
resp, _ := client.SayHello(context.Background(), &pb.HelloRequests{RequestName: "krien"})
fmt.Println(resp.GetResponseMsg())
}
最后实现客户端获取到服务端
运行服务端端口
[Running] go run "c:\Users\79120\Desktop\GoPro\gRPC\hello-client\main.go"
hellokrien