限流中间件 Sentinel | 青训营笔记

105 阅读2分钟

这是我参与「第五届青训营」伴学笔记创作活动的第 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)
}

参考

sentinelguard.io/zh-cn/docs/…

blog.csdn.net/csdnlijingr…

github.com/kitex-contr…