example/outlier/hello_kitex/client/client.go (68 lines of code) (raw):
package main
import (
"context"
"log"
"time"
"github.com/cloudwego/kitex-examples/hello/kitex_gen/api"
"github.com/cloudwego/kitex-examples/hello/kitex_gen/api/hello"
"github.com/cloudwego/kitex/client"
etcd "github.com/kitex-contrib/registry-etcd"
sentinel "github.com/alibaba/sentinel-golang/api"
"github.com/alibaba/sentinel-golang/core/circuitbreaker"
"github.com/alibaba/sentinel-golang/core/outlier"
"github.com/alibaba/sentinel-golang/pkg/adapters/kitex"
)
func initOutlierClient() hello.Client {
resolver, err := etcd.NewEtcdResolver([]string{"127.0.0.1:2379"})
if err != nil {
log.Fatal(err)
}
c, err := hello.NewClient("example.helloworld",
client.WithResolver(kitex.OutlierClientResolver(resolver)),
client.WithMiddleware(kitex.SentinelClientMiddleware(
kitex.WithEnableOutlier(func(ctx context.Context) bool {
return true
}))),
)
if err != nil {
log.Fatal(err)
}
return c
}
func main() {
c := initOutlierClient()
err := sentinel.InitDefault()
if err != nil {
log.Fatal(err)
}
_, err = outlier.LoadRules([]*outlier.Rule{
{
Rule: &circuitbreaker.Rule{
Resource: "example.helloworld",
Strategy: circuitbreaker.ErrorCount,
RetryTimeoutMs: 3000,
MinRequestAmount: 1,
StatIntervalMs: 1000,
Threshold: 1.0,
},
EnableActiveRecovery: true,
MaxEjectionPercent: 1.0,
RecoveryIntervalMs: 2000,
MaxRecoveryAttempts: 5,
},
})
if err != nil {
log.Fatal(err)
}
passCount, testCount := 0, 200
req := &api.Request{Message: "Bob"}
for i := 0; i < testCount; i++ {
resp, err := c.Echo(context.Background(), req)
log.Println(resp, err)
if err == nil {
passCount++
}
time.Sleep(500 * time.Millisecond)
}
log.Printf("Results: %d out of %d requests were successful\n", passCount, testCount)
}