博客
关于我
Sentinel入门(二)
阅读量:533 次
发布时间:2019-03-07

本文共 5453 字,大约阅读时间需要 18 分钟。

目录

springboot 整合 sentinel 简单示例

创建 springboot 应用,命名为 Sentinel-Quick-start

Maven 依赖

com.alibaba.csp
sentinel-core
1.8.0

编写 Controller

@Controllerpublic class TestController {       @RequestMapping(path = {   "/hello"}, method = RequestMethod.GET)    @ResponseBody    public String hello() {           try {           	// 设置一个资源名称为 Hello            Entry ignored = SphU.entry("Hello");            System.out.println("Hello Sentinel");            return "Hello Sentinel";        } catch (BlockException e) {               System.out.println("系统繁忙,请稍后");            e.printStackTrace();            return "系统繁忙,请稍后";        }    }    /**      * 使用代码编写流控规则,项目中不推荐使用,这是硬编码方式     *      * 注解 @PostConstruct 的含义是:本类构造方法执行结束后执行     */    @PostConstruct    public void initFlowRule() {           /* 1.创建存放限流规则的集合 */        List
rules = new ArrayList<>(); /* 2.创建限流规则 */ FlowRule rule = new FlowRule(); /* 定义资源,表示 Sentinel 会对哪个资源生效 */ rule.setResource("Hello"); /* 定义限流的类型(此处使用 QPS 作为限流类型) */ rule.setGrade(RuleConstant.FLOW_GRADE_QPS); /* 定义 QPS 每秒通过的请求数 */ rule.setCount(2); /* 3.将限流规则存放到集合中 */ rules.add(rule); /* 4.加载限流规则 */ FlowRuleManager.loadRules(rules); }}

测试运行

在这里插入图片描述

快速刷新页面

在这里插入图片描述

搭建 Sentinel 控制台

下载 Sentinel 控制台 jar 包:

启动 Sentinel 控制台,如下图所示

java -Dserver.port=9000 -jar sentinel-dashboard-1.8.0.jar

在这里插入图片描述

访问 Sentinel 控制台:http://127.0.0.1:9000/

在这里插入图片描述

输入用户名和密码:都是 Sentinel

在这里插入图片描述

springboot 应用接入 Sentinel 控制台

Maven 依赖

com.alibaba.csp
sentinel-transport-simple-http
1.8.0

idea 中设置本地应用的 JVM 启动参数

-Dcsp.sentinel.dashboard.server=127.0.0.1:9000   Sentinel控制台的地址和端口号-Dproject.name=Sentinel-Quick-Start				本地应用在控制台中的名称

在这里插入图片描述

运行测试

第一次查看控制台,需要先访问一次被限流控制的接口,否则控制台中没有东西

在这里插入图片描述

Sentinel 提供的设置流控规则的方式

  • 在应用中使用代码编写流控规则(不推荐
  • Sentinel 控制台中动态的设置流控规则(推荐使用

Sentinel 控制台中动态的设置流控规则

修改上述 TestController

删除使用代码编写的流控规则,项目中不推荐使用,这是硬编码方式

@Controllerpublic class TestController {       @RequestMapping(path = {   "/hello"}, method = RequestMethod.GET)    @ResponseBody    public String hello() {           try {               Entry ignored = SphU.entry("Hello");            System.out.println("Hello Sentinel");            return "Hello Sentinel";        } catch (BlockException e) {               System.out.println("系统繁忙,请稍后");            e.printStackTrace();            return "系统繁忙,请稍后";        }    }}

启动上述项目,如下操作

在这里插入图片描述

新增流控规则

在这里插入图片描述

新增成功后查看

在这里插入图片描述

测试流控规则

在这里插入图片描述

快速刷新页面时

在这里插入图片描述

Sentinel 定义资源的方式

  • 抛出异常的方式定义资源
  • 返回布尔值的方式定义资源
  • 异步调用支持
  • 注解方式定义资源

抛出异常的方式定义资源示例

使用这种方式当资源发生限流后会抛出 BlockException 异常。这个时候可以捕获异常,进行限流之后的逻辑处理,关键代码如下

@RequestMapping(path = {   "/hello"}, method = RequestMethod.GET)@ResponseBodypublic String hello() {       try {           Entry ignored = SphU.entry("Hello");        System.out.println("Hello Sentinel");        return "Hello Sentinel";    } catch (BlockException e) {           System.out.println("系统繁忙,请稍后");        e.printStackTrace();        return "系统繁忙,请稍后";    }}

返回布尔值的方式定义资源示例

使用的 APISphO,限流后返回的值为 boolean 类型。注意:SphO.entry 必须和 SphO.exit 成对出现 否则会报错

@GetMapping("/boolean")public boolean returnBoolean() {       // 使用限流规则    if (SphO.entry("Sentinel-boolean")){            try {                System.out.println("Hello Sentinel");             return true;          }finally {             	  // 限流的出口              SphO.exit();          }    } else {           // 限流后进行的操作        System.out.println("系统繁忙,请稍后再试");        return false;    }}

异步调用支持示例

在启动类中添加 @EnableAsync,表示 SpringBoot 项目开启异步调用支持

@SpringBootApplication@EnableAsyncpublic class SentinelQuickStartApplication {       public static void main(String[] args) {           SpringApplication.run(SentinelQuickStartApplication.class, args);    }}

创建 AsyncService 编写异步调用的方法

@Servicepublic class AsyncService {       // Async表示方法为异步调用    @Async    public void hello(){           System.out.println("异步调用开始======");        try {               Thread.sleep(5000);        } catch (InterruptedException e) {               e.printStackTrace();        }        System.out.println("异步调用结束=====");    }}

Controller

@Autowiredprivate AsyncService asyncService;@GetMapping("/async")public void async() {   	// 1.进行限流控制    AsyncEntry asyncEntry = null;    try {       	asyncEntry = SphU.asyncEntry("Sentinel_Async"); // 限流入口        asyncService.hello(); // 异步调用方法        System.out.println("异步测试");    } catch (BlockException e) {           e.printStackTrace();        System.out.println("系统繁忙请稍后再试");    } finally {           if (asyncEntry != null) {           	asyncEntry.exit(); // 限流出口        }	}}

注解方式定义资源示例

Sentinel 支持通过 @SentinelResource 注解来定义资源并配置 blockHandler 函数来进行限流之后的处理

Maven 依赖

com.alibaba.csp
sentinel-annotation-aspectj
1.8.0

AspectJ 的配置类

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

Controller

@Controllerpublic class Test2Controller {       // value:资源名称 blockHandler:设置限流或降级处理的类    @SentinelResource(value = "sentinel_springcloud", blockHandler = "exceptionHandler")    @ResponseBody    @RequestMapping(path = "/ann", method = RequestMethod.GET)    public String ann() {           // 使用限流规则        return "Hello Sentinel";    }    public String exceptionHandler(@NotNull BlockException e) {           e.printStackTrace();        return "系统繁忙,请稍后再试";    }}

转载地址:http://ssinz.baihongyu.com/

你可能感兴趣的文章
mysql
查看>>
MTK Android 如何获取系统权限
查看>>
MySQL - 4种基本索引、聚簇索引和非聚索引、索引失效情况、SQL 优化
查看>>
MySQL - ERROR 1406
查看>>
mysql - 视图
查看>>
MySQL - 解读MySQL事务与锁机制
查看>>
MTTR、MTBF、MTTF的大白话理解
查看>>
mt_rand
查看>>
mysql -存储过程
查看>>
mysql /*! 50100 ... */ 条件编译
查看>>
mudbox卸载/完美解决安装失败/如何彻底卸载清除干净mudbox各种残留注册表和文件的方法...
查看>>
mysql 1264_关于mysql 出现 1264 Out of range value for column 错误的解决办法
查看>>
mysql 1593_Linux高可用(HA)之MySQL主从复制中出现1593错误码的低级错误
查看>>
mysql 5.6 修改端口_mysql5.6.24怎么修改端口号
查看>>
MySQL 8.0 恢复孤立文件每表ibd文件
查看>>
MySQL 8.0开始Group by不再排序
查看>>
mysql ansi nulls_SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON 什么意思
查看>>
multi swiper bug solution
查看>>
MySQL Binlog 日志监听与 Spring 集成实战
查看>>
MySQL binlog三种模式
查看>>