[Sentinel 笔记] Sentinel的流量控制和降级

本文介绍了如何在Spring Boot项目中配置和使用Sentinel,包括添加依赖、配置YML、设置Sentinel Dashboard,并展示了如何通过注解在接口上实现流量控制,以及在Sentinel Dashboard中动态调整规则。此外,还探讨了Sentinel的降级功能,以提升服务的稳定性和用户体验。
摘要由CSDN通过智能技术生成

目录

boot 配置 sentinel

介绍:

Sentinel 是面向分布式服务架构的流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统自适应保护等多个维度来帮助您保障微服务的稳定性。

Sentinel 阿里下载地址:我这里是1.8.1版本

下载对应的文件下面 ,在地址栏输入cmd  然后  java -jar 

sentinel-dashboard-1.8.1.jar(jar包的全名称路径) 然后运行,默认端口应该是:8080

 

 

         运行成功访问端口:8080,要注意是否会出现端口冲突

下载地址:

https://github.com/alibaba/Sentinel/releases

运行成功的样子:  

登录的账号密码均为:sentinel 

需要在boot项目里面配置相关sentinel的信息 ,在控制台对应接口加入一个注解:

@SentinelResource(value="hi")  加入注解以后,运行项目访问接口,然后多次刷新sentinel 就能查看到 sentinel 就有对应接口相关信息了!!!

--------------------------------

boot 配置 sentinel

pom依赖:

<!-- sentinel -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    <version>2.1.0.RELEASE</version>
</dependency>

yml配置:  注意yml配置的空格约束

cloud:
  sentinel:
    transport:
      dashboard: localhost:8080

控制台配置:     @SentinelResource(value="hi")
 

    @SentinelResource(value="hi")
    @RequestMapping("/hello")
    public String hello(){

        return "你好";
    }

配置以后的运行效果:

先访问配置的接口:

访问成功以后: 

多次刷新sentinel  出现对应接口信息  ,这里你就可以进行相关配置了

,nacos 注册中心就是集成这种 好像!   后面的自己去了解吧  

我们这里可以对它进行配置一个流控,点击流控按钮
配置QPS1

点击新增后我们每秒都只能请求一次了
多次请求多了则会被限流

 我们还可以定义我们受保护的资源
简单来说,就是我们的代码块
下面这段代码可以直接试着运行一下

package com.luodada;
import com.alibaba.csp.sentinel.Entry;
import com.alibaba.csp.sentinel.SphU;
import com.alibaba.csp.sentinel.annotation.SentinelResource;import com.alibaba.csp.sentinel.slots.block.BlockException;import com.alibaba.csp.sentinel.slots.block.RuleConstant;import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;import java.util.ArrayList;import java.util.List;/**
 * sentinel测试类
 *
 *  
 *  
 */public class SimpleSentinelTests {



     public static void main(String[] args) {
         // 配置规则.
    initFlowRules();
    while (true) {
        // 1.5.0 版本开始可以直接利用 try-with-resources 特性
        try (
//                判断资源的名称 如果是HelloWorld 就进去
                Entry entry = SphU.entry("HelloWorld")) {
            // 被保护的逻辑
            System.out.println("hello world");
        } catch (BlockException ex) {
            // 处理被流控的逻辑
            System.out.println("blocked!");
        }
    }
}

private static void initFlowRules() {
    List<FlowRule> rules = new ArrayList<>();
    FlowRule rule = new FlowRule();
    rule.setResource("HelloWorld");     //设置资源的名称
    rule.setGrade(RuleConstant.FLOW_GRADE_QPS);        //  设置流控的规则的以QPS为准,还有以线程为准
    rule.setCount(20);  //令牌   意思就是只能打印20次  HelloWorld信息
    rules.add(rule);
    FlowRuleManager.loadRules(rules);  //添加进流控规则管理中

}

}

输出结果:  展示20次 需要保护的资源!!

后面就是 被流控的逻辑了

我们除了使用FlowRuleManager.loadRules去配置资源流控规则以外,还可以直接在sentinel控制台进行配置

在对应接口上面配置流控:

第二种流控异常:  通过后面的降级去处理

 下面截图里面的三段代码:

 
若我们的应用使用了Spring AOP,我们需要通过配置的方式将 SentinelResourceAspect 注册为一个 Spring Bean:

@Configurationpublic class SentinelAspectConfiguration {     @Bean
     public SentinelResourceAspect sentinelResourceAspect() {            return new SentinelResourceAspect();
     }
}



找个地方注入这个Bean以后
我们在service实现类中写上这个注解
package com.ruben.simplesentinel.service.impl;import com.alibaba.csp.sentinel.annotation.SentinelResource;import com.ruben.simplesentinel.service.IHelloWorldService;import org.springframework.stereotype.Service;/**
 * helloWorld业务层实现类
 *
 * @author <achao1441470436@gmail.com>
 * @since 2021/6/29 0029 22:44
 */@Servicepublic class HelloWorldServiceImpl implements IHelloWorldService {    @SentinelResource("HelloWorld")    @Override
    public void helloWorld() {        // 资源中的逻辑
        System.out.println("hello world");
    }

}


然后方法调用:
package com.ruben.simplesentinel;import com.alibaba.csp.sentinel.annotation.SentinelResource;import com.alibaba.csp.sentinel.slots.block.RuleConstant;import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;import com.ruben.simplesentinel.service.IHelloWorldService;import org.junit.jupiter.api.Test;import org.springframework.boot.test.context.SpringBootTest;import javax.annotation.Resource;import java.util.ArrayList;import java.util.List;@SpringBootTestclass SimpleSentinelApplicationTests {    @Resource
    private IHelloWorldService helloWorldService;    @Test
    void contextLoads() {
        initFlowRules();        while (true) {
            helloWorldService.helloWorld();
        }
    }    private static void initFlowRules() {
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule = new FlowRule();
        rule.setResource("HelloWorld");
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);        // Set limit QPS to 20.
        rule.setCount(20);
        rules.add(rule);
        FlowRuleManager.loadRules(rules);
    }

}

可以看到在执行20次后抛出了java.lang.reflect.UndeclaredThrowableException
并且是由我们com.alibaba.csp.sentinel.slots.block.flow.FlowException导致的

 

 除了进行限流,我们还可以直接配置降级:  因为上面出现异常 我们就可以使用降级来 提高用户使用体验!!!

 

当上面代码抛出异常,, 我们使用降级以后,当我们请求几次后 :就不会再执行我们的方法抛出NPE了;,因为此时我们配置的服务降级生效

 通过配置sentinel限流与降级,提升了我们程序的健壮性,使得其不至于在高并发场景下压力过大,提供程序使用体验!

--------------------------------------------------------------------------------------------------

小知识总结:

java -Dserver.port=8000-Dcsp.sentinel.dashboard.server=localhost:8000-Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.1.jar        

命令详细
这里server.port=8000表示在8000端口启动
csp.sentinel.dashboard.server指定指定控制台地址和端口
project.name指定应用名
更多的参数参见 启动参数文档。

我这里创建的镜像 是使用的aliyun的

 创建sentinel 和 web 依赖:

spring:
cloud:
sentinel:
transport:
# Sentinel 控制台地址
dashboard: localhost:9000
# 如果有多套网络,又无法正确获取本机IP,则需要使用下面的参数设置当前机器可被外部访问的IP地址,供admin控制台使用
# client-ip:
# 取消Sentinel控制台懒加载
# 默认情况下 Sentinel 会在客户端首次调用的时候进行初始化,开始向控制台发送心跳包
# 配置 sentinel.eager=true 时,取消Sentinel控制台懒加载功能
eager: true
filter:
# 配置启用拦截器
enabled: true
# 配置拦截器路径
url-patterns: /** 

结合阿超

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是汤圆丫

怎么 给1分?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值