Create & Init Project...
This commit is contained in:
43
library/net/rpc/warden/examples/client/BUILD
Normal file
43
library/net/rpc/warden/examples/client/BUILD
Normal file
@ -0,0 +1,43 @@
|
||||
package(default_visibility = ["//visibility:public"])
|
||||
|
||||
load(
|
||||
"@io_bazel_rules_go//go:def.bzl",
|
||||
"go_binary",
|
||||
"go_library",
|
||||
)
|
||||
|
||||
go_binary(
|
||||
name = "client",
|
||||
embed = [":go_default_library"],
|
||||
tags = ["automanaged"],
|
||||
)
|
||||
|
||||
go_library(
|
||||
name = "go_default_library",
|
||||
srcs = ["client.go"],
|
||||
importpath = "go-common/library/net/rpc/warden/examples/client",
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
"//library/ecode:go_default_library",
|
||||
"//library/net/rpc/warden:go_default_library",
|
||||
"//library/net/rpc/warden/proto/testproto:go_default_library",
|
||||
"//vendor/github.com/pkg/errors:go_default_library",
|
||||
"@com_github_golang_protobuf//ptypes:go_default_library_gen",
|
||||
"@io_bazel_rules_go//proto/wkt:any_go_proto",
|
||||
],
|
||||
)
|
||||
|
||||
filegroup(
|
||||
name = "package-srcs",
|
||||
srcs = glob(["**"]),
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:private"],
|
||||
)
|
||||
|
||||
filegroup(
|
||||
name = "all-srcs",
|
||||
srcs = [":package-srcs"],
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
48
library/net/rpc/warden/examples/client/client.go
Normal file
48
library/net/rpc/warden/examples/client/client.go
Normal file
@ -0,0 +1,48 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"flag"
|
||||
"fmt"
|
||||
|
||||
"go-common/library/ecode"
|
||||
"go-common/library/net/rpc/warden"
|
||||
pb "go-common/library/net/rpc/warden/proto/testproto"
|
||||
|
||||
"github.com/golang/protobuf/ptypes"
|
||||
"github.com/golang/protobuf/ptypes/any"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
// usage: ./client -grpc.target=test.service=127.0.0.1:8080
|
||||
func main() {
|
||||
flag.Parse()
|
||||
conn, err := warden.NewConn("discovery://d/test.service?t=t&cluster=asdasd")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
cli := pb.NewGreeterClient(conn)
|
||||
normalCall(cli)
|
||||
errDetailCall(cli)
|
||||
}
|
||||
|
||||
func normalCall(cli pb.GreeterClient) {
|
||||
reply, err := cli.SayHello(context.Background(), &pb.HelloRequest{Name: "tom", Age: 23})
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
fmt.Println("get reply:", *reply)
|
||||
}
|
||||
|
||||
func errDetailCall(cli pb.GreeterClient) {
|
||||
_, err := cli.SayHello(context.Background(), &pb.HelloRequest{Name: "err_detail_test", Age: 12})
|
||||
if err != nil {
|
||||
any := errors.Cause(err).(ecode.Codes).Details()[0].(*any.Any)
|
||||
var re pb.HelloReply
|
||||
err := ptypes.UnmarshalAny(any, &re)
|
||||
if err == nil {
|
||||
fmt.Printf("cli.SayHello get error detail!detail:=%v", re)
|
||||
}
|
||||
return
|
||||
}
|
||||
}
|
41
library/net/rpc/warden/examples/grpcDebug/BUILD
Normal file
41
library/net/rpc/warden/examples/grpcDebug/BUILD
Normal file
@ -0,0 +1,41 @@
|
||||
package(default_visibility = ["//visibility:public"])
|
||||
|
||||
load(
|
||||
"@io_bazel_rules_go//go:def.bzl",
|
||||
"go_library",
|
||||
"go_binary",
|
||||
)
|
||||
|
||||
go_library(
|
||||
name = "go_default_library",
|
||||
srcs = ["client.go"],
|
||||
importpath = "go-common/library/net/rpc/warden/examples/grpcDebug",
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
"@com_github_gogo_protobuf//jsonpb:go_default_library",
|
||||
"@org_golang_google_grpc//:go_default_library",
|
||||
"@org_golang_google_grpc//credentials:go_default_library",
|
||||
"@org_golang_google_grpc//encoding:go_default_library",
|
||||
],
|
||||
)
|
||||
|
||||
filegroup(
|
||||
name = "package-srcs",
|
||||
srcs = glob(["**"]),
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:private"],
|
||||
)
|
||||
|
||||
filegroup(
|
||||
name = "all-srcs",
|
||||
srcs = [":package-srcs"],
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
||||
|
||||
go_binary(
|
||||
name = "grpcDebug",
|
||||
embed = [":go_default_library"],
|
||||
tags = ["automanaged"],
|
||||
)
|
103
library/net/rpc/warden/examples/grpcDebug/client.go
Normal file
103
library/net/rpc/warden/examples/grpcDebug/client.go
Normal file
@ -0,0 +1,103 @@
|
||||
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
|
||||
}
|
1
library/net/rpc/warden/examples/grpcDebug/data.json
Normal file
1
library/net/rpc/warden/examples/grpcDebug/data.json
Normal file
@ -0,0 +1 @@
|
||||
{"name":"xia","age":19}
|
45
library/net/rpc/warden/examples/server/BUILD
Normal file
45
library/net/rpc/warden/examples/server/BUILD
Normal file
@ -0,0 +1,45 @@
|
||||
package(default_visibility = ["//visibility:public"])
|
||||
|
||||
load(
|
||||
"@io_bazel_rules_go//go:def.bzl",
|
||||
"go_binary",
|
||||
"go_library",
|
||||
)
|
||||
|
||||
go_binary(
|
||||
name = "server",
|
||||
embed = [":go_default_library"],
|
||||
tags = ["automanaged"],
|
||||
)
|
||||
|
||||
go_library(
|
||||
name = "go_default_library",
|
||||
srcs = ["main.go"],
|
||||
importpath = "go-common/library/net/rpc/warden/examples/server",
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
"//library/ecode:go_default_library",
|
||||
"//library/ecode/pb:go_default_library",
|
||||
"//library/log:go_default_library",
|
||||
"//library/net/rpc/warden:go_default_library",
|
||||
"//library/net/rpc/warden/proto/testproto:go_default_library",
|
||||
"//library/time:go_default_library",
|
||||
"@com_github_golang_protobuf//ptypes:go_default_library_gen",
|
||||
"@org_golang_google_grpc//:go_default_library",
|
||||
],
|
||||
)
|
||||
|
||||
filegroup(
|
||||
name = "package-srcs",
|
||||
srcs = glob(["**"]),
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:private"],
|
||||
)
|
||||
|
||||
filegroup(
|
||||
name = "all-srcs",
|
||||
srcs = [":package-srcs"],
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
108
library/net/rpc/warden/examples/server/main.go
Normal file
108
library/net/rpc/warden/examples/server/main.go
Normal file
@ -0,0 +1,108 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"os/signal"
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
"go-common/library/ecode"
|
||||
epb "go-common/library/ecode/pb"
|
||||
"go-common/library/log"
|
||||
"go-common/library/net/rpc/warden"
|
||||
pb "go-common/library/net/rpc/warden/proto/testproto"
|
||||
xtime "go-common/library/time"
|
||||
|
||||
"github.com/golang/protobuf/ptypes"
|
||||
"google.golang.org/grpc"
|
||||
)
|
||||
|
||||
type helloServer struct {
|
||||
addr string
|
||||
}
|
||||
|
||||
func (s *helloServer) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
|
||||
if in.Name == "err_detail_test" {
|
||||
any, _ := ptypes.MarshalAny(&pb.HelloReply{Success: true, Message: "this is test detail"})
|
||||
err := epb.From(ecode.AccessDenied)
|
||||
err.ErrDetail = any
|
||||
return nil, err
|
||||
}
|
||||
return &pb.HelloReply{Message: fmt.Sprintf("hello %s from %s", in.Name, s.addr)}, nil
|
||||
}
|
||||
|
||||
func (s *helloServer) StreamHello(ss pb.Greeter_StreamHelloServer) error {
|
||||
for i := 0; i < 3; i++ {
|
||||
in, err := ss.Recv()
|
||||
if err == io.EOF {
|
||||
return nil
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
ret := &pb.HelloReply{Message: "Hello " + in.Name, Success: true}
|
||||
err = ss.Send(ret)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func runServer(addr string) *warden.Server {
|
||||
server := warden.NewServer(&warden.ServerConfig{
|
||||
//服务端每个请求的默认超时时间
|
||||
Timeout: xtime.Duration(time.Second),
|
||||
})
|
||||
server.Use(middleware())
|
||||
pb.RegisterGreeterServer(server.Server(), &helloServer{addr: addr})
|
||||
go func() {
|
||||
err := server.Run(addr)
|
||||
if err != nil {
|
||||
panic("run server failed!" + err.Error())
|
||||
}
|
||||
}()
|
||||
return server
|
||||
}
|
||||
|
||||
func main() {
|
||||
log.Init(&log.Config{Stdout: true})
|
||||
server := runServer("0.0.0.0:8080")
|
||||
signalHandler(server)
|
||||
}
|
||||
|
||||
//类似于中间件
|
||||
func middleware() grpc.UnaryServerInterceptor {
|
||||
return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) {
|
||||
//记录调用方法
|
||||
log.Info("method:%s", info.FullMethod)
|
||||
//call chain
|
||||
resp, err = handler(ctx, req)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
func signalHandler(s *warden.Server) {
|
||||
var (
|
||||
ch = make(chan os.Signal, 1)
|
||||
)
|
||||
signal.Notify(ch, syscall.SIGHUP, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT)
|
||||
for {
|
||||
si := <-ch
|
||||
switch si {
|
||||
case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT:
|
||||
log.Info("get a signal %s, stop the consume process", si.String())
|
||||
ctx, cancel := context.WithTimeout(context.Background(), time.Second*3)
|
||||
defer cancel()
|
||||
//gracefully shutdown with timeout
|
||||
s.Shutdown(ctx)
|
||||
return
|
||||
case syscall.SIGHUP:
|
||||
default:
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user