微服务 - 限流熔断

本文介绍了如何在Spring项目中集成Sentinel,包括添加依赖、配置限流规则、设置流控模式、链路限流、编写降级策略和使用拦截器实现异常处理。此外,还涵盖了热点数据限流、系统规则应用及授权规则的实战步骤。
摘要由CSDN通过智能技术生成

Sentinel前期准备

  1. 下载地址:
https://github.com/alibaba/Sentinel/releases

注意:要下载Jar包

  1. 在sentinel的jar目录下cmd执行如下命令:
java -Dserver.port=8180 -Dcsp.sentinel.dashboard.server=localhost:8180 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.1.jar

**注意:**根据自己的jar版本号执行命令

  1. 访问Sentinal服务
    默认网址:
http://localhost:8180

默认账户和密码:sentinel
在这里插入图片描述

一. Sentinel限流入门

1. 添加依赖

<!--sentinel依赖,添加了此依赖以后,会在项目中添加一个拦截器对象,这个对象会对
        向此服务发出的请求,进行拦截,拦截到请求以后会与sentinel控制台定义的限流规则进行比对,
        假如在允许范围之内,则继续访问,否则进行限流或降级等操作-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

2.修改配置文件

  1. 在提供方添加配置
spring:
  cloud:
    sentinel:
      transport:
         dashboard: localhost:8180 #这里描述的n是sentinel控制台的地址
	  eager: true #服务启动以后,就会sentinel控制台发送一个心跳消息

3.创建限流操作的Controller对象

  1. 在提供方添加
package com.jt.provider.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/provider")
public class ProviderSentinelController {
       @GetMapping("/sentinel01")
       public String doSentinel01(){
           return "sentinel 01 test  ...";
       }
}

4.访问服务

  1. 启动sca-provider服务,然后对指定服务进行访问
    在这里插入图片描述
  2. 刷新sentinel 控制台,实时监控信息,如图
    在这里插入图片描述

5.设置流控

  1. 在对应路径下,选流控
    在这里插入图片描述
  2. 设置限流策略:直接先流(默认)
    在这里插入图片描述
  3. 反复刷新访问消费端端服务,检测是否有限流信息输出,如图所示
    在这里插入图片描述

二. Sentinel流控规则

设置限流模式

1. 关联限流

  1. 在ProviderSentinelController中添加一个方法
   @GetMapping("/sentinel02")
   public String doSentinel02(){
     return "sentinel 02 test  ...";
   }
  1. 在sentinel中做限流设计,如下

在这里插入图片描述
3. 打开两个测试窗口,对/provider/sentinel02进行访问,检查/provider/sentinel01的状态(手速要快啊!)
在这里插入图片描述

2. 链路限流

  1. 在指定包创建一个ResourceService类
package com.jt.provider.service;
@Service
public class ResourceService{
    @SentinelResource("doGetResource")
    public String doGetResource(){
        return "doGetResource";
    }
}
  1. 在ProviderSentinelController中添加一个方法
    @Autowired
    private ResourceService resourceService;
    @GetMapping("/sentinel03")
    public String doSentinel03() throws InterruptedException {
        resourceService.doGetResource();
        return "sentinel 03 test";
    }
  1. 在sentinel中配置限流规则,如图
    在这里插入图片描述
    设置模式和参数
    在这里插入图片描述
  2. 设置链路流控规则后,再频繁对限流链路进行访问,检测是否会出现500异常
    在这里插入图片描述
  3. 添加配置
    **说明:**流控模式为链路模式时,假如是sentinel 1.7.2以后版本,Sentinel Web过滤器默认会聚合所有URL的入口为sentinel_spring_web_context,因此单独对指定链路限流会不生效,需要在application.yml添加如下语句来关闭URL PATH聚合,如下:
    在这里插入图片描述

三. Sentinel降级规则

1.编写慢调用方法

  1. 在ProviderController 类中添加doSentinel04方法,基于此方法演示慢调用过程下的限流
     //AtomicLong 类支持线程安全的自增自减操作
    private AtomicLong atomicLong=new AtomicLong(1);
    @GetMapping("/sentinel04")
    public  String doSentinel04() throws InterruptedException {
        //获取自增对象的值,然后再加1
        long num=atomicLong.getAndIncrement();
        if(num%2==0){//模拟50%的慢调用比例
           Thread.sleep(200);
        }
        return "sentinel 04 test";
    }

**说明:**我们在此方法中设置休眠,目的是为了演示慢调用(响应时间比较长).

2. 配置降级

在这里插入图片描述
选择要降级的链路
在这里插入图片描述
**提示:**这里表示熔断策略选择"慢调用比例",表示请求数超过3时,假如平均响应时间超过200毫秒的有30%,则对请求进行熔断,熔断时长为10秒钟,10秒以后恢复正常。

3. 测试

对指定链路进行刷新,多次访问测试,检测页面上是否会出现 Blocked By Sentinel (flow Limiting)内容即可.

Sentinel异常处理

1. 创建拦截器对象

  1. 基于Spring MVC中的拦截器实现对控制方法进行时间访问控制?
package com.jt.provider.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalTime;
/**
 * Spring MVC 中的拦截器对象,
 * 此对象可以在你执行目标Controller方法之前执行
 */
public class TimeInterceptor implements HandlerInterceptor {
    /**
     * 此方法在你执行的目标Controller方法之前执行
     * @return 返回值true表示放行,可以继续执行request的后续业务
     */
    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response,
                             Object handler) throws Exception {
        System.out.println("===preHandle===");
        //业务:允许在8点之后,晚9点之前可访问
        LocalTime now = LocalTime.now();//获取当前时间,
        int hour = now.getHour();//获取当前时间的小时单位
        if(hour<8||hour>=21)
            throw new RuntimeException("请在规定时间访问8~21");
        return true;
    }
}

2.配置拦截器

package com.jt;
import com.jt.provider.interceptor.TimeInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class SpringWebConfig implements WebMvcConfigurer {
    //注册拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new TimeInterceptor())
                .addPathPatterns("/provider/sentinel01");
    }
}

3 . 检测拦截器的执行

对/provider/sentinel01路径按时间段进行访问,检测拦截器的执行.

四. Sentinel热点数据限流

五. Sentinel系统规则应用

五. sentinel授权规则应用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值