Need help with grpc-wrapper?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

g4zhuj
147 Stars 40 Forks 20 Commits 1 Opened issues

Description

wrapper of grpc

Services available

!
?

Need anything else?

Contributors list

No Data

grpc-wrapper

详细实现文档见 docs

grpc的封装扩展,集成通用的组件,形成一个微服务通讯框架.

1.支持的扩展

  • 服务注册与发现 etcd [OK]

  • 结构化日志 zap [OK]

  • 服务调用链追踪 zipkin [OK] jaeger [OK]

  • 服务指标监控 falcon-plus [TODO]

2.使用方式

client端

package main

import ( "context" "io" "os" "time"

"google.golang.org/grpc"
"google.golang.org/grpc/grpclog"

"github.com/g4zhuj/grpc-wrapper/config"
"github.com/g4zhuj/grpc-wrapper/plugins"
opentracing "github.com/opentracing/opentracing-go"
jaeger "github.com/uber/jaeger-client-go"
jaegerCfg "github.com/uber/jaeger-client-go/config"

pb "google.golang.org/grpc/examples/helloworld/helloworld"

)

const ( serviceName = "HelloClient" servName = "HelloServer" )

//NewJaegerTracer New Jaeger for opentracing func NewJaegerTracer(serviceName string) (tracer opentracing.Tracer, closer io.Closer, err error) { cfg := jaegerCfg.Configuration{ Sampler: &jaegerCfg.SamplerConfig{ Type: "const", Param: 1, }, Reporter: &jaegerCfg.ReporterConfig{ LogSpans: true, BufferFlushInterval: 1 * time.Second, LocalAgentHostPort: "192.168.1.105:6831", }, } tracer, closer, err = cfg.New( serviceName, jaegerCfg.Logger(jaeger.StdLogger), ) //defer closer.Close()

if err != nil {
    return
}
opentracing.SetGlobalTracer(tracer)
return

}

func main() {

//service discovery
cfg := config.RegistryConfig{
    Endpoints: []string{"http://127.0.0.1:2379"},
}
r, err := cfg.NewResolver()
if err != nil {
    grpclog.Errorf("new registry err %v \n", err)
    return
}
b := grpc.RoundRobin(r)

//set logger
logcfg := config.LoggerConfig{
    Level: "debug",
}
grpclog.SetLoggerV2(logcfg.NewLogger())

dialOpts := []grpc.DialOption{grpc.WithTimeout(time.Second * 3), grpc.WithBalancer(b), grpc.WithInsecure(), grpc.WithBlock()}

//open tracing
tracer, _, err := NewJaegerTracer(serviceName)
if err != nil {
    grpclog.Errorf("new tracer err %v , continue", err)
}
if tracer != nil {
    dialOpts = append(dialOpts, grpc.WithUnaryInterceptor(plugins.OpenTracingClientInterceptor(tracer)))
}

//time.Sleep(time.Second * 1)
conn, err := grpc.Dial(servName, dialOpts...)
if err != nil {
    grpclog.Errorf("Dial err %v\n", err)
    return
}

defer conn.Close()
c := pb.NewGreeterClient(conn)

// Contact the server and print out its response.
name := "defaultName"
if len(os.Args) > 1 {
    name = os.Args[1]
}

rsp, err := c.SayHello(context.Background(), &pb.HelloRequest{Name: name})
if err != nil {
    grpclog.Errorf("could not greet: %v", err)
}
grpclog.Infof("Greeting: %s", rsp.Message)
time.Sleep(time.Second * 2)

}

server端

package main

import ( "context" "fmt" "io" "time"

"google.golang.org/grpc"
"google.golang.org/grpc/grpclog"

"github.com/g4zhuj/grpc-wrapper/config"
"github.com/g4zhuj/grpc-wrapper/plugins"
opentracing "github.com/opentracing/opentracing-go"
jaeger "github.com/uber/jaeger-client-go"
jaegerCfg "github.com/uber/jaeger-client-go/config"
pb "google.golang.org/grpc/examples/helloworld/helloworld"

)

const ( serviceName = "HelloServer" )

type grpcserver struct{}

// SayHello implements helloworld.GreeterServer func (s *grpcserver) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) { grpclog.Infof("receive req : %v \n", *in)

//start a new span, eg.(mysql)
if parent := opentracing.SpanFromContext(ctx); parent != nil {
    pctx := parent.Context()
    if tracer := opentracing.GlobalTracer(); tracer != nil {
        mysqlSpan := tracer.StartSpan("FindUserTable", opentracing.ChildOf(pctx))

        //do mysql operations
        time.Sleep(time.Millisecond * 100)

        defer mysqlSpan.Finish()
    }
}

return &pb.HelloReply{Message: "Hello " + in.Name}, nil

}

//NewJaegerTracer New Jaeger for opentracing func NewJaegerTracer(serviceName string) (tracer opentracing.Tracer, closer io.Closer, err error) { cfg := jaegerCfg.Configuration{ Sampler: &jaegerCfg.SamplerConfig{ Type: "const", Param: 1, }, Reporter: &jaegerCfg.ReporterConfig{ LogSpans: true, BufferFlushInterval: 1 * time.Second, LocalAgentHostPort: "192.168.1.105:6831", }, } tracer, closer, err = cfg.New( serviceName, jaegerCfg.Logger(jaeger.StdLogger), ) //defer closer.Close()

if err != nil {
    return
}
opentracing.SetGlobalTracer(tracer)
return

}

func main() {

//set zap logger
logcfg := config.LoggerConfig{}
grpclog.SetLoggerV2(logcfg.NewLogger())

//service register
cfg := config.RegistryConfig{
    Endpoints: []string{"http://127.0.0.1:2379"},
}
reg, err := cfg.NewRegisty()
if err != nil {
    fmt.Printf("new registry err %v \n", err)
    return
}

var servOpts []grpc.ServerOption

//open tracing
tracer, _, err := NewJaegerTracer(serviceName)
if err != nil {
    grpclog.Errorf("new tracer err %v , continue", err)
}
if tracer != nil {
    servOpts = append(servOpts, grpc.UnaryInterceptor(plugins.OpentracingServerInterceptor(tracer)))
}

servConf := config.ServiceConfig{
    ServiceName:       serviceName,
    Binding:           ":1234",
    AdvertisedAddress: "127.0.0.1:1234",
}
servWrapper := servConf.NewServer(reg, servOpts...)
if coreServ := servWrapper.GetGRPCServer(); coreServ != nil {
    pb.RegisterGreeterServer(coreServ, &grpcserver{})
    servWrapper.Start()
}

}

实例

使用示例见examples

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.