example/outlier/hello_micro/client/client.go (75 lines of code) (raw):

package main import ( "context" "log" "time" "github.com/micro/go-micro/v2" "github.com/micro/go-micro/v2/client" "github.com/micro/go-micro/v2/client/selector" "github.com/micro/go-micro/v2/registry" "github.com/micro/go-micro/v2/registry/etcd" sentinel "github.com/alibaba/sentinel-golang/api" "github.com/alibaba/sentinel-golang/core/circuitbreaker" "github.com/alibaba/sentinel-golang/core/outlier" microAdapter "github.com/alibaba/sentinel-golang/pkg/adapters/micro" proto "github.com/alibaba/sentinel-golang/pkg/adapters/micro/test" ) const serviceName = "example.helloworld" const etcdAddr = "127.0.0.1:2379" const version = "latest" func initOutlierClient() client.Client { etcdReg := etcd.NewRegistry(registry.Addrs(etcdAddr)) sel := selector.NewSelector( selector.Registry(etcdReg), selector.SetStrategy(selector.RoundRobin), ) srv := micro.NewService( micro.Name(serviceName), micro.Version(version), micro.Selector(sel), micro.WrapClient(microAdapter.NewClientWrapper( microAdapter.WithEnableOutlier(func(ctx context.Context) bool { return true }))), ) return srv.Client() } func main() { c := initOutlierClient() err := sentinel.InitDefault() if err != nil { log.Fatal(err) } _, err = outlier.LoadRules([]*outlier.Rule{ { Rule: &circuitbreaker.Rule{ Resource: serviceName, Strategy: circuitbreaker.ErrorCount, RetryTimeoutMs: 3000, MinRequestAmount: 1, StatIntervalMs: 1000, Threshold: 1.0, }, EnableActiveRecovery: false, MaxEjectionPercent: 1.0, RecoveryIntervalMs: 2000, MaxRecoveryAttempts: 5, }, }) if err != nil { log.Fatal(err) } passCount, testCount := 0, 200 req := c.NewRequest(serviceName, "Test.Ping", &proto.Request{}, client.WithContentType("application/json")) for i := 0; i < testCount; i++ { rsp := &proto.Response{} err = c.Call(context.Background(), req, rsp) log.Println(rsp, err) if err == nil { passCount++ } time.Sleep(500 * time.Millisecond) } log.Printf("Results: %d out of %d requests were successful\n", passCount, testCount) }