springcloud alibaba整合sentinel并结合dashboard控制面板设置规则

news2024/11/17 6:40:19

目录

  • 一、springcloud alibaba整合sentinel
  • 二、采用代码方式设置流控规则
  • 三、结合dashboard控制面板设置规则
    • 3.1、准备工作
    • 3.2、设置全局异常处理
    • 3.3、编写测试接口
    • 3.4、结合dashboard控制面板设置规则
      • 3.4.1、流控规则设置并测试——QPS
      • 3.4.2、流控规则设置并测试——线程数
      • 3.4.3、流控规则设置并测试——关联模式
      • 3.4.4、流控规则设置并测试——链路模式

一、springcloud alibaba整合sentinel

首先创建父maven项目springcloudalibaba,在pom文件中引入如下依赖,需要注意版本对应关系

	<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.11.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>springcloudalibaba</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springcloudalibaba</name>
    <description>springcloudalibaba</description>
    
    <modules>
        <module>Order-sentinel</module>
    </modules>
	<properties>
        <java.version>1.8</java.version>
        <spring.cloud.alibaba.version>2.2.5.RELEASE </spring.cloud.alibaba.version>
        <spring.cloud.version>Hoxton.SR8</spring.cloud.version>
    </properties>
    <dependencies>
<!--        springboot场景启动器-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

<!--    依赖放在dependencyManagement中,子项目引用前需要声明,依赖不在dependencyManagement中,子项目默认直接继承-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring.cloud.alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring.cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

随后在父maven项目下创建子maven项目Order-sentinel,pom文件如下

	<parent>
        <groupId>com.example</groupId>
        <artifactId>springcloudalibaba</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <groupId>org.example</groupId>
    <artifactId>Order-sentinel</artifactId>

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

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

二、采用代码方式设置流控规则

创建一个Controller控制器

@RestController
@Slf4j
public class HelloController {
    private static final String RESOURCE_NAME = "hello";
    private static final String USER_RESOURCE_NAME = "user";
    private static final String DEGRADE_RESOURCE_NAME = "degrade";

    // 进行流控
    @RequestMapping("/hello")
    public String hello(){
        Entry entry = null;
        try {
            // 通过接口路径定义资源名称,sentinel是通过资源进行限制的
            entry = SphU.entry(RESOURCE_NAME);
            // 被保护的业务逻辑
            String str = "hello world";
            log.info("========="+str+"===========");
            return str;
        }catch (BlockException e1){
            // 资源阻止访问,被限制或者被降级
            // 进行相应的处理操作
            log.info("block!");
            return "被流控了";

        }catch (Exception e2){
            // 若需要配置降级规则,需要通过这种方式记录业务异常
            Tracer.traceEntry(e2,entry);
        }finally {
            if(entry!=null){
                entry.exit();
            }
        }
        return null;
    }

    /**
     * @description 改善接口中资源定义和被流控后降级的处理方法
     * 使用步骤:1、引入依赖
     *          2、配置bean
     *          value 定义资源
     *          blockHandler 设置流控降级后的处理方法(默认该方法声明在同一个类中)
     *          如果不在同一个类中可以通过 blockHandlerClass 设置,且方法需要用static修饰
     * @return: com.tuling.sentineldemo.entity.User
     */
    
    @RequestMapping("/user")
    @SentinelResource(value = USER_RESOURCE_NAME,blockHandler = "blockHandlerForGetUser")
    public User getUser(String id){
        return new User("测试");
    }

    /**
     * 注意 :
     *  1、一定要public
     *  2、返回值一定要和源方法一样,包含源方法参数,可以在参数最后加上异常类
     *
     */

    public User blockHandlerForGetUser(String id,BlockException e){
        e.printStackTrace();
        return new User("被流控了!");
    }

    @PostConstruct
    private static void initFlowRules(){
        // 流控规则
        List<FlowRule> rules = new ArrayList<>();
        // 流控
        FlowRule rule = new FlowRule();
        // 设置受保护的资源
        rule.setResource(RESOURCE_NAME);
        // 设置流控规则(QPS)
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        // 设置受保护的资源阈值
        rule.setCount(2);
        rules.add(rule);


        // 流控
        FlowRule rule1 = new FlowRule();
        // 设置受保护的资源
        rule1.setResource(USER_RESOURCE_NAME);
        // 设置流控规则(QPS)
        rule1.setGrade(RuleConstant.FLOW_GRADE_QPS);
        // 设置受保护的资源阈值
        rule1.setCount(1);
        rules.add(rule1);


        // 加载配置好的规则
        FlowRuleManager.loadRules(rules);
    }

}

启动项目,浏览器快速访问user和hello接口,会看到被流控的字样,表明流控规则设置生效了

三、结合dashboard控制面板设置规则

3.1、准备工作

先下载安装好对应版本的dashboard,dashboard控制面板下载安装教程请看这篇《sentinel控制面板dashboard的下载安装教程》
随后在项目yml配置文件中进行相应的配置

server:
  port: 8860
spring:
  application:
    name: order-sentinel
  cloud:
    sentinel:
      transport:
        dashboard: 127.0.0.1:8080
      web-context-unify: false # 打开调用链路

order-sentinel是对应的服务名,127.0.0.1:8080为dashboard程序对应的访问ip和端口号

3.2、设置全局异常处理

@Component
public class MyBlockExceptionHandler implements BlockExceptionHandler {
    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception {
        System.out.println("BlockExceptionHandler ========="+e.getRule());
        String r = null;
        if(e instanceof FlowException){
            r = "被流控了";
        }else if(e instanceof DegradeException){
            r = "被降级处理了";
        } else if (e instanceof ParamFlowException) {
            r = "热点参数限流了";
        } else if (e instanceof SystemBlockException) {
            r = "触发了系统保护规则";
        } else if (e instanceof AuthorityException) {
            r = "授权规则不通过";
        }
        response.setStatus(500);
        response.setCharacterEncoding("utf-8");
        response.setContentType(MediaType.APPLICATION_JSON_VALUE);
        new ObjectMapper().writeValue(response.getWriter(),r);
    }
}

配置了全局BlockException异常处理后,当某个接口被流控或者降级处理导致异常会通过该方法进行处理
当前整个项目目录结构如下
在这里插入图片描述

3.3、编写测试接口

controllert层

@RestController
@RequestMapping("/order")
public class OrderController {

    @Autowired
    private IOrderService orderService;

    @GetMapping("/addOrder")
    public String addOrder(){
        System.out.println("下单成功");
        return "下单成功";
    }

    @GetMapping("/getOrder")
    public String getOrder(){
        System.out.println("查询订单成功");

        return "查询订单成功";
    }

    @GetMapping("/flow")
//    @SentinelResource(value = "flow",blockHandler = "flowBlockHandler")
    public String flow(){
        return "返回成功";
    }

    @GetMapping("/flowThread")
    @SentinelResource(value = "flowThread",blockHandler = "flowBlockHandler")
    public String flowThread() throws InterruptedException {
        Thread.sleep(5000);
        return "返回成功";
    }

    public String flowBlockHandler(BlockException e){
        return "被流控了";
    }

    @RequestMapping("/test1")
    public String test1(){
        return orderService.getUser();
    }

    @RequestMapping("/test2")
    public String test2(){
        return orderService.getUser();
    }
}

service层

public interface IOrderService {
    String getUser();
}

service实现类

@Service
public class OrderServiceImpl implements IOrderService {

    @Override
    @SentinelResource(value = "getUser",blockHandler = "blockExceptionGetUser")
    public String getUser() {
        return "查询用户";
    }

    public String blockExceptionGetUser(BlockException e) {
        return "流控";
    }
}

最后,启动项目,依次访问各个接口,让各个接口能被dashboard识别并注册到控制面板中

3.4、结合dashboard控制面板设置规则

进入dashboard控制面板,点击簇点链路,可以看到各个接口并能做出相应的规则设置
在这里插入图片描述

3.4.1、流控规则设置并测试——QPS

在这里插入图片描述
在这里插入图片描述
对/order/addOrder资源进行流控规则设置,输入以上对应的值点击新增按钮,随后请求order/addOrder接口,只要在一秒内请求超过两次后会出现流控效果。QPS就表示为每秒请求数
在这里插入图片描述

3.4.2、流控规则设置并测试——线程数

在这里插入图片描述
在这里插入图片描述
同样为flowThread设置流控规则,由于flowThread接口设置了让线程睡眠5秒,让该接口积攒了超过两条线程后会出现流控效果

3.4.3、流控规则设置并测试——关联模式

在这里插入图片描述
在这里插入图片描述
现有下单接口addOrder和查询订单接口getOrder,当下单接口请求量高于一定阈值,为了节省服务器性能,保障下单接口正常可用,可以对查询订单接口进行限流,此时可以用到关联模式。对查询订单接口设置如上流控规则,当下单接口每秒请求数超过2次,则查询订单接口不可用。

3.4.4、流控规则设置并测试——链路模式

链路模式是当两个不同的接口调用一个公用的方法,可以对该方法设置流控规则。当公用的方法每秒请求超过一定限制可以通过链路模式对某个调用它的接口进行限流。
在这里插入图片描述
这里也可以对test1下的getUser设置规则,效果一样
在这里插入图片描述

当getUser请求数每秒超过2次,则/order/test1被流控,/order/test2正常调用

---------待更新------------

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

反编译有哪些优势

在现在这个信息化的时代&#xff0c;软件开发中的编程是关键步骤&#xff0c;了解编程的反编译同样至关重要。对于大多数人来说&#xff0c;编程和反编译似乎是两个相对比较陌生的概念&#xff0c;但是都在软件开发周期中起着至关重要的作用。尤其是反编译&#xff0c;它在多个…

nginx访问路径匹配方法

目录 一&#xff1a;匹配方法 二&#xff1a;location使用: 三&#xff1a;rewrite使用 一&#xff1a;匹配方法 location和rewrite是两个用于处理请求的重要模块&#xff0c;它们都可以根据请求的路径进行匹配和处理。 二&#xff1a;location使用: 1&#xff1a;简单匹配…

基于Java Servelet的学籍管理系统(Java毕业设计)

大家好&#xff0c;我是DeBug&#xff0c;很高兴你能来阅读&#xff01;作为一名热爱编程的程序员&#xff0c;我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里&#xff0c;我将会结合实际项目经验&#xff0c;分享编程技巧、最佳实践以及解决问题的方法。无论你是…

【Qt之Quick模块】7. Quick基础、常用组件Item、Rectangle、Text、TextInput、TextEdit等

1. 概述 Qt Quick模块是编写QML应用程序的标准库。Qt QML模块提供QML引擎和语言基础结构&#xff0c;Qt Quick模块提供用QML创建用户界面所需的所有基本类型。它提供了一个可视化画布&#xff0c;包括用于创建和动画化可视化组件、接收用户输入、创建数据模型和视图以及延迟对…

外汇天眼:CySEC与NAGA Markets Europe达成15万欧元的和解

塞浦路斯证券交易委员会&#xff08;CySEC&#xff09;已经与NAGA Markets Europe达成15万欧元的和解。有关监管决定的会议于2023年3月举行&#xff0c;然而直到今天才公布这个决定。 该和解符合2009年塞浦路斯证券交易委员会法第37(4)条的规定&#xff0c;该条赋予CySEC就任何…

FairGuard游戏加固产品常见问题解答

针对日常对接中&#xff0c;各位用户对FairGuard游戏加固方案在安全性、稳定性、易用性、接入流程等方面的关注&#xff0c;我们梳理了相关问题与解答&#xff0c;希望可以让您对产品有一个初步的认知与认可。 Q1:FairGuard游戏加固产品都有哪些功能? A&#xff1a;FairGuar…

用python实现调用海康SDK

海康威视&#xff08;Hikvision&#xff09;提供了Python SDK&#xff0c;用于与他们的摄像头和其他设备进行交互。为了使用这些SDK&#xff0c;首先需要在你的系统上安装海康威视的Python库。 下面是如何在Python中使用海康威视的SDK来调用摄像头的方法&#xff1a; python复…

车载 Android之 核心服务 - CarPropertyService 解析

重要类的源码文件名及位置&#xff1a; CarPropertyManager.java packages/services/Car/car-lib/src/android/car/hardware/property/ CarPropertyService.java packages/services/Car/service/src/com/android/car/ 类的介绍&#xff1a; CarPropertyManager&#xff1a…

从信号处理角度彻底理解FFT

只想速览公式可以转到简明FFT公式 一、FFT起初用于解决的问题 分解复合信号 将复合信号视为若干正弦波与余弦波的叠加&#xff0c;如何得知某个正弦波/余弦波在该信号中的强度&#xff1f; 二、即答 用特定频率的正弦波/余弦波&#xff08;设其为a&#xff09;乘上复合信号…

Linux的引导过程与服务控制

一.开机启动的完整过程 引导过程&#xff1a; 1.bios加电自检 检测硬件是否正常&#xff0c;然后根据bios中的启动项设置&#xff0c;去找内核文件 服务器主机开机以后&#xff0c;将根据主板BIOS中的设置对CPU、内存、显卡、键盘灯设备进行初步检测&#xff0c;检测成功后根…

一个JSON.parse的问题,让我丢掉了字节的 offer!

前端训练营&#xff1a;1v1私教&#xff0c;终身辅导计划&#xff0c;帮你拿到满意的 offer。 已帮助数百位同学拿到了中大厂 offer。微信在文章底部&#xff0c;欢迎来撩~~~~~~~~ Hello&#xff0c;大家好&#xff0c;我是 Sunday。 在几年前的一次字节跳动面试中&#xff0c…

HelloWorld搭建(第一种模型)

1.创建Springboot项目并且引入依赖 <!-- 引入RabbitMQ的相关依赖 --> <dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <version>5.7.2</version> </dependency> 2.第一种模式(直连…

企业生产安全指南,请点击文章查收!

随着科技的不断发展&#xff0c;视频监控系统在各个领域中扮演着越来越重要的角色。视频监控系统为企业和机构提供了强大的工具&#xff0c;以提高效率、增强安全性&#xff0c;并为决策制定提供实时数据支持。 客户案例 企业安全与生产管理 在现代企业环境中&#xff0c;保障…

产品|燕窝中的“秘密武器”——燕窝酸

前言 当提及燕窝&#xff0c;大部分人脑海中首先会闪过的大概是“宫廷圣品”、“名贵补品”等听上去十分高大上的形容词。然而随着现代人们生活水平的提高&#xff0c;燕窝已不再神秘&#xff0c;逐渐成为寻常百姓餐桌上的常见食品之一。据我国中医记载&#xff0c;燕窝具有养…

职场商务英语口语“自助餐”用英文怎么说?柯桥外语培训

“自助餐”用英语怎么说&#xff1f; ● 其实很简单&#xff0c;“自助餐”的英文就是&#xff1a;Buffet。 例句&#xff1a; At lunchtime, theres a choice between the buffet or the set menu.15857575376 午饭时&#xff0c;可以选择自助餐或套餐。 We are going to …

租赁小程序|北京租赁系统开发|租赁软件推动了行业发展

如今&#xff0c;租赁行业正在迅速发展&#xff0c;越来越多的商家和用户寻求更便捷、高效的租赁体验。租赁小程序作为一种科技创新的产物&#xff0c;为租赁行业带来了巨大的变革。本文将介绍租赁小程序的功能与特色&#xff0c;旨在让商家和用户更了解这一工具&#xff0c;为…

关于标准那些事——第六篇 四象之“朱雀”(要素的表述)

两仪生四象——东方青龙&#xff08;木&#xff09;、西方白虎&#xff08;金&#xff09;、南方朱雀&#xff08;火&#xff09;、北方玄武&#xff08;水&#xff09; 分别对应标准编写之四象——层次的编写、要素的编写、要素的表述、格式的编排。 今天来分享一下 要素的表…

Unity ShaderGraph 技能冷却转圈效果

Unity ShaderGraph 技能冷却转圈效果 前言项目场景布置代码编写ShaderGraph 连线总结 参考 前言 遇到一个需求&#xff0c;要展示技能冷却的圆形遮罩效果。 项目 场景布置 代码编写 Shader核心的就两句 // 将uv坐标系的原点移到纹理中心 float2 uv i.uv - float2(0.5, 0…

基于Springboot+vue医院管理系统(前后端分离)

最近有一些读者问我有没有完整的基于SpringbootVue的项目源码&#xff0c;今天给大家整理了一下&#xff0c;无偿分享给大家。 功能&#xff1a; 医生信息管理 换着信息管理 挂号信息管理 药物信息管理 检查项目管理 病床信息管理 排班信息管理 数据统计分析 开发工具…

仓储物流RFID智能管理设计解决方案

一、项目概况 1、项目背景 在物流管理中&#xff0c;仓储管理是至关重要的环节&#xff0c;传统的仓储管理存在诸多问题&#xff0c;如进出库操作混乱、库存报告延迟、货品属性不清晰、堆放混乱、盘点不准确等&#xff0c;这些问题需要通过基于信息化管理的技术进行彻底改造。…