104 lines
2.5 KiB
Go
104 lines
2.5 KiB
Go
package main
|
||
|
||
import (
|
||
"context"
|
||
"flag"
|
||
"fmt"
|
||
"io/ioutil"
|
||
"os"
|
||
|
||
"github.com/gogo/protobuf/jsonpb"
|
||
"google.golang.org/grpc"
|
||
"google.golang.org/grpc/credentials"
|
||
"google.golang.org/grpc/encoding"
|
||
)
|
||
|
||
// Reply for test
|
||
type Reply struct {
|
||
res []byte
|
||
}
|
||
|
||
var data string
|
||
var file string
|
||
var method string
|
||
var addr string
|
||
var tlsCert string
|
||
var tlsServerName string
|
||
|
||
//Reference https://jbrandhorst.com/post/grpc-json/
|
||
func init() {
|
||
encoding.RegisterCodec(JSON{
|
||
Marshaler: jsonpb.Marshaler{
|
||
EmitDefaults: true,
|
||
OrigName: true,
|
||
},
|
||
})
|
||
flag.StringVar(&data, "data", `{"name":"longxia","age":19}`, `{"name":"longxia","age":19}`)
|
||
flag.StringVar(&file, "file", ``, `./data.json`)
|
||
flag.StringVar(&method, "method", "/testproto.Greeter/SayHello", `/testproto.Greeter/SayHello`)
|
||
flag.StringVar(&addr, "addr", "127.0.0.1:8080", `127.0.0.1:8080`)
|
||
flag.StringVar(&tlsCert, "cert", "", `./cert.pem`)
|
||
flag.StringVar(&tlsServerName, "server_name", "", `hello_server`)
|
||
}
|
||
|
||
// 该example因为使用的是json传输格式所以只能用于调试或测试,用于线上会导致性能下降
|
||
// 使用方法:
|
||
// ./grpcDebug -data='{"name":"xia","age":19}' -addr=127.0.0.1:8080 -method=/testproto.Greeter/SayHello
|
||
// ./grpcDebug -file=data.json -addr=127.0.0.1:8080 -method=/testproto.Greeter/SayHello
|
||
func main() {
|
||
flag.Parse()
|
||
opts := []grpc.DialOption{
|
||
grpc.WithInsecure(),
|
||
grpc.WithDefaultCallOptions(grpc.CallContentSubtype(JSON{}.Name())),
|
||
}
|
||
if tlsCert != "" {
|
||
creds, err := credentials.NewClientTLSFromFile(tlsCert, tlsServerName)
|
||
if err != nil {
|
||
panic(err)
|
||
}
|
||
opts = append(opts, grpc.WithTransportCredentials(creds))
|
||
}
|
||
if file != "" {
|
||
content, err := ioutil.ReadFile(file)
|
||
if err != nil {
|
||
fmt.Println("ioutil.ReadFile %s failed!err:=%v", file, err)
|
||
os.Exit(1)
|
||
}
|
||
if len(content) > 0 {
|
||
data = string(content)
|
||
}
|
||
}
|
||
conn, err := grpc.Dial(addr, opts...)
|
||
if err != nil {
|
||
panic(err)
|
||
}
|
||
var reply Reply
|
||
err = grpc.Invoke(context.Background(), method, []byte(data), &reply, conn)
|
||
if err != nil {
|
||
panic(err)
|
||
}
|
||
fmt.Println(string(reply.res))
|
||
}
|
||
|
||
// JSON is impl of encoding.Codec
|
||
type JSON struct {
|
||
jsonpb.Marshaler
|
||
jsonpb.Unmarshaler
|
||
}
|
||
|
||
// Name is name of JSON
|
||
func (j JSON) Name() string {
|
||
return "json"
|
||
}
|
||
|
||
// Marshal is json marshal
|
||
func (j JSON) Marshal(v interface{}) (out []byte, err error) {
|
||
return v.([]byte), nil
|
||
}
|
||
|
||
// Unmarshal is json unmarshal
|
||
func (j JSON) Unmarshal(data []byte, v interface{}) (err error) {
|
||
v.(*Reply).res = data
|
||
return nil
|
||
}
|