前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >gRPC服务开发和接口测试初探【Go】

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

作者头像
FunTester
发布2022-05-17 16:59:58
6160
发布2022-05-17 16:59:58
举报
文章被收录于专栏:FunTester

之前写过了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内容:

代码语言:javascript
复制
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文件的同级目录。

服务端

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

代码语言:javascript
复制

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的,按照这个顺序学习和分享。

代码语言:javascript
复制
// TestGrpcClient
// @Description: gRPC客户端Demo
// @param t
func 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)

}

控制台

服务端输出:

忘记打日志了。没有输出

客户端输出:

代码语言:javascript
复制
=== RUN   TestGrpcClient
msg: Hello FunTester
--- PASS: TestGrpcClient (0.00s)
PASS

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FunTester 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前置
  • proto
  • 编码
    • 服务端
      • 客户端
        • 控制台
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档