Skip to content

Commit d4151e9

Browse files
committed
perf: v3版本(加上case校验)
1 parent fe5b013 commit d4151e9

File tree

4 files changed

+153
-66
lines changed

4 files changed

+153
-66
lines changed

go.mod

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,11 @@ module github.com/Go-To-Byte/grpc-goroutine
22

33
go 1.19
44

5-
require (
6-
github.com/stretchr/testify v1.8.2
7-
go.uber.org/zap v1.24.0
8-
)
5+
require go.uber.org/zap v1.24.0
96

107
require (
11-
github.com/davecgh/go-spew v1.1.1 // indirect
128
github.com/pkg/errors v0.9.1 // indirect
13-
github.com/pmezard/go-difflib v1.0.0 // indirect
9+
github.com/stretchr/testify v1.8.2 // indirect
1410
go.uber.org/atomic v1.10.0 // indirect
1511
go.uber.org/multierr v1.9.0 // indirect
16-
gopkg.in/yaml.v2 v2.4.0 // indirect
17-
gopkg.in/yaml.v3 v3.0.1 // indirect
1812
)

go.sum

Lines changed: 0 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,74 +1,26 @@
11
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
2-
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
32
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
43
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
54
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
6-
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
7-
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
8-
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
9-
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
10-
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
11-
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
125
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
136
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
147
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
158
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
169
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
1710
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
1811
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
19-
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
20-
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
2112
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
2213
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
2314
github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
2415
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
25-
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
26-
go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
27-
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
2816
go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ=
2917
go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
3018
go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI=
31-
go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
32-
go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=
33-
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
3419
go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI=
3520
go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ=
36-
go.uber.org/zap v1.20.0 h1:N4oPlghZwYG55MlU6LXk/Zp00FVNE9X9wrYO8CEs4lc=
37-
go.uber.org/zap v1.20.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw=
3821
go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60=
3922
go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg=
40-
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
41-
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
42-
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
43-
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
44-
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
45-
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
46-
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
47-
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
48-
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
49-
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
50-
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
51-
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
52-
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
53-
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
54-
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
55-
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
56-
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
57-
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
58-
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
59-
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
60-
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
61-
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
62-
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
63-
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
64-
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
6523
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
66-
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
67-
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
68-
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
69-
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
70-
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
7124
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
72-
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
7325
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
7426
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

grpcrun/grpcrun_test.go

Lines changed: 82 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ package grpcrun_test
44
import (
55
"context"
66
"fmt"
7-
"github.com/stretchr/testify/assert"
7+
"go.uber.org/zap"
88
"testing"
99
"time"
1010

@@ -25,23 +25,99 @@ type loginResp struct {
2525

2626
// GRPC请求的方法参数
2727
func Login(ctx context.Context, req *loginReq) (*loginResp, error) {
28+
if req.Username != "ciusyan" || req.Password != "222" {
29+
return nil, fmt.Errorf("登录失败")
30+
}
31+
fmt.Println("登录成功")
32+
return &loginResp{UserId: 21, Token: "test grpc call success"}, nil
33+
}
34+
35+
// 参数数量不正常、返回值正常
36+
func Login1() (*loginResp, error) {
37+
fmt.Println("登录成功")
38+
return &loginResp{UserId: 21, Token: "test grpc call success"}, nil
39+
}
40+
41+
// 第一个参数 不是 context 类型
42+
func Login2(ctx int, req *loginReq) (*loginResp, error) {
43+
2844
if req.Username != "ciusyan" && req.Password != "222" {
2945
return nil, fmt.Errorf("登录失败")
3046
}
3147
fmt.Println("登录成功")
3248
return &loginResp{UserId: 21, Token: "test grpc call success"}, nil
3349
}
3450

51+
// 参数正常,返回值数量不正常
52+
func Login3(ctx context.Context, req *loginReq) {
53+
if req.Username != "ciusyan" && req.Password != "222" {
54+
return
55+
}
56+
fmt.Println("登录成功")
57+
}
58+
59+
// 参数正常,第二个返回值不是 error
60+
func Login4(ctx context.Context, req *loginReq) (*loginResp, int) {
61+
if req.Username != "ciusyan" && req.Password != "222" {
62+
return nil, 0
63+
}
64+
fmt.Println("登录成功")
65+
return &loginResp{UserId: 21, Token: "test grpc call success"}, 1
66+
}
67+
68+
var (
69+
datas []*data
70+
)
71+
3572
func TestGrpcTask(t *testing.T) {
3673

37-
should := assert.New(t)
74+
for i, d := range datas {
75+
call := grpcrun.NewGrpc(&d.ctx, d.method, d.req)
76+
call.GrpcTask()
77+
78+
t.Logf("第 %d 次执行\n", i+1)
79+
if call.Err != nil {
80+
fmt.Println(call.Err)
81+
fmt.Println()
82+
continue
83+
}
84+
//if should.NoError(call.Err) {
85+
// fmt.Println(call.Response.(*loginResp))
86+
//}
87+
fmt.Println(call.Response.(*loginResp))
88+
fmt.Println()
89+
90+
}
91+
}
92+
93+
type data struct {
94+
ctx context.Context
95+
method any
96+
req any
97+
}
98+
99+
func newData(ctx context.Context, method any, req any) *data {
100+
return &data{ctx: ctx, method: method, req: req}
101+
}
102+
103+
func init() {
38104
req := &loginReq{Username: "ciusyan", Password: "222"}
39105
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
40106
defer cancel()
41-
task := grpcrun.NewGrpc(&ctx, Login, req)
42-
task.GrpcTask()
43107

44-
if should.NoError(task.Err) {
45-
t.Log(task.Response.(*loginResp))
108+
// 测试表格
109+
datas = []*data{
110+
newData(ctx, Login, req), // 正常
111+
newData(ctx, Login1, req), // [grpcMethod]必须有2个参数(context.Context, *request)
112+
newData(ctx, Login2, req), // [grpcMethod]的第1个参数必须是:context.Context
113+
newData(ctx, Login3, req), // [grpcMethod]必须有2个返回值(*Response, error)
114+
newData(ctx, Login4, req), // [grpcMethod]的第2个返回值必须是:error
115+
newData(nil, Login, req), // 请正确的传递[Context],不支持:nil
116+
newData(ctx, nil, req), // [grpcMethod]必须是一个GRPC的函数类型,现在是:invalid
117+
newData(ctx, Login, nil), // 请正确的传递[request],不支持:invalid
118+
newData(ctx, "其他类型", req), // [grpcMethod]必须是一个GRPC的函数类型,现在是:string
119+
newData(ctx, Login, "其他类型"), // 请正确的传入[request],不支持:string
120+
newData(ctx, Login, zap.S()), // [request]的参数与[grpcMethod]的参数不匹配:grpcMethod = v3_test.loginReq, request = zap.SugaredLogger
121+
46122
}
47123
}

grpcrun/task.go

Lines changed: 69 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,20 +37,85 @@ func NewGrpc(ctx *context.Context, grpcMethod any, req any) *Grpc {
3737

3838
// GrpcTask :去调用GRPC的方法
3939
func (c *Grpc) GrpcTask() {
40-
v := reflect.ValueOf(c.grpcMethod)
41-
if v.Kind() != reflect.Func {
42-
c.Err = fmt.Errorf("[grpcMethod]必须是一个GRPC的函数类型")
40+
// 进行参数校验
41+
c.validate()
42+
if c.Err != nil {
4343
return
4444
}
4545

46-
// 进行方法调用
46+
// 能来到这里,参数一定正确了,进行方法调用
47+
// 形如:Login(ctx context.Context, req *loginReq) (*loginResp, error)
48+
c.call()
49+
}
50+
51+
func (c *Grpc) call() {
52+
v := reflect.ValueOf(c.grpcMethod)
53+
54+
// 调用参数
4755
argv := make([]reflect.Value, 2)
4856
argv[0] = reflect.ValueOf(*c.ctx)
4957
argv[1] = reflect.ValueOf(c.request)
58+
59+
// 反射调用
5060
res := v.Call(argv)
5161

62+
// 给返回值 赋值
5263
c.Response = res[0].Interface()
5364
if res[1].Interface() != nil {
5465
c.Err = res[1].Interface().(error)
5566
}
5667
}
68+
69+
// 校验结构体
70+
func (c *Grpc) validate() {
71+
72+
// 校验 req 类型
73+
reqV := reflect.ValueOf(c.request)
74+
if !reqV.IsValid() || reqV.Kind() != reflect.Ptr {
75+
c.Err = fmt.Errorf("请正确的传递[request],不支持:%v", reqV.Kind())
76+
return
77+
}
78+
79+
// 校验 ctx 类型
80+
ctxV := reflect.ValueOf(c.ctx).Elem()
81+
if ctxV.IsNil() {
82+
c.Err = fmt.Errorf("请正确的传递[Context],不支持:nil")
83+
return
84+
}
85+
86+
// 校验 grpcMethod 的信息
87+
methodV := reflect.ValueOf(c.grpcMethod)
88+
if methodV.Kind() != reflect.Func {
89+
c.Err = fmt.Errorf("[grpcMethod]必须是一个GRPC的函数类型,现在是:%v", methodV.Kind())
90+
return
91+
}
92+
93+
// 简单校验参数类型
94+
methodT := methodV.Type()
95+
if methodT.NumIn() != 2 {
96+
c.Err = fmt.Errorf("[grpcMethod]必须有2个参数(context.Context, *request)")
97+
return
98+
}
99+
100+
// 校验 grpcMethod 的第一个参数
101+
if methodT.In(0).Kind() != reflect.Interface || methodT.In(0).Name() != "Context" {
102+
c.Err = fmt.Errorf("[grpcMethod]的第1个参数必须是:context.Context")
103+
return
104+
}
105+
106+
if reqV.Type().Elem() != methodT.In(1).Elem() {
107+
c.Err = fmt.Errorf("[request]的参数与[grpcMethod]的参数不匹配:grpcMethod = %v, request = %v",
108+
methodT.In(1).Elem(), reqV.Type().Elem())
109+
return
110+
}
111+
112+
if methodT.NumOut() != 2 {
113+
c.Err = fmt.Errorf("[grpcMethod]必须有2个返回值(*Response, error)")
114+
return
115+
}
116+
117+
if methodT.Out(1).Kind() != reflect.Interface || methodT.Out(1).Name() != "error" {
118+
c.Err = fmt.Errorf("[grpcMethod]的第2个返回值必须是:error")
119+
return
120+
}
121+
}

0 commit comments

Comments
 (0)