SpringCloudAlibaba之Sentinel(一)流控篇

这篇具有很好参考价值的文章主要介绍了SpringCloudAlibaba之Sentinel(一)流控篇。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 前言:

为什么使用Sentinel,这是一个高可用组件,为了使我们的微服务高可用而生

我们的服务会因为什么被打垮?

一,流量激增    缓存未预热,线程池被占满 ,无法响应

二,被其他服务拖垮,比如第三方的接口响应慢

三,异常没有处理:缓存击穿,缓存穿透等等

总之而言:系统缺乏可用性防护,没有容错机制,尤其是针对流量的防护会降低服务的可用性

服务雪崩:首先是积分系统服务挂掉了,一个系统不可用,导致整个微服务系统都不可用

SpringCloudAlibaba之Sentinel(一)流控篇,sentinel

 限制流量

熔断

服务的降级   A计划-->B计划   积分服务就是一个弱依赖,和整体的流程关联不大,挂掉了也不会影响什么

有很多组件可以让我们进行流控、熔断、及降级,从中我们选择了SpringCloudAlibaba为我们提供的Sentinel这个组件作为我们项目中的保证服务高可用的组件。

SpringCloudAlibaba之Sentinel(一)流控篇,sentinel

https://github.com/alibaba/spring-cloud-alibaba/wiki

sentinel的说明文档

https://github.com/alibaba/spring-cloud-alibaba/blob/2.2.x/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/readme-zh.md

sentinel的控制台

https://github.com/alibaba/Sentinel/wiki/%E6%8E%A7%E5%88%B6%E5%8F%B0

先了解一下如何接入 Sentinel

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

1. 下载控制台 jar包

https://github.com/alibaba/Sentinel/releases  下载控制台 jar 包。此处下载的是1.8.5

SpringCloudAlibaba之Sentinel(一)流控篇,sentinel

2.启动控制台

Sentinel 控制台是一个标准的 Spring Boot 应用,以 Spring Boot 的方式运行 jar 包即可。

java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.5.jar

注意:下载的版本的区别,不都是1.8.5

启动之后访问ip:8080

SpringCloudAlibaba之Sentinel(一)流控篇,sentinel

 user/pwd sentinel/sentinel

在代码端(客户端):

pom中:

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

 之后在application.yml文件中:主要是:spring.cloud.sentinel.transport.dashboard

server:
  port: 8087
spring:
  application:
    name: order_nacos-sentinel
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
      discovery:
        username: nacos
        password: nacos
        namespace: public
    sentinel:
      transport:
        dashboard: localhost:8080

SpringCloudAlibaba之Sentinel(一)流控篇,sentinel

我们写的服务需要访问一次才能在dashboard中显示

访问了下列地址每个地址一次之后:

http://192.168.50.59:8087/order/getStock

http://192.168.50.59:8087/order/test1

http://192.168.50.59:8087/order/test2

http://192.168.50.59:8087/order/flow

之后,就可以发现:

SpringCloudAlibaba之Sentinel(一)流控篇,sentinel

3.流控(直接流控)

  (1) QPS流控

给getStock设置一个QPS流控:

SpringCloudAlibaba之Sentinel(一)流控篇,sentinel

 设置为1

我们继续访问http://192.168.50.59:8087/order/getStock,连续多点,会出现以下:

SpringCloudAlibaba之Sentinel(一)流控篇,sentinel

 怎么改这个页面呢?

指定的blockHandler方法要求:

1.必须是public的  2.方法返回值必须和源方法相同 3.方法参数和源方法相同,最后一个方法参数是BlockException

SpringCloudAlibaba之Sentinel(一)流控篇,sentinel

 继续快速访问

SpringCloudAlibaba之Sentinel(一)流控篇,sentinel

 这里出现了一个问题:我的程序每次重新启动的时候,流控规则都消失了,因为现在这些规则是存放在内存中的,没有做持久化

(2)线程数流控

也可以说是并发线程数流控

线程数流控和QPS流控有什么区别呢?

以一个为例:

qps为1的话代表每秒只允许有一个请求访问,

并发线程数为1的话,只要有一个线程访问,这个线程没有访问结束,那么其他线程就不能再次访问,测试的时候用睡眠的方式来测试。

@RequestMapping("/flow")
    @SentinelResource(value = "getStock",blockHandler = "flowBlockException")
    public String flow(){
        try {
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        return "QPS流控";
    }

    public String flowBlockException(BlockException e){
        return "并发线程数流控";
    }

 SpringCloudAlibaba之Sentinel(一)流控篇,sentinel

SpringCloudAlibaba之Sentinel(一)流控篇,sentinel

 如果不想用@SentinelResource

那么我们可以写一个类:实现:BlockExceptionHandler

SpringCloudAlibaba之Sentinel(一)流控篇,sentinel

@Component
@Slf4j
public class MyBlockException implements BlockExceptionHandler {
    @Override
    public void handle(HttpServletRequest httpServletRequest
            , HttpServletResponse httpServletResponse, BlockException e) throws Exception {

        if(e instanceof BlockException){
            log.error("被流控了" + e.getRule());
        }else if(e instanceof DegradeException){
            log.error("被降级了" + e.getRule());
        }
        httpServletResponse.getWriter().print(e.getRule());

//        new ObjectMapper().writeValue(httpServletResponse.getWriter(),e.getRule());
    }

流控规则一般在服务的提供方,降级规则设置在服务的消费端。

4.关联流控

SpringCloudAlibaba之Sentinel(一)流控篇,sentinel

 当关联资源1被设置了以后限流以后,限制的不是自己,而是资源2的流控

这里会用到Jmeter这个测试工具,关于JMeter中文的设置(使用之前一定要配置好jdk)

性能测试(2): 测试工具 -- JMeter 安装和中文设置-腾讯云开发者社区-腾讯云

这里多写了一个简单的/add接口

SpringCloudAlibaba之Sentinel(一)流控篇,sentinel

SpringCloudAlibaba之Sentinel(一)流控篇,sentinel

 启动测试计划以后访问:http://127.0.0.1:8087/order/getStock

访问不了,显示被流控了

5.链路流控

   想要使用这个功能,配置文件中,必须设置:spring.cloud.sentinel.web-context-unify 这个属性值默认为true,表示收敛调用链路的。

spring.cloud.sentinel.web-context-unify=false

SpringCloudAlibaba之Sentinel(一)流控篇,sentinel

 要说明的是:进行流控的资源名不一定是controller中的接口,也有可能是service中的方法

controller中:

SpringCloudAlibaba之Sentinel(一)流控篇,sentinel

 service中:


@Service
@Slf4j
public class OrderService {

    @SentinelResource(value = "aa",blockHandler = "aaBlockException")
    public String aa(){
        log.info("测试链路流控...");
        System.out.println("测试链路流控...");
        return "测试链路流控...";
    }

    public String aaBlockException(BlockException e){
        log.error(e.getRule()+" ~~~");
        return "wawawawawwwawa";
    }
}

 SpringCloudAlibaba之Sentinel(一)流控篇,sentinel

 测试的过程中会发现test3接口怎么测试都不会发生变化,test4访问速度过快就会显示wawawawawwwawa

6.流量效果

1.快速失败

2.warm up 预热

    针对激增流量突然涌入进来打垮冷系统,防止缓存击穿。刚开始QPS是(阈值/3) ,经过填写的预热时间增长到阈值

Warm Up(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)方式,即预热/冷启动方式。当系统长期处于低水位的情况下,当流量 突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐 增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮。 冷加载因子: codeFactor 默认是3,即请求 QPS 从 threshold / 3 开始,经预热时长逐渐升至设定的 QPS 阈值。

3.排队等待

    针对脉冲流量

 这种方式主要用于处理间隔性突发的流量,例如消息队列。想象一下这样的场景,在某一秒有大量的请求到来,而接下 来的几秒则处于空闲状态,我们希望系统能够在接下来的空闲期间逐渐处理这些请求,而不是在第一秒直接拒绝多余的 请求。

SpringCloudAlibaba之Sentinel(一)流控篇,sentinel

 文章来源地址https://www.toymoban.com/news/detail-623473.html

到了这里,关于SpringCloudAlibaba之Sentinel(一)流控篇的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Sentinel流控规则

    资源名 :唯一名称,默认请求路径(如:http://localhost:8089/testA) 针对来源:Sentinel可以针对调用者进行限流,填写微服务名,指定对哪个微服务进行限流 ,默认default(不区分来源,全部限制) 阈值类型/单机阈值 : QPS(每秒钟的请求数量)【挡在门外】:当调用该接口的QPS达到了阈

    2023年04月22日
    浏览(33)
  • Sentinel服务熔断和流控

    Sentinel ​ 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式服务架构的流量控制组件,主要以 流量 为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。 源码地址:https://github

    2024年02月09日
    浏览(36)
  • Sentinel限流规则-流控效果

    流控效果是指请求达到流控阈值时应该采取的措施,包括三种: 1.快速失败:达到阈值后,新的请求会被立即拒绝并抛出FlowException异常。是默认的处理方式。 2.warm up:预热模式,对超出阈值的请求同样是拒绝并抛出异常。但这种模式阈值会动态变化,从一个较小值逐渐增加

    2024年01月19日
    浏览(40)
  • Sentinel限流规则支持流控效果

    流控效果是指请求达到流控阈值时应该采取的措施,包括三种: 1.快速失败:达到阈值后,新的请求会被立即拒绝并抛出FlowException异常。是默认的处理方式。 2.warm up:预热模式,对超出阈值的请求同样是拒绝并抛出异常。但这种模式阈值会动态变化,从一个较小值逐渐增加

    2024年01月22日
    浏览(36)
  • SpringCloudAlibaba之Sentinel介绍

    Sentinel 是阿里开源的一款面向分布式、多语言异构化服务架构的流量治理组件。 主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 上面两句话来自 Sentinel 官网的自我介绍

    2024年02月09日
    浏览(39)
  • 【SpringCloudAlibaba】Sentinel使用

    https://github.com/alibaba/Sentinel 中文: https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D https://sentinelguard.io/zh-cn/docs/introduction.html 服务雪崩 服务降级 服务熔断 服务限流 https://github.com/alibaba/Sentinel/releases Sentinel采用的懒加载 直接(默认) 资源名:默认rest路径名 来源:默认 关联 当与

    2024年02月10日
    浏览(37)
  • SpringCloudAlibaba-整合sentinel(四)

    目录地址: SpringCloudAlibaba整合-CSDN博客 这里只关注代码部分,至于sentinel服务UI的实用,后面可以补上 这里做一个改造: 因为sentinel可以和openfeign结合使用,为微服务做熔断降级; 为了方便微服务之间的调用,把远程调用接口移动到api模块; 所以把order中的openfeign和loadbala

    2024年04月11日
    浏览(32)
  • 7.SpringCloudAlibaba 整合 Sentinel

    在分布式系统中,由于网络原因或自身的原因,服务一般无法保证 100%是可用的。如果一个服务出现了问题,调用这个服务就会出现线程阻塞的情况,此时若有大量的请求涌入,就会出现多条线程阻塞等待,进而导致调用服务瘫痪。 由于服务与服务之间的依赖性,故障会进行

    2024年02月10日
    浏览(40)
  • Sentinel + Nacos流控规则持久化配置

    json参数对映sentinel 规则面板      第二步,告诉订单服务读取配置,添加yml配置  

    2024年04月23日
    浏览(29)
  • Sentinel限流--流控模式与限流效果

    簇点链路就是项目内的调用链路(controller - servcie - mapper ),链路中被监控的每个接口就是一个资源。 默认情况下sentinel会监控SpringMVC的每一个端点(Endpoint),Endpoint可以理解为controller中的每一个方法,每一个端点(Endpoint)就是调用链路中的一个资源。 流控、熔断等都是

    2024年02月17日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包