gRPC快速使用 | 青训营笔记

122 阅读2分钟

这是我参与「第五届青训营 」笔记创作活动的第 8 天

一、本堂课重点内容

  • 有关gRPC服务端编写和客户端编写的quick start,用于理解gRPC的基本内容

二、详细知识点介绍

服务端编写

  • 创建gRPC Server对象,你可以理解为Server端的抽象对象

  • 将 server (其包含需要被调用的服务端接口) 注册到 gRPC Server 的内部注册中心

    这样可以在接受到请求时,通过内部的服务发现,发现该服务端接口并转接进行逻辑处理

  • 创建 Listen,监听TCP端口

  • gRPC Server 开始 lis.Accept,直到 Stop

下面给出以之前写的Hello服务为例,实现以下服务端的编写

// 实现生成代码中未实现的服务
// hello Server
type server struct {
	pb.UnimplementedSayHelloServer
}

func (s *server) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloResponse, error) {
	return &pb.HelloResponse{ResponseMsg: "hello" + req.RequestName}, nil
}

注册并开启rpc服务

func main() {
	// 开启端口
	listen, err := net.Listen("tcp", ":9090")
	if err != nil {
		panic("port open failed")
	}
	// 创建grpc服务
	grpcServer := grpc.NewServer()
	// 在grpc服务端中注册我们自己编写的服务
	pb.RegisterSayHelloServer(grpcServer, &server{})
	// 启动服务
	err = grpcServer.Serve(listen)
	if err != nil {
		panic("service open failed")
	}
}

客户端编写

  • 创建与给定目标(服务端)的连接交互
  • 创建 server 的服务端对象
  • 发送 RPC 请求,请求同步响应,得到回调后返回响应结果
  • 输出响应结果

同样以刚刚的Hello服务为例,编写一下客户端侧的代码demo

func main() {
	// 连接服务
	// 第二个参数为安全配置(这里新建了空的加密配置,即不进行安全加密)
	conn, err := grpc.Dial("127.0.0.1:9090", grpc.WithTransportCredentials(insecure.NewCredentials()))
	if err != nil {
		panic("fail to connect server")
	}
	// 关闭grpc连接,都记得关闭!
	defer conn.Close()
	// 与服务端建立连接
	client := pb.NewSayHelloClient(conn)
	resp, _ := client.SayHello(context.Background(),
		&pb.HelloRequest{
			RequestName: "二火",
		})
	fmt.Println(resp.GetResponseMsg())
}

我们分别启动服务端和客户端,可以看见:

image-20230120203203783

三、实践练习例子

实践的部分代码也已经贴在上面了,以及这里是GitHub

四、课后个人总结

其实我对于gRPC的学习已经基本快速入门了! (笔记只上传一点才不是要水笔记呢!)

这几天没课的时候,将会连载gRPC以及有关网络相关的文章~

除了字节官方推荐的Kitex,gRPC或许能成为你的选择~

五、引用参考

gRPC官网

gRPC 官方文档中文版_V1.0 (oschina.net)