写点什么

gRPC 服务开发和接口测试初探【Go】

作者:FunTester
  • 2022 年 5 月 07 日
  • 本文字数:1742 字

    阅读完需:约 6 分钟

之前写过了Grpc服务开发和接口测试初探【Java】,中间耽搁了一些时间,Go 版本的 gRPC 测试开发实践才有时间学习使用。其中也是由于自己 Go 语言不够熟悉导致的。之前有段时间想暂时放弃 Go 语言的学习,导致了 Go 的生疏,原因是从Groovy到Java性能

前置

回归正题,Go 语言版本的 gRPC 实践相对 Java 来说是比较简单的,但是总体的工具链是比较复杂的,可能是因为 Go 生态目前相比 Java 还是比较匮乏吧。下面我先简述一下大致的步骤:


  1. 安装 Go 语言环境和 IDE:如 GoLand

  2. 安装 protoc-gen-go,或者安装 gofast,据称后者性能更高且更复杂

  3. 安装 gRPC,这里有坑,可能是网络,大家自行解决

  4. 生成 Demo 代码,命令和参数取决于使用哪种工具


以上步骤亲自操作可能会遇到一些小问题,我本人搜到的教程什么的也是乱七八糟,踩了一些坑。我没有整理出一个亲自实践之后的可行的教程,原因有二:


  1. 我这可行的,肯定不是放之四海皆准

  2. 解决问题也是学习提升的一部分,不能越俎代庖

proto

Go 语言的 gRPC 的proto编写跟 Java 大致一致,只有一个报名的参数不太一样。下面是我的Hello.proto内容:


syntax = "proto3";
option go_package="./;proto";
service HelloService { rpc ExecuteHi(HelloRequest) returns (HelloResponse) {};}
message HelloRequest { string name = 1; int32 age = 2;}
message HelloResponse { string msg = 1;}
复制代码


这里主要go_package网上搜到的配置方式有些不一样,我没有全都尝试,大家在搜索的资料时候,尽量先看看syntax这个参数的值,以及文章教程写作的时间,如果距离现在太久了,我建议直接关掉。搜索引擎有过滤功能,可以过滤掉过时的教程。

编码

这里 Go 语言 gRPC 的一点优势,就是在一个项目中即可实现,Java 需要先弄一个 SDK 这样。Go 语言的 gRPC 的代码可以通过生成代码命令中的参数实现指定路径。我是放在了和proto文件的同级目录。

服务端

服务端代码也是比较格式化的内容,如下:



type Ser struct {}
func (s *Ser) ExecuteHi(ctx context.Context, in *pb.HelloRequest) (*pb.HelloResponse, error) { return &pb.HelloResponse{Msg: "Hello " + in.Name}, nil}
func TestGrpcService(t *testing.T) { // 监听127.0.0.1:12345地址 lis, err := net.Listen("tcp", "127.0.0.1:12345") if err != nil { log.Fatalf("failed to listen: %v", err) }
// 实例化grpc服务端 s := grpc.NewServer()
pb.RegisterHelloServiceServer(s, &Ser{})
// 往grpc服务端注册反射服务 reflection.Register(s)
// 启动grpc服务 if err := s.Serve(lis); err != nil { log.Fatalf("failed to serve: %v", err) }}
复制代码


其中 pb.RegisterHelloServiceServer(s, &Ser{})如果报错,请检查自己安装的工具protoc-gen-go或者protoc-gen-gofast版本,一般提取报错message搜索也能得到解决办法。

客户端

下面是客户端的代码,由于学艺不精,其中大部分参数的含义目前我也不是很清楚,特别是基于stream的请求响应的方式使用。后面我先把 Java 的学完,再回过头来看 Go 的,按照这个顺序学习和分享。


// TestGrpcClient// @Description: gRPC客户端Demo// @param tfunc TestGrpcClient(t *testing.T) {  conn, _ := grpc.Dial(address, grpc.WithInsecure(), grpc.WithBlock())  defer conn.Close()  c := pb.NewHelloServiceClient(conn)  ctx, cancel := context.WithTimeout(context.Background(), time.Second)  defer cancel()  r, _ := c.ExecuteHi(ctx, &pb.HelloRequest{    Name: "FunTester",    Age:  23,  })  fmt.Printf("msg: %s\n", r.Msg)
}
复制代码

控制台

服务端输出:


忘记打日志了。没有输出


客户端输出:


=== RUN   TestGrpcClientmsg: Hello FunTester--- PASS: TestGrpcClient (0.00s)PASS
复制代码


Go 语言的 gRPC 测试开发实践已经完事儿,大概率上我不会在工作中使用 Go 作为主力 gRPC 测试语言,后面测试实践内容还是会以 Java 为主。

Have Fun ~ Tester !

发布于: 刚刚阅读数: 2
用户头像

FunTester

关注

公众号:FunTester,750篇原创,欢迎关注 2020.10.20 加入

公众号FunTester,坚持原创文章的测试人,一个有趣的灵魂。

评论

发布
暂无评论
gRPC服务开发和接口测试初探【Go】_FunTester_InfoQ写作社区