码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 如何实现流量控制和熔断降级?


    合集 - Golang学习(55)
    1.iota简介07-102.go generate命令简介07-113.golang uuid库介绍07-244.gRPC基本教程07-255.protolator简介07-316.Govulncheck v1.0.0 发布了!08-037.每日一库:GORM简介08-078.Go泛型简介08-099.Go 1.21发布!08-1010.Golang zip压缩文件读写操作2020-12-2311.本地搭建playground2021-01-1712.zap自定义日志级别02-0913.Gorm日志设置02-0914.gin启动https支持2022-11-3015.Go Plugin介绍2021-12-1416.Golang漏洞管理07-3017.可以丢掉123456了07-0418.如何优雅地退出程序06-2719.PGO前瞻06-2520.go多版本管理05-1621.openAI发布v0.2.0了05-1122.Gin中间件开发08-1123.Fabric区块链浏览器(1)08-1524.每日一库:Memcache08-1725.protojson简介08-1826.每日一库:gosec08-2127.Fabric区块链浏览器(2)08-2228.每日一库:fsnotify简介08-2629.gRPC with JWT08-2730.embed简介08-2931.Fabric区块链浏览器(3)08-3032.每日一库:pprof简介09-0133.go 1.21:cmp09-0234.完全可复制、经过验证的 Go 工具链09-0535.PGO in Go 1.2109-0936.Fabric 2.x 智能合约开发记录09-1037.为不断增长的Go生态系统扩展gopls09-1138.每日一库:lumberjack -- 日志轮换和管理09-1439.2023-04-26-微信安全模式下消息解析09-1440.WASI support in Go09-1541.每日一库:Prometheus09-17
    42.如何实现流量控制和熔断降级?09-18
    43.消息队列 - RabbitMQ09-1944.Go 1.22 中的 For 循环09-2245.设计模式之单例模式09-2346.每日一库:使用Viper处理Go应用程序的配置09-2547.使用 gopkg.in/yaml.v3 解析 YAML 数据09-2648.在Go中如何实现并发09-2849.解析类型参数10-0450.设计模式之工厂模式10-0651.每日一库:cobra 简介10-0752.slices in Go 1.2110-0853.go defer简介10-1354.slice简介10-2055.Golang Map底层实现简述10-22
    收起

    Sentinel

    Sentinel 是阿里巴巴开源的一款高可用性和流量控制的分布式系统。它最初是为了解决阿里巴巴内部的微服务架构中的流量控制和熔断降级问题而开发的。Sentinel 旨在提供实时的流量控制、熔断降级、系统负载保护等功能,以保障应用的高可用性和稳定性。以下是 Sentinel 的详细介绍:

    特点和优势

    1. 流量控制: Sentinel 允许你定义不同资源(如接口、方法等)的流量控制规则,包括 QPS(每秒请求数)、线程数、并发度等。这使得你可以限制不同资源的访问速率,防止流量暴增导致系统崩溃。
    2. 实时监控: Sentinel 提供了实时的监控和统计信息,包括资源的流量、响应时间、错误率等。你可以使用可视化的监控界面查看这些数据,帮助你快速识别和解决问题。
    3. 熔断降级: Sentinel 支持熔断降级机制,当某个资源的错误率或响应时间超过阈值时,可以自动触发熔断,停止对该资源的请求,避免对依赖资源的连锁故障。
    4. 系统负载保护: Sentinel 可以根据系统负载情况动态调整流量控制规则,以保护系统免受过大的负载压力。
    5. 热点参数流控: Sentinel 允许你定义基于参数的流量控制规则,这意味着你可以根据请求中的参数来限制某些特定请求的访问。
    6. 支持多种应用场景: Sentinel 不仅适用于微服务架构中的流量控制,还适用于任何需要保护和稳定应用程序的场景,包括分布式系统、消息队列、数据库访问等。

    Sentinel 架构

    Sentinel 由以下核心组件组成:

    1. Resource(资源): 资源是 Sentinel 中的基本单位,可以是应用程序中的任何可监控和可控制的对象,如接口、方法等。
    2. Flow Control Rules(流量控制规则): 流量控制规则用于定义如何控制资源的访问。规则可以设置 QPS、线程数、并发度等限制,并可以根据需要进行动态调整。
    3. Metrics(监控指标): Sentinel 收集有关资源的实时性能数据,如流量、响应时间、错误率等。这些数据用于监控和统计。
    4. Rule Manager(规则管理器): 规则管理器负责管理和维护流量控制规则。它可以根据需要动态添加、删除或修改规则。
    5. Controller(控制器): 控制器是 Sentinel 的核心组件,负责实施流量控制和熔断降级策略。当资源的请求达到阈值时,控制器会拒绝请求或触发熔断。
    6. Dashboard(仪表板): Sentinel 提供了一个可视化的仪表板,用于实时监控和管理流量控制规则、资源性能等。仪表板使用户能够更容易地了解系统的状态。

    Sentinel 工作流程

    1. 规则配置: 用户配置流量控制规则,定义哪些资源需要流量控制,以及控制规则的具体参数和阈值。
    2. 资源监控: Sentinel 监控各个资源的流量、响应时间、错误率等性能数据。这些数据会在仪表板中实时可视化展示。
    3. 流量控制: 控制器根据规则和资源的性能数据,决定是否拒绝请求或触发熔断。这确保了资源的访问速率受到控制。
    4. 警报和通知: Sentinel 支持警报功能,当某个资源的性能数据超过预定义的阈值时,可以触发警报并通知相关人员。
    5. 动态调整: 根据监控数据,规则管理器可以动态调整流量控制规则,以适应系统的负载变化。

    Sentinel 使用场景

    Sentinel 是一个流量控制和熔断降级库,它可以应用于各种不同的使用场景,以保护你的应用程序免受突发流量激增、资源竞争、错误率上升等问题的影响。以下是一些 Sentinel 的主要使用场景:

    1. API 限流和防刷单: Sentinel 可以用于对公共 API 或接口进行限流,以防止滥用和恶意攻击。你可以根据接口的访问频率和请求来源设置流量控制规则。
    2. 服务保护: 在微服务架构中,当某个服务被频繁访问或异常请求导致错误率上升时,Sentinel 可以用于限制对该服务的访问,以保护它免受过多的请求和错误的影响。
    3. 熔断降级: Sentinel 提供了熔断降级功能,可以在服务不稳定或异常时自动停止向该服务发出请求,防止错误的蔓延,并在服务恢复正常后逐渐恢复请求。
    4. 负载均衡: 你可以使用 Sentinel 在多个实例或服务之间实现负载均衡。当某个实例的负载较高时,可以将流量引导到其他可用实例,以分摊负载并提高可用性。
    5. 慢速请求降级: Sentinel 可以检测到处理时间过长的请求,并自动降级或拒绝这些请求,以确保快速响应其他请求。
    6. 资源池管理: 当多个请求竞争有限资源(例如数据库连接或线程池)时,Sentinel 可以帮助你控制资源的分配和使用,以防止资源耗尽和拥塞。
    7. 实时监控和统计: Sentinel 提供了实时监控和统计功能,你可以通过 Sentinel 控制台查看应用程序的性能指标、错误率和流量等信息,以便及时发现问题并进行调整。
    8. 动态配置: Sentinel 允许你在运行时动态修改流量控制规则和熔断策略,而无需重启应用程序,从而使你可以根据实际情况进行调整和优化。
    9. 防御漏洞攻击: Sentinel 可以用于检测和防御一些常见的漏洞攻击,如暴力破解、SQL 注入等。
    10. 限制后端服务调用: 在微服务架构中,可以使用 Sentinel 控制对后端服务的调用频率,以防止过多的请求导致后端服务不稳定。

    以上只是 Sentinel 的一些常见使用场景。它是一个灵活的库,可以根据你的应用程序需求进行定制和扩展。无论是保护应用程序免受不稳定的外部影响,还是优化资源利用率和性能,Sentinel 都是一个有用的工具。

    在 golang 中使用 Sentinel

    在 Go 中使用 Sentinel 进行流量控制和熔断降级是相对简单的,以下是详细的步骤:

    步骤 1:安装 Sentinel

    首先,你需要安装 Sentinel Go 客户端库。你可以使用 Go Modules 进行依赖管理,在你的 Go 项目中添加以下导入语句:

    import (
    "github.com/alibaba/sentinel-golang/api"
    "github.com/alibaba/sentinel-golang/core/base"
    "github.com/alibaba/sentinel-golang/core/config"
    "github.com/alibaba/sentinel-golang/logging"
    )

    然后使用 go get 命令获取 Sentinel 库:

    go get github.com/alibaba/sentinel-golang@latest

    步骤 2:初始化 Sentinel

    在你的应用程序启动时,需要初始化 Sentinel。这通常在 main 函数中完成。你可以设置 Sentinel 的一些全局配置,例如日志级别、自定义错误页面等:

    func main() {
    // 初始化 Sentinel
    err := sentinel.InitWithConfig(&config.Config{
    // 配置日志级别
    LoggingLevel: logging.Info,
    // 配置 Sentinel 控制台地址(可选)
    ConsoleServer: "127.0.0.1:8181",
    })
    if err != nil {
    // 处理初始化错误
    panic(err)
    }
    // 启动你的应用程序
    // ...
    }

    步骤 3:定义资源

    在 Sentinel 中,资源是你想要保护的对象,可以是接口、方法、HTTP 路由等。你需要为你的资源定义流量控制规则。假设你要保护一个函数 myFunction:

    func myFunction() {
    // 你的业务逻辑
    }

    你可以定义一个 Sentinel 资源,如下所示:

    resourceName := "myFunction"

    步骤 4:定义流量控制规则

    你可以在初始化代码中定义流量控制规则,以控制资源的访问速率。例如,你可以设置每秒允许的最大请求数量:

    // 定义流量控制规则
    _, err := api.LoadRules([]*base.Rule{
    {
    Resource: resourceName,
    MetricType: base.QPS,
    Count: 100, // 允许的最大 QPS
    ControlBehavior: base.Reject, // 超出限制后的处理行为
    },
    })
    if err != nil {
    // 处理规则加载错误
    panic(err)
    }

    步骤 5:使用 Sentinel 进行流量控制

    现在,你可以在 myFunction 函数中使用 Sentinel 进行流量控制。在函数的入口处,你需要创建一个 Sentinel 上下文,并检查是否允许继续执行:

    func myFunction() {
    // 创建 Sentinel 上下文
    entry, err := api.Entry(resourceName)
    if err != nil {
    // 处理创建上下文错误
    panic(err)
    }
    // 在函数返回时离开 Sentinel 上下文
    defer entry.Exit()
    // 如果流量控制规则限制了请求,则执行相应的处理
    if entry != nil && entry.Status == base.Block {
    // 请求被阻止,可以返回自定义响应或执行其他操作
    fmt.Println("请求被阻止")
    return
    }
    // 正常处理逻辑
    // ...
    }

    这样,当 myFunction 函数被频繁调用并超出规则中定义的 QPS 限制时,Sentinel 将自动拒绝一部分请求,以保护你的应用程序免受过多流量的压力。

    这只是 Sentinel 的基本用法,你还可以根据需要定义更复杂的流量控制规则和熔断降级策略。另外,Sentinel 还提供了实时监控和统计功能,可以通过 Sentinel 控制台进行查看和管理。这使得你可以更好地了解你的应用程序的性能和健康状态。


    孟斯特

    声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
    Author: mengbin
    blog: mengbin
    Github: mengbin92
    cnblogs: 恋水无意


  • 相关阅读:
    SPDX规范详解
    使用docker搭建owncloud && Harbor && 构建镜像
    Vulhub靶场环境搭建
    【K8S】GitLab CI 整合 Harbor 和 Nexus
    中缀表达式转后缀表达式(逆波兰式)
    在 emacs 中如何将窗口的垂直分割改为水平分割
    【c++】刷题常用技巧
    SpringBoot2.0(Lombok,SpringBoot统一返回封装)
    基础软件照搬开源不可取,自力更生才是正途
    maven运行乱码,控制台运行乱码 idea,非法字符: ‘\ufeff‘需要class, interface或enum
  • 原文地址:https://www.cnblogs.com/lianshuiwuyi/p/17710790.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号