package common // default setting: // Transport: grpc // Server: grpc // Client: grpc // RegisterTTL: 30s // RegisterInterval: 20s // Registry: etcd // broker: rabbitmq // Selector: cache // Codec: protobuf // Tracing: jaeger // Metrics: jaeger // breaker: hystrix 注:客户端熔断 // ratelimit: uber/ratelimit import ( "fmt" "github.com/micro/cli" "log" "time" "shop-common/config" //gh "github.com/afex/hystrix-go/hystrix" "github.com/micro/go-micro" "github.com/micro/go-micro/registry" "github.com/micro/go-micro/web" "github.com/micro/go-plugins/registry/etcdv3" "github.com/micro/go-plugins/wrapper/breaker/hystrix" "github.com/micro/go-micro/broker" "github.com/micro/go-plugins/broker/rabbitmq" ratelimit "github.com/micro/go-plugins/wrapper/ratelimiter/uber" "github.com/micro/go-plugins/wrapper/trace/opentracing" ) var ( defaultOpts []micro.Option defaultWebOpts []web.Option defaultServer micro.Option defaultClient micro.Option ) func init() { defaultOpts = []micro.Option{ micro.RegisterTTL(time.Second * 30), micro.RegisterInterval(time.Second * 20), //micro.Transport(http.NewTransport()), } defaultWebOpts = []web.Option{ web.RegisterTTL(time.Second * 30), web.RegisterInterval(time.Second * 20), } //gh.DefaultMaxConcurrent = 100 //gh.DefaultVolumeThreshold = 50 } func GetMicroClient(serviceName string, exOpts ...micro.Option) micro.Service { opts := getOpts(serviceName) if defaultClient != nil { opts = append(opts, defaultClient) } t, _, err := NewJaegerTracer(serviceName, config.TracingConf.Addr) if err != nil { log.Fatalf("opentracing tracer create error:%v", err) } opts = append(opts, micro.WrapClient(hystrix.NewClientWrapper(), //客户端熔断 opentracing.NewClientWrapper(t), //链路追踪 ratelimit.NewClientWrapper(1024))) //限流 opts = append(opts, exOpts...) srv := micro.NewService(opts...) srv.Init() return srv } func GetMicroServer(service string, exOpts ...micro.Option) micro.Service { opts := getOpts(service) fmt.Println("config.BrokerConf.Addrs:", config.BrokerConf.Addrs) brokermq := rabbitmq.NewBroker(func(options *broker.Options) { options.Addrs = config.BrokerConf.Addrs }) if err := brokermq.Connect(); err != nil { log.Fatalf("broker Connect error: %v", err) } t, _, err := NewJaegerTracer(service, config.TracingConf.Addr) if err != nil { log.Fatalf("opentracing tracer create error:%v", err) } opts = append(opts, micro.Broker(brokermq)) opts = append(opts, micro.WrapHandler(opentracing.NewHandlerWrapper(t),//链路追踪 ratelimit.NewHandlerWrapper(1024))) //限流 opts = append(opts, exOpts...) srv := micro.NewService(opts...) srv.Init() return srv } func getOpts(serviceName string) []micro.Option { opts := append([]micro.Option{}, defaultOpts..., ) version := config.ServiceConf.Version if version == "" { version = "latest" } opts = append(opts, micro.Version(version), micro.Name(serviceName)) reg := etcdv3.NewRegistry(func(op *registry.Options) { op.Addrs = config.RegistryConf.Addrs }) opts = append(opts, micro.Registry(reg)) return opts } func GetMicroWeb(serviceName string, exOpts ...web.Option) web.Service { opts := append(exOpts, defaultWebOpts..., ) version := config.ServiceConf.Version if version == "" { version = "latest" } opts = append(opts, web.Version(version), web.Name(serviceName), web.Action(func(ctx *cli.Context) { })) opts = append(opts, web.Registry(etcdv3.NewRegistry(func(op *registry.Options) { op.Addrs = config.RegistryConf.Addrs }))) srv := web.NewService(opts...) srv.Init() return srv }