spring cloud 限流熔断配置

springcloud 微服务网关

zuul.strip-prefix=true
zuul.routes.postgres-client.path =/ps01/**
zuul.routes.postgres-client.service-id=postgres-client
zuul.routes.postgres-client02.path=/ps02/**
zuul.routes.postgres-client02.service-id=postgres-client02
zuul.semaphore.max-semaphores=100
zuul.ribbon-isolation-strategy=semaphore

@Component
public class MyRateLimiter extends ZuulFilter {

    //  令牌桶
    static RateLimiter rateLimiter
            = RateLimiter.create(8, 2, TimeUnit.SECONDS);

    @Override
    public String filterType() {
        return PRE_TYPE;
    }

    @Override
    public int filterOrder() {
        return SERVLET_DETECTION_FILTER_ORDER - 1;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public Object run() throws ZuulException {
        RequestContext context = RequestContext.getCurrentContext();
        boolean allowed = rateLimiter.tryAcquire();
        if (!allowed) {
            context.setSendZuulResponse(false);
            context.setResponseStatusCode(501);
        }
        return null;
    }
}
ribbon.eureka.enabled=true
ribbon.ReadTimeout = 10000
ribbon.ConnectTimeout= 10000
ribbon.MaxAutoRetries= 0
ribbon.MaxAutoRetriesNextServer=1
ribbon.OkToRetryOnAllOperations=false
spring.cloud.sentinel.transport.port=8719
spring.cloud.sentinel.transport.dashboard=192.168.1.4:8080
nacos-gateway.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
spring.cloud.gateway.discovery.locator.enabled=true
spring.cloud.gateway.routes[0].id=order-servicespring.cloud.gateway.routes[0].predicates[0]=Path=/order/**
spring.cloud.gateway.routes[0].uri=lb://order-service
spring.cloud.gateway.redis-rate-limiter.include-headers=true
spring.cloud.gateway.routes[0].filters[0]=RewritePath=/order(?<segment>/?.*), $\{segment}

spring.cloud.gateway.routes[0].filters[0].name=RequestRateLimiter
# 如果返回的key是空的话,则不进行限流
spring.cloud.gateway.routes[0].filters[0].args[0]=deny-empty-key=false
# 每秒产生多少个令牌
spring.cloud.gateway.routes[0].filters[0].args[1]=redis-rate-limiter.replenishRate=0
  # 1秒内最大的令牌,即在1s内可以允许的突发流程,设置为0,表示阻止所有的请求
spring.cloud.gateway.routes[0].filters[0].args[2]=redis-rate-limiter.burstCapacity=0
  # 每次请求申请几个令牌

spring.cloud.gateway.routes[0].filters[0].args[3]=redis-rate-limiter.requestedTokens=0
# 自定义限流规则
spring.cloud.gateway.routes[0].filters[0].args[0]=rate-limiter="#{@defaultGatewayRateLimiter}"
# 返回限流的key
spring.cloud.gateway.routes[0].filters[0].args[1]=key-resolver="#{@defaultGatewayKeyResolver}"
spring.cloud.gateway.routes[0].filters[0].args[2]=deny-empty-key=false
# 限流后向客户端返回的响应码429,请求太多
spring.cloud.gateway.routes[0].filters[0].args[3]=status-code=TOO_MANY_REQUESTS
# 每次请求申请几个令牌  default-gateway-rate-limiter 的值是在 defaultGatewayRateLimiter 中定义的
spring.cloud.gateway.routes[0].filters[0].args[4]=default-gateway-rate-limiter.requestedTokens=1

1.使用hystrix

@HystrixCommand(
        commandKey = "saveStudent",
        commandProperties = {
                @HystrixProperty(name="execution.isolation.strategy",value = "THREAD")
        },
        threadPoolKey = "saveStudent",
        threadPoolProperties = {
                @HystrixProperty(name= CORE_SIZE,value = "3"),
                @HystrixProperty(name= MAX_QUEUE_SIZE,value = "5"),
                @HystrixProperty(name= QUEUE_SIZE_REJECTION_THRESHOLD,value = "7"),
                @HystrixProperty(name = CIRCUIT_BREAKER_ENABLED, value = "true"),// 是否开启断路器
                @HystrixProperty(name = CIRCUIT_BREAKER_REQUEST_VOLUME_THRESHOLD, value = "10"),// 请求次数
                @HystrixProperty(name = CIRCUIT_BREAKER_SLEEP_WINDOW_IN_MILLISECONDS, value = "10000"), // 时间窗口期
                @HystrixProperty(name = CIRCUIT_BREAKER_ERROR_THRESHOLD_PERCENTAGE, value = "60"),
                @HystrixProperty(name = EXECUTION_ISOLATION_THREAD_TIMEOUT_IN_MILLISECONDS, value = "4000"),
                //统计滚动窗口的持续时间,以毫秒为单位。
                // 该时间用于断路器判断健康度时需要收集信息的持续时间,断路器在收集指标信息的时候会根据设置的时间窗长度拆分成多个“桶”来累计各个度量值,每个“桶”记录一段时间内的采集指标。)
                @HystrixProperty(name = METRICS_ROLLING_STATS_TIME_IN_MILLISECONDS, value = "10000")
        },
        fallbackMethod = "saveStudent"
    )

feign.hystrix.enabled=true
hystrix.threadpool.default.coreSize=100 #并发执行的最大线程数,默认10
hystrix.threadpool.default.maxQueueSize=5  #BlockingQueue的最大队列数,当设为-1,会使用 SynchronousQueue,值为正时使用LinkedBlcokingQueue。该设置只会在初始化时有效,之后不能修改
hystrix.threadpool.default.queueSizeRejectionThreshold=1 #即使maxQueueSize没有达到,达到queueSizeRejectionThreshold该值后,请求也会被拒绝。因为maxQueueSize不能被动态修改,这个参数将允许我们动态设置该值。if maxQueueSize == ?1,该字段将不起作用
hystrix.command.default.execution.isolation.strategy=SEMAPHORE #隔离策略,默认是Thread, 可选Thread|Semaphor
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=1000  #命令执行超时时间,默认1000ms
hystrix.command.default.execution.timeout.enabled=true #执行是否启用超时,默认启用true
hystrix.command.default.execution.isolation.strategy.semaphore.max-semaphores=100

ribbon 的负载均衡测罗

service-B.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
ribbon.eureka.enabled=true
ribbon.ReadTimeout = 10000
ribbon.ConnectTimeout= 10000
ribbon.MaxAutoRetries= 0
ribbon.MaxAutoRetriesNextServer=1
ribbon.OkToRetryOnAllOperations=false

public class GlobalRule implements IRule {

    private ILoadBalancer iLoadBalancer;

    @Override
    public Server choose(Object o) {
        List<Server> servers = iLoadBalancer.getAllServers();
        return servers.get(0);
    }

    @Override
    public void setLoadBalancer(ILoadBalancer iLoadBalancer) {
        this.iLoadBalancer = iLoadBalancer;
    }

    @Override
    public ILoadBalancer getLoadBalancer() {
        return this.iLoadBalancer;
    }
}

sentinel 限流熔断

sentinel 配置

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-apollo</artifactId>
            <version>1.8.0</version>
        </dependency>
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
management.endpoints.web.exposure.include=*
spring.cloud.sentinel.transport.port=8719
spring.cloud.sentinel.transport.dashboard=localhost:8480
feign.sentinel.enabled=true
#spring.cloud.sentinel.datasource.ds.file.file=classpath:flowrule.json
#spring.cloud.sentinel.datasource.ds.file.data-type=json
#spring.cloud.sentinel.datasource.ds2.file.rule-type=flow
spring.cloud.sentinel.datasource.ds2.apollo.namespace-name=application
spring.cloud.sentinel.datasource.ds2.apollo.flow-rules-key=flowRules
spring.cloud.sentinel.datasource.ds2.apollo.default-flow-rule-value=[]
spring.cloud.sentinel.datasource.ds2.apollo.rule-type=flow
@SentinelResource(value = "sayHello",blockHandler ="handleException",blockHandlerClass = ExceptionUtil.class)
Field   说明 默认值
resource   资源名,资源名是限流规则的作用对象
count  限流阈值
grade  限流阈值类型,QPS 或线程数模式  QPS 模式
limitApp   流控针对的调用来源  default,代表不区分调用来源
strategy   判断的根据是资源自身,还是根据其它关联资源 (refResource),还是根据链路入口   根据资源本身
controlBehavior    流控效果(直接拒绝 / 排队等待 / 慢启动模式)  直接拒绝

在Spring Cloud Sentinel中,降级(degrade)是指当资源被大量调用,且每个调用都执行了较长时间,为了保护系统不被打垮,Sentinel会对资源进行降级处理,即停止该资源的访问。降级规则可以通过以下参数进行配置:
Field  说明 默认值
grade:降级规则的级别,分为0(允许),1(警告),2(错误)。
count:触发降级的最小请求数。
timeWindow:时间窗口,单位为毫秒,请求次数在这个时间窗口内达到阈值则触发降级。
minRequestAmount:降级后每分钟允许的最小请求数,用于自动恢复服务。
slowRatioThreshold:慢请求比例阈值,当慢请求比例超过这个值就会进行降级。
statIntervalMs:统计时间窗口,用于计算慢请求比例,单位为毫秒。

flow 规则

[
  {
    "resource": "sayHello",
    "controlBehavior": 0,
    "count": 1,
    "grade": 1,
    "limitApp": "default",
    "strategy": 0
  }
]

 degrade.json

[{
        "resource": "sayHello",
        "count": 100.0,
        "timeWindow": 10,
        "grade": 1,
        "countType": 1
}]

zuul 源码解析

ribbon源码解析

zuul 的四种filterType: pre post error route
  1. 动态路由:route

  2. 流量控制和负载均衡,权限验证:pre

  3. 请求日志记录:post

  4. 异常处理:error

hystrix

gateway 源码解析

sentinel 源码解析

遇到问题解决方式

springcloud 2020.0.3重大改变

当前组件  替代品

Hystrix  Resilience4j

Hystrix Dashboard / Turbine  Micrometer + Monitoring System

Ribbon  Spring Cloud Loadbalancer

Zuul 1    Spring Cloud Gateway

Archaius 1  Spring Boot external config + Spring Cloud Config

以下模块已从spring-cloud-netflix中删除:

spring-cloud-netflix-archaius
spring-cloud-netflix-concurrency-limits
spring-cloud-netflix-core
spring-cloud-netflix-dependencies
spring-cloud-netflix-hystrix
spring-cloud-netflix-hystrix-contract
spring-cloud-netflix-hystrix-dashboard
spring-cloud-netflix-hystrix-stream
spring-cloud-netflix-ribbon
spring-cloud-netflix-sidecar
spring-cloud-netflix-turbine
spring-cloud-netflix-turbine-stream
spring-cloud-netflix-zuul
spring-cloud-starter-netflix-archaius
spring-cloud-starter-netflix-hystrix
spring-cloud-starter-netflix-hystrix-dashboard
spring-cloud-starter-netflix-ribbon
spring-cloud-starter-netflix-turbine
spring-cloud-starter-netflix-turbine-stream
spring-cloud-starter-netflix-zuul
Support for ribbon, hystrix and zuul was removed across the release train projects.                

 获取接口start.spring.io/actuator/info

maven地址Maven Repository: org.mybatis.spring.boot » mybatis-spring-boot-starter » 2.2.2 (mvnrepository.com)

https://start.aliyun.com/

参考文献

Sentinel 流量控制限流框架详解_限流框架sentinel-CSDN博客

在生产环境中使用 Sentinel · alibaba/Sentinel Wiki · GitHub

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/492140.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

密码学之哈希碰撞和生日悖论

哈希碰撞 哈希碰撞是指找到两个不一样的值&#xff0c;它们的哈希值却相同 假设哈希函数的取值空间大小为k &#xff0c;计算次数为n 先算每个值不一样的概率P’ 所以至少两个值相同(即存在哈希碰撞)的概率P为 生日悖论 假设班里有50个人&#xff0c;求班里至少两个人相同…

亚信安慧AntDB:轻松解决数据处理挑战

AntDB一直秉承着“技术生态”的理念&#xff0c;不断进行技术创新和功能增强&#xff0c;以保持与先进数据库系统的竞争力。作为一款致力于提升数据库处理性能和稳定性的系统&#xff0c;AntDB在技术上始终保持敏锐的洞察力&#xff0c;不断汲取国内外先进技术的精华&#xff0…

【C语言】Infiniband驱动__mlx4_init_one函数

一、注释 Linux内核驱动程序中的部分&#xff0c;属于Mellanox网卡驱动mlx4的初始化过程。 // Mellanox 以太网驱动主程序代码 static int __mlx4_init_one(struct pci_dev *pdev, int pci_dev_data,struct mlx4_priv *priv) {int err; // 错误码变量int nvfs[MLX4_MAX_PORTS…

【vue3学习笔记(二)】(第141-143节)初识setup;ref函数_处理基本类型;ref函数_处理对象类型

尚硅谷Vue2.0Vue3.0全套教程丨vuejs从入门到精通 本篇内容对应课程第141-143节 课程 P141节 《初识setup》笔记 1、setup是所有组合式API“表演的舞台”&#xff0c;组件中所用到的所有数据、方法、监视数据、生命周期钩子等都需要配置在setup中。 2、setup的两种返回值&…

【MySQL】4.MySQL日志管理与数据库的备份和恢复

备份的目的只要是为了灾难恢复&#xff0c;备份还可以测试应用&#xff0c;回滚数据&#xff0c;修改和查询历史数据&#xff0c;审计等 日志在备份、恢复中起着重要作用 一、数据库备份的重要性 在生产环境中&#xff0c;数据的安全性至关重要 任何数据丢失都可能产生严重的…

数组的常见算法

数组的常见算法 数值型数组特征值统计 这里的特征值涉及到&#xff1a;平均值、最大值、最小值、总和等 举例1&#xff1a;数组统计&#xff1a;求总和、均值 public class TestArrayElementSum {public static void main(String[] args) {int[] arr {4,5,6,1,9};//求总和、…

Android 性能优化实例分享-内存优化 兼顾效率与性能

背景 项目上线一段时间后,回顾重要页面 保证更好用户体验及生产效率&#xff0c;做了内存优化和下载导出优化&#xff0c;具体效果如最后的一节的表格所示。 下面针对拍摄流程的两个页面 预览页 导出页优化实例进行介绍&#xff1a; 一.拍摄前预览页面优化 预览效果问题 存在…

实时通讯技术实现

实时通讯技术实现 前言 在CS架构中&#xff0c;经常会有实时通信的需求。客户端和服务端建立连接&#xff0c;服务端实时推送数据给客户端。本文介绍几种常见的实现方式&#xff0c;希望能给读者们一点点参考。 实时通讯的主要实现技术 长轮询(Long Polling) WebSocket 服务器发…

搜索(find a way, Pots)

Find a way 思路&#xff1a;这一题看似简单其实不然&#xff0c;有很多特办条件&#xff0c;如果当这个M和Y都在KFC的时候就会导致步数为0 &#xff0c;或者可以这样说&#xff1a;只有两人都能到达才能算入答案。 我们可以使用bfs来写这道题&#xff0c;这不过这道题目不需…

ChatGPT,来一份3·28雷布斯米时捷上市发布会即时发言稿

你新招了一个秘书。上班第一天&#xff0c;你对他说&#xff1a;“3月28号我可能会受邀参加雷老板的米时捷’上市发布会&#xff0c;届时我可能会有十分钟的发言机会&#xff0c;你现在准备一篇演讲稿。” 秘书问你有何指导意见&#xff1f; 你自己都不知说啥子&#xff0c;能…

探秘 RabbitMQ 的设计理念与核心技术要点

目录 一、消息中间件介绍 1.1 消息中间件的作用 二、RabbitMQ 2.1 核心概念 2.2 生产者发送消息过程 2.3 消费者接收消息过程 2.4 RabbitMQ 为何要引入信道(channel) 2.5 消费模式 一、消息中间件介绍 消息队列中间件&#xff08;message queue middleWare, MQ&#xff09;指…

前端发版上线出现白屏问题

目录 路由配置问题资源缓存问题首屏加载过慢 &#xff1a;喂&#xff0c;你的页面白啦&#xff01; 出现上线白屏的问题有很多&#xff0c;如&#xff1a;配置错误、缓存问题、浏览器兼容问题&#xff0c;根据不同情况去解决。 路由配置问题 问题描述&#xff1a; 在vue开发…

ValueError: Cannot load file containing pickled data when allow_pickle=False

问题描述 遇到报错&#xff1a;ValueError: Cannot load file containing pickled data when allow_pickleFalse 解决方案 经过查阅有人说是与numpy的版本有关&#xff0c;但是还是不要轻易改变环境中的版本&#xff0c;不一定哪个地方就会报错。这里放个解决方案&#xff1a;…

【详细讲解yarn的安装和使用】

&#x1f308;个人主页:程序员不想敲代码啊&#x1f308; &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家&#x1f3c6; &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提…

探索MongoDB:发展历程、优势与应用场景

一、MongoDB简介 MongoDB 始于 2007 年&#xff0c;由 Dwight Merriman、Eliot Horowitz 和 Kevin Ryan –&#xff08;DoubleClick 的主理团队&#xff09;共同创立。 DoubleClick 是一家互联网广告公司&#xff08;现隶属于 Google&#xff09;&#xff0c;公司团队开发并利…

数字化转型的密码:传统企业转型路径的深度剖析

引言&#xff1a;数字经济浪潮下的新资产形态 传统行业&#xff0c;如零售、金融、教育等&#xff0c;在如今这场数字化浪潮中&#xff0c;同样需要积极拥抱变革&#xff0c;探索适合自身的转型之路。本文将结合制造业的转型经验&#xff0c;深入探讨传统行…

电脑开机0x0000007B蓝屏怎么办?

电脑开机0x0000007B蓝屏怎么办啊?相信很多用户的电脑都有遇到过蓝屏的问题,最近有用户电脑一开机就蓝屏,并且显示0x0000007B错误代码,原本想通过安全模式进行修复,结果发现安全模式进不去,不知道该怎么解决。这可能与我们的内存或硬盘有关,尝试设置一下硬盘模式,看看是…

嵌入式软件工程师都需要安装哪些软件

文章目录 一、编程软件1.keil2.vscode①Chinese&#xff1a;中文②C/C、C/C Extension Pack③CMake、CMake Tools等代码调试运行的工具④Remote-SSH等&#xff0c;关于远程登录linux服务器的插件 3.Pycharm和Anaconda&#xff0c;用来写python脚本和配置环境&#xff0c;PYQT上…

【Python】搭建 Python 环境

目 录 一.安装 Python二.安装 PyCharm 要想能够进行 Python 开发&#xff0c;就需要搭建好 Python 的环境 需要安装的环境主要是两个部分&#xff1a; 运行环境: Python开发环境: PyCharm 一.安装 Python (1) 找到官方网站 (2) 找到下载页面 选择 “Download for Windows”…

[蓝桥杯 2022 省 A] 求和

[蓝桥杯 2022 省 A] 求和 题目描述 给定 n n n 个整数 a 1 , a 2 , ⋯ , a n a_{1}, a_{2}, \cdots, a_{n} a1​,a2​,⋯,an​, 求它们两两相乘再相加的和&#xff0c;即 S a 1 ⋅ a 2 a 1 ⋅ a 3 ⋯ a 1 ⋅ a n a 2 ⋅ a 3 ⋯ a n − 2 ⋅ a n − 1 a n − 2 ⋅ a…