微服务---Spring Cloud Alibaba 04(Sentinel)

【Sentinel入门】03 规则类型与对应抛出异常(BlockException、FlowException、ParamFlowException、DegradeException) 文章目录规则类型blockHandler和blockHandlerClass 相关文章: 【Sentinel入门】02 @SentinelResource语法(blockHandler、fallback、BlockException 、FlowException) 规则类型 BlockException包含很多个子类,分别对应不同的场景: 异常 说明 FlowException 限流异常 ParamFlowException 阅读详情

        在我们日常生活中,经常会在淘宝、天猫、京东、拼多多等平台上参与商品的秒杀、抢购以及一些优惠活动,也会在节假日使用12306 手机APP抢火车票、高铁票,甚至有时候还要帮助同事、朋友为他们家小孩拉投票、刷票,这些场景都无一例外的会引起服务器流量的暴涨,导致网页无法显示、APP反应慢、功能无法正常运转,甚至会引起整个网站的崩溃。
        我们如何在这些业务流量变化无常的情况下,保证各种业务安全运营,系统在任何情况下都不会崩溃呢?我们可以在系统负载过高时,采用限流、降级和熔断,三种措施来保护系统,由此一些流量控制中间件诞生。例如Sentinel。

一、概述

        Sentinel (分布式系统的流量防卫兵) 是阿里开源的一套用于服务容错的综合性解决方案。它以流量为切入点, 从流量控制、熔断降级、系统负载保护等多个维度来保护服务的稳定性。
        Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景, 例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。

两大组成:

  1. Java 客户端:能够运行于所有 Java 运行时环境,同时对Dubbo /Spring Cloud 等框架也有较好的支持。 
  2. 控制台(Dashboard):基于 Spring Boot 开发,打包后可以直接运行。

二、安装

1.Sentinel是一个jar包,我们需要下载并运行这个jar包

Sentinel下载地址

2.在jar包目录下用指定命令运行这个jar包

java -Dserver.port=8180 -Dcsp.sentinel.dashboard.server=localhost:8180 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.0.jar

3.访问8180端口,账号密码默认为sentinel,出现如下页面表示访问成功

 4.这样是不是每次的启动都太麻烦了呢,我们在IDEA里添加脚本快速启动

 第一行是jdk里的bin里的java.exe文件目录

第二行是运行时指定的命令,把前面的java前缀去掉即可

第三行是jar文件所在的目录

添加完成后我们即可在IDEA里快速启动了

三、Sentinel限流

顾名思义,限流就是限制流量

目的:防止恶意请求流量、恶意攻击,或者防止流量超过系统峰值导致系统崩溃。

1.导入pom文件

首先需要导入pom依赖,一般在消费端进行导入

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

//健康监控依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

2.配置配置文件

spring:
  cloud:
    sentinel:
      transport:
         port: 8099 #跟sentinel控制台交流的端口,随意指定一个未使用的端口即可,可以省略
         dashboard: localhost:8180 # 指定sentinel控制台地址。

 3.运行查看

启动服务提供方和服务消费方并随便访问一个url进入Sentinel控制面板进行查看

 监控成功,接下来我们进行流量的限制

4.限流

1.在簇点链路里找到对应的资源名新增流控规则

 

QPS:每秒请求的此时

单机阈值:允许每秒请求的次数

2.每秒超过一次的访问进行测试

限流成功,每秒只能访问一次

3.高级限流---直接模式

 Senntinel默认的流控处理方式就是直接模式

4.高级限流---关联模式

        当关联的资源达到阈值,就限流自己。例如设置了关联资源为/ur2时,假如关联资源/url2的qps阀值超过1时,就限流/url1接口(是不是感觉很霸道,关联资源达到阀值,是本资源接口被限流了)。这种关联模式有什么应用场景呢?我们举个例子,订单服务中会有2个重要的接口,一个是读取订单信息接口,一个是写入订单信息接口。在高并发业务场景中,两个接口都会占用资源,如果读取接口访问过大,就会影响写入接口的性能。业务中如果我们希望写入订单比较重要,要优先考虑写入订单接口。那就可以利用关联模式;在关联资源上面设置写入接口,资源名设置读取接口就行了;这样就起到了优先写入,一旦写入请求多,就限制读的请求。

总结就是一句话,牺牲自己,保全别人

 这时我们开启两个端口服务,疯狂访问Echo2,观察Echo1是否被限制访问

 可以看到疯狂访问2后再次对1进行访问,1被限制访问了

4.高级限流---链路模式

        链路模式只记录指定链路入口的流量。也就是当多个服务对指定资源调用时,假如流量超出了指定阈值,则进行限流。

        说明,流控模式为链路模式时,假如是sentinel 1.7.2以后版本,Sentinel Web过滤器默认会聚合所有URL的入口为sentinel_spring_web_context,因此单独对指定链路限流会不生效,需要在application.yml添加如下语句来关闭URL PATH聚合。

sentinel:
     web-context-unify: false

对指定链路下的路径进行频繁访问报错出现,不在指定链路下的则没事。

注:

限流算法:计数器、令牌桶、漏斗算法,滑动窗口算法

四、Sentinel降级

        除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。由于调用关系的复杂性,如果调用链路中的某个资源不稳定,最终会导致请求发生堆积。
Sentinel 熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断

1.设计慢调用

@Controller
public class Jangji {
    private AtomicLong aLong=new AtomicLong(1);
public void jiangji() throws InterruptedException {
    long num = aLong.getAndIncrement();
    if(num%2==0){
        Thread.sleep(200);//模拟耗时操作
    }
}
}

代码意思是对百分之50的请求延时200毫秒,这里系统设计认为超过200毫秒为慢调用

在Echo1请求里注入调用jiangji方法

2.降级

这里表示熔断策略为慢调用比例,表示链路请求数超过3时,假如平均响应时间假如超过200毫秒的有30%,则对请求进行熔断,熔断时长为10秒钟,10秒以后恢复正常。

3.异常处理

默认降级熔断是返回默认异常,我们可以自定义异常

//自定义限流异常处理对象
//服务被限流或者降级,sentinel底层提供的拦截器会调用此方法进行异常处理
@Component
public class ServiceBlockExceptionHandler implements BlockExceptionHandler {
    @Override
    public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws Exception {
        //1)向客户端输出数据(写数据)用什么?输出流对象
        //2)如何获取输出流对象?(标准的JAVAEE规范中,要借助HttpServletResponse对象)
        //3)当向客户端输出数据时,除了响应业务数据外,还要做什么?
        //设置响应数据的编码
        httpServletResponse.setCharacterEncoding("utf-8");
        //告诉浏览器服务端向它响应的数据类型,以及以什么编码进行显示.
//        httpServletResponse.setContentType("text/html;charset=utf-8");
        /*有多种客户端,不一定是浏览器,还有手机汽车等。。。。,为了兼容所以用统一用json串返回*/
        httpServletResponse.setContentType("application/json;charset=utf-8");
        //响应业务数据
        PrintWriter out=httpServletResponse.getWriter();
        Map<String,Object> map=new HashMap<>();
        map.put("status", 429);
        if(e instanceof DegradeException){//DegradeException降级异常
//            out.println("<h2>服务暂时不可用</h2>");
            map.put("message","服务暂时不可用");
        }else{
//            out.println("<h2>访问太频繁,稍等片刻再访问</h2>");
            map.put("message","访问太频繁,稍等片刻再访问");
        }
        //将map对象转换为json格式字符串
        String jsonStr= new ObjectMapper().writeValueAsString(map);
        out.println(jsonStr);//输出json串
        out.flush();//所有字符流都要刷新

    }
}

五、Sentinel热点规则

热点即经常访问的数据---微博热搜

        热点参数限流会统计传入参数中的热点数据,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。其中,Sentinel会利用 LRU 策略统计最近最常访问的热点参数,结合令牌桶算法来进行参数级别的流控。

1.定义热点业务代码

        @GetMapping("consumer/findById")
        @SentinelResource("res")
        public String doFindById(Integer id,String name){
            return "Resource id is"+id+name;
        }

2.添加要限流的热点链路

参数索引为@SentinelResource注解的方法参数下标,0代表第一个参数,1代表第二个参数。单机阈值以及统计窗口时长表示在此窗口每两秒超过一次访问就限流。

3.热点指定参数限流

热点参数:其实说白了就是特殊的流控,流控设置是针对整个请求的;但是热点参数他可以设置到具体哪个参数,甚至参数针对的值,这样更灵活的进行流控管理。

 对于第一个参数值为5的话,每秒到达100次访问就进行限流,对于其他的值则每秒限制访问一次

六、Sentinel授权规则

        很多时候,我们需要根据调用方来限制资源是否通过,这时候可以使用 Sentinel 的黑白名单控制的功能。黑白名单根据资源的请求来源(origin)限制资源是否通过,若配置白名单则只有请求来源位于白名单内时才可通过;若配置黑名单则请求来源位于黑名单时不通过,其余的请求通过。

1.基于参数

定义请求解析器

//定义一个请求源解析对象,基于此对象对请求中指定数据进行解析
//然后Sentinel底层会对此接口方法的返回值基于规则的定义进行处理
@Component
public class DefaultRequestOriginParser implements RequestOriginParser {
    @Override
    public String parseOrigin(HttpServletRequest request) {
        //获取请求参数数据,参数名可以自己写
        //http://ip:port/path?origin=app1
        return request.getParameter("origin");

}

新增授权规则

带黑名单中的参数进行访问

 加入黑名单成功,app1app2不可访问,其他访问正常,反之则白名单内正常,其他不可访问

2.基于IP地址

定义请求解析器

@Component
public class DefaultRequestOriginParser implements RequestOriginParser {
    @Override
    public String parseOrigin(HttpServletRequest request) {
        //访问请求中的ip地址,基于地址进行黑白名单的设计
        String ip=request.getRemoteAddr();
        System.out.println(ip);
        return ip;
    }
}

新增授权规则

 带黑名单中的参数进行访问

 其他IP进行访问

测试成功,指定在黑名单中的IP不可访问资源

3.基于请求头

定义请求解析器

@Component
public class DefaultRequestOriginParser implements RequestOriginParser {
    @Override
    public String parseOrigin(HttpServletRequest request) {
        String token=request.getHeader("token");
        return  token;
    }//授权规则种的黑白名单的值,来自此方法的返回值
}

 新增授权规则

带黑名单中的参数进行访问

 测试成功,携带指定的请求头访问失败,其他则正常

总结

  1. 为什么要限流?(系统承受不了高并发而导致宕机)
  2. Sentinel 的限流规则?(阈值类型-QPS&线程数,限流模式-直接,关联,链路)
  3. Sentinel 的降级(熔断)策略?(慢调用,异常比例,异常数)
  4. Sentinel 系统规则设计?(了解,全局规则定义,针对所有请求有效)
  5. Sentinel 授权规则设计?(黑白名单)
  6. 你了解的那些限流框架?(sentinel)
  7. 常用的限流算法有那些?(计数,令牌桶-电影票,漏桶-漏斗,滑动窗口)
  8. Sentinel 的热点规则中的热点数据?(微博热搜)
【第四阶段 day25】Sentinel简介 Sentinel限流 Sentinel流控规则分析 文章目录1.Sentinel简介1.1 概述2.Sentinel限流2.1 概述2.2 过程2.2.1 Sentinel应用于服务的提供方(sca-provider),在pom中添加依赖2.2.2 在配置文件中,添加Sentinel配置2.2.3 创建一个Controller对象,用于演示限流操作2.2.4 启动服务,进行测试2.3 Sentinel限流2.3.1 选择需要限流的链路2.3.2 设置限流策略2.3.3 反复刷新访问消费端服务,检测是否有限流信息输出2.3.4 刷新sentinel控制台,实时 阅读详情

相关推荐

Spring Cloud Alibaba Sentinel 整合 Feign 的设计实现

前段时间 Hystrix 宣布不再维护之后(Hystrix 停止开发。。。Spring Cloud 何去何从?),Feign 作为一个跟 Hystrix 强依赖的组件,必然会有所担心后续的使用。 作为 Spring Cloud Alibaba 体系中的熔断器 Sentinel,Sentinel 目前整合了 Feign Feign 是什么? Feign 是一个 Java 实现的 Http 客户...

二十同学 8万+

06-Sentinel限流熔断应用实践

Sentinel简介 背景分析 在我们日常生活中,经常会在淘宝、天猫、京东、拼多多等平台上参与商品的秒杀、抢购以及一些优惠活动,也会在节假日使用12306 手机APP抢火车票、高铁票,甚至有时候还要帮助同事、朋友为他们家小孩拉投票、刷票,这些场景都无一例外的会引起服务器流量的暴涨,导致网页无法显示、APP反应慢、功能无法正常运转,甚至会引起整个网站的崩溃。 我们如何在这些业务流量变化无常的情况下,保证各种业务安全运营,系统在任何情况下都不会崩溃呢?我们可以在系统负载过高时,采用限流、降级和熔断,三种措施来保

雨田说码 4万+

Alibaba Spring Cloud 十五 Sentinel

在微服务架构下,可靠性是核心问题之一,而Sentinel恰恰能够帮助我们在限流、熔断与系统稳定性方面提供一整套完整而灵活的解决方案。结合 Spring Cloud Alibaba 的 Starter 进行使用,可以大幅减少集成成本,同时借助可视化的 Sentinel 控制台,对系统运行状况和配置管理一目了然。如果你打算在 Spring Cloud 或者其他 Java 微服务应用中落地流控、熔断、系统自适应保护等功能,Sentinel 会是一个非常不错的选择。

空 1036

Sentinel自定义阻断异常处理类

目录 BlockException 异常类及其子类 BlockException异常默认处理类 自定义BlockException异常处理 参考: Spring Cloud Alibaba Sentinel(二)自定义熔断异常类_CodingAnHour-优快云博客 Spring Cloud Alibaba 服务容错 Sentinel 入门 | 码农家园 (codenong.com) 在使用sentinel进行限流降级处理时,sentinel在发生blockException时默认返回仅仅是

m0_37965811的博客 3972

Spring Cloud与Spring Cloud Alibaba:全面解析与核心要点

Spring Cloud是一系列框架的集合,它基于Spring Boot构建,为分布式系统开发提供了一站式解决方案。它提供了诸如服务发现与注册、配置中心、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话等多种功能组件,极大地简化了分布式系统的开发难度。Spring Cloud Alibaba是阿里巴巴结合自身在分布式系统开发中的实践经验,对Spring Cloud进行的扩展和增强。

恩爸编程 1915

Spring Cloud Alibaba 介绍与版本映射关系

Spring Cloud 本身并不是一个拿来即可用的框架,它是一套微服务规范,这套规范共有两代实现。(子项目):● 第一代实现: Spring Cloud Netflix,● 第二代实现: Spring Cloud Alibaba。2018 年 12 月12 日,Netflix 公司宣布 Spring Cloud Netflix 系列大部分组件都进入维护模式,不再添加新特性。

web18285997089的博客 1017

Sentinel自定义规则异常返回

个人博客纯净版 Sentinel自定义规则异常返回 | 代码搬运工 默认情况下,发生限流、降级、授权拦截时,都会抛出异常到调用方。如果要自定义异常时的返回结果,需要实现BlockExceptionHandler接口: public class SentinelExceptionHandler implements BlockExceptionHandler { /** * 处理请求被限流、降级、授权拦截时抛出的异常:BlockException */

马明的博客 2047

【springcloud 微服务】Spring Cloud Alibaba整合Sentinel详解

Spring Cloud Alibaba整合Sentinel详解

congge_study的博客 6853

Spring Cloud Alibaba微服务治理实战:Nacos+Sentinel深度解析

Spring Cloud Alibaba微服务治理实战:Nacos+Sentinel深度解析

weixin_46619605的博客 1844

【springcloud 微服务】Spring Cloud Alibaba Sentinel使用详解

Spring Cloud Alibaba Sentinel使用详解

congge_study的博客 6329

Spring Cloud Alibaba 之 Sentinel

Sentinel 是由阿里巴巴中间件团队开发的开源项目,是一种面向分布式微服务架构的轻量级高可用流量控制组件。 Sentinel 主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度帮助用户保护服务的稳定性。

Java 技术专栏,从入门到精通,熟悉企业级开发 8660

Spring Cloud Alibaba Sentinel 网关流量控制之Spring Cloud Gateway实战

学习本篇文章之前如果你还没有了解过Sentinel是什么的话,请先学习一下分布式系统的流量防卫兵Sentinel-入门指南。这样就这轻松学习Spring Cloud Alibaba Sentinel的使用。 1.如何使用 Sentinel 如果要在您的项目中引入 Sentinel,使用 group ID 为com.alibaba.cloud 和 artifact ID 为 spring-cloud...

东子的博客 细节决定成败,点滴铸就辉煌。 4万+

Spring Cloud Alibaba系列教程——Spring Cloud Alibaba开篇

随着Spring Cloud Alibaba的发展,Spring Cloud Alibaba的相关组件逐渐的成熟,对于它的学习和研究已经是java开发人员的趋势。这篇博文主要内容是介绍什么是Spring Cloud Alibaba,Spring Cloud 与Spring Cloud Alibaba的关系,以及我们为什么要学习它,以及畅想Spring Cloud Alibaba未来发展。

努力+坚持,而且还很年轻 6655

使用spring cloud alibaba搭建微服务

公共配置,如nacos服务发现地址spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848,数据库连接等。如服务器名称、nacos配置中心地址spring.cloud.nacos.config.serveraddr=127.0.0.1:8848,需要引入的配置文件。如订单服务,在application.yml文件中配置必要内容,配置了这些内容才能通过找到配置中心的相应文件。-- nacos-config 配置中心依赖 -->

jadewoo8888的博客 2542

Spring Cloud Alibaba 微服务开发实践

Spring Cloud Alibaba 是阿里巴巴开源的基于 Spring Cloud 的微服务框架。该项目从最初孵化到现在已经历经十多年的发展,得到了广泛的应用。其中主要集成了阿里巴巴中间件生态中的组件,比如 Nacos、Sentinel、RocketMQ 和 Dubbo。这些组件在 Spring Cloud 中进行了整合,让 Spring Cloud 用户能够更加简单方便地使用这些组件。因此,Spring Cloud Alibaba 如今已成为众多 Java 开发者的最爱。

AI天才研究院 2279

Win11专业版破解RDP限制:实现多用户远程桌面协同办公

本文详细介绍了如何在Windows 11专业版上破解RDP限制,实现多用户远程桌面协同办公。通过使用RDPWrap工具,用户可以绕过微软的授权限制,允许多个用户同时登录同一台电脑,提高硬件利用率和团队协作效率。文章包含详细的安装配置步骤、性能优化技巧及常见问题解决方案,适用于需要远程协作的办公场景。

weixin_33806300的博客 467

spring-cloud-alibaba-sentinel-gateway

Spring Cloud Alibaba Sentinel Gateway 是阿里巴巴开源组件 Sentinel 与 Spring Cloud Gateway 的整合模块,主要用于在微服务架构中对网关层的流量进行控制、保护和监控

Mr_lee_1的博客 2040

深入理解HTTPS:从SSLHandshakeException到证书链验证的完整解析

本文深入解析了HTTPS握手过程中常见的SSLHandshakeException异常,特别是由证书链验证失败引发的CertPathValidatorException。文章从TLS握手流程、证书链验证的数学原理出发,详细剖析了Java中TrustManager的工作机制,并提供了针对证书链不完整、自签名证书等典型问题的系统化排查流程与实战解决方案。

weixin_29313423的博客 232

Spring Cloud Alibaba 快速学习之 Sentinel

在微服务系统中,一个对外的业务功能可能会涉及很长的服务调用链路。当其中某个服务出现异常,如果没有服务调用保护机制可能会造成该服务调用链路上大量相关服务直接或间接调用的服务器仍然持续不断发起请求,最终导致相关的所有服务资源耗尽产生异常发生雪崩效应。限流和降级分别作为在流量控制和服务保护方面的两个重要手段,可以有效地应对此类问题。Sentinel以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。本章将快速讲解Sentinel的简单应用,阅读前需要先了解前置章节。

D_J_Dragon的博客 1802

django drf 框架知识点(一)——serializer序列化器_用法全解

【django drf】序列化器:别名设置,全部参数序列化,自定义字段,只读只写,部分更新

qq_59344127的博客 1339

跟着团子学SAP:SAP用户状态管理详解(含权限分配等) OK02

SAP用户状态详细配置逻辑及解析

Lucas1211的博客 3万+

spring cloud alibaba Sentinel详解

这里我们给create添加一个流量控制 即每秒只能访问一次@Datareturn r;return r;return r;return r;@Component@OverrideR error = R.error(500, name + "被Sentinel限制了,原因为:" + e.getMessage());当我们一秒钟连续多次访问后 他给前端返回的就是我们自己写的信息。

qq_62374596的博客 1582

simulink建模仿真实例1000例--第375例:基于Simulink进行复杂交通流的仿真建模

特点多车互动:模拟多个车辆之间的相互作用。动态变化:交通流量随时间和事件(如事故、天气变化)而变化。多样化驾驶行为:考虑不同的驾驶员行为模式(激进型、保守型等)。挑战准确性:准确地模拟各种因素对交通流的影响。实时性:处理大量车辆数据,并迅速做出反应。可扩展性:支持从简单场景到复杂城市交通网络的扩展。首先明确要模拟的任务内容。模拟不同类型的车辆(轿车、卡车、公交车等)。考虑不同驾驶员的行为模式。分析交通拥堵、事故对交通流的影响。

xiaoheshang_123的博客 203
上一篇: 微服务---Spring Cloud Alibaba 03(配置中心)
下一篇: 微服务---Spring Cloud Alibaba 05(网关)
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值