这是我参与「第五届青训营」伴学笔记创作活动的第 2 天
熔断-限流-降级
限流和熔断最终都会导致用户的体验降级
当我们的系统的访问量突然剧增,大量的请求涌入过来,最典型的就是秒杀业务了,我们可能会知道会有一波高峰,这时候该如何处理?
而且现在很多情况我们还需要调用第三方接口例如支付等,因此我们还得考虑如果第三方那边出问题了,返回异常的慢,我们系统该如何处理。
常见的处理方式有三种:降级、熔断、限流。
Sentinel
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。
Sentinel 基本概念
资源
资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。在接下来的文档中,我们都会用资源来描述代码块。
只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。
规则
围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。
使用
我们可以通过 CloudWeGo 开源框架的中间件对其进行使用。
Server
bf := func(ctx context.Context, req, resp interface{}, blockErr error) error {
return errors.New(FakeErrorMsg)
}
srv := hello.NewServer(new(HelloImpl),
server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: "hello"}),
server.WithMiddleware(SentinelServerMiddleware(
WithBlockFallback(bf),
)))
Client
bf := func(ctx context.Context, req, resp interface{}, blockErr error) error {
return errors.New(FakeErrorMsg)
}
c, err := hello.NewClient("hello",
client.WithMiddleware(SentinelClientMiddleware(
WithBlockFallback(bf))))
if err != nil {
t.Fatal(err)
}