Spring Cloud Alibaba 之 Sentinel 限流规则和控制台实例

这一节我们通过一个简单的实例,学习Sentinel的基本应用。

一、Sentinel 限流核心概念

在学习Sentinel的具体应用之前,我们先来了解一下Sentinel中两个核心的概念,资源和规则。

Spring Cloud Alibaba 之 Sentinel 限流规则和控制台实例

资源

资源 是 Sentinel 中的核心概念之一。既然是限流,或者系统保护,那么是针对什么做限流?保护的是什么?就是我们所说的资源。
其实 Sentinel 对资源的定义,和并发编程中 Synchronized的使用很类似,这里的资源,可以是服务里的方法,也可以是一段代码。

规则

定义了资源之后,就是如何对资源进行保护,对资源进行保护的手段,就是我们说的规则。

使用 Sentinel 来进行资源保护,主要分为几个步骤:

  • 定义资源
  • 定义规则
  • 检验规则是否生效

Sentinel 的所有规则都可以在内存态中动态地查询及修改,修改之后立即生效。

二、Spring Boot 限流实例

下面我实现一个使用 Sentinel 的 Hello World 实例。

1、引入 Sentinel 依赖

首先要在工程中加入 Sentinel依赖,
使用Maven管理依赖的项目,只要在 pom.xml 文件中加入以下代码即可:

<dependency>
    <groupid>com.alibaba.csp</groupid>
    <artifactid>sentinel-core</artifactid>
    <version>1.7.1</version>
</dependency>

非Maven项目,可以下载Jar包文件到本地,中央仓库地址Maven Center Repository

这里使用注解的方式,还需要加入 Sentinel 的切面支持依赖,Pom文件如下

<dependency>
    <groupid>com.alibaba.csp</groupid>
    <artifactid>sentinel-annotation-aspectj</artifactid>
    <version>1.7.1</version>
</dependency>

2、配置资源和规则

首先编写启动类和代码入口,

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(ServiceApplication.class, args);
    }
}
@RestController
public class TestController {

    @Autowired
    private TestService service;

    @GetMapping(value = "/hello/{name}")
    public String apiHello(@PathVariable String name) {
        return service.sayHello(name);
    }
}

在服务层定义资源,这里使用注解 @SentinelResource,@SentinelResource 注解用来标识资源是否被限流、降级。

@Service
public class TestService {

    @PostConstruct
    private void initFlowRules(){
        List<flowrule> rules = new ArrayList<>();
        FlowRule rule = new FlowRule();
        rule.setResource("HelloWorld");
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        // &#x8BBE;&#x7F6E;QPS&#x4E3A;1
        rule.setCount(1);
        rules.add(rule);
        FlowRuleManager.loadRules(rules);
    }

    @SentinelResource(value = "HelloWorld",blockHandler="degradeMethod")
    public String sayHello(String name) {
        return "Hello, " + name;
    }

    /**
     * &#x964D;&#x7EA7;&#x65B9;&#x6CD5;&#xFF0C;&#x9650;&#x6D41;&#x540E;&#x5E94;&#x7528;
     * @return
     */
    public String degradeMethod(String name, BlockException blockException){

        return "&#x8BF7;&#x6C42;&#x88AB;&#x9650;&#x6D41;,&#x89E6;&#x53D1;&#x9650;&#x6D41;&#x89C4;&#x5219;="+blockException.getRule().getResource();
    }

}
</flowrule>

定义了被隔离的资源以后,就是规定具体的限流和降级的规则,这里在initFlowRules()方法中初始化规则,添加了一个服务限流后触发的degradeMethod()方法。

3、限流演示

我在限流规则里定义了最大QPS不能超过1,反复刷新几次页面请求,就会被限流。

Spring Cloud Alibaba 之 Sentinel 限流规则和控制台实例
Spring Cloud Alibaba 之 Sentinel 限流规则和控制台实例

4、连接控制台

连接控制台需要添加下面的依赖:

<dependency>
    <groupid>com.alibaba.csp</groupid>
    <artifactid>sentinel-transport-simple-http</artifactid>
    <version>1.7.1</version>
</dependency>

启动时加入 JVM 参数 -Dcsp.sentinel.dashboard.server=consoleIp:port。
-Dcsp.sentinel.dashboard.server=192.168.43.120:8719
这里我把启动参数添加在Idea Configuration下的VM options中,
启动应用后刷新控制台,可以看到应用已经注册上去。

Spring Cloud Alibaba 之 Sentinel 限流规则和控制台实例

三、主流框架的快速适配

上面演示的是一个极简单的限流例子,资源需要开发者自己去定义,那么在一些约定的场景,比如在微服务调用下,Sentinel能否自动识别服务调用,不改动代码就可以进行限流降级呢?

答案是肯定的,针对主流的框架,Sentinel 提供了许多开箱即用的特性支持,包括阿里自家的 Dubbo,Spring Cloud,以及Spring WebFlux,gRPC等框架。

适配 Dubbo

Sentinel 提供 Dubbo 的相关适配 Sentinel Dubbo Adapter,主要包括针对 Service Provider 和 Service Consumer 实现的 Filter。

sentinel-apache-dubbo-adapter(兼容 Apache Dubbo 2.7.x 及以上版本,自 Sentinel 1.5.1 开始支持)
sentinel-dubbo-adapter(兼容 Dubbo 2.6.x 版本)
对于 Apache Dubbo 2.7.x 及以上版本,使用时需引入以下模块(以 Maven 为例):

<dependency>
    <groupid>com.alibaba.csp</groupid>
    <artifactid>sentinel-apache-dubbo-adapter</artifactid>
    <version>${version}</version>
</dependency>

对于 Dubbo 2.6.x 及以下版本,使用时需引入以下模块(以 Maven 为例):

<dependency>
    <groupid>com.alibaba.csp</groupid>
    <artifactid>sentinel-dubbo-adapter</artifactid>
    <version>${version}</version>
</dependency>

引入此依赖后,Dubbo 的服务接口和方法(包括调用端和服务端)就会成为 Sentinel 中的资源,在配置了规则后就可以自动享受到 Sentinel 的防护能力。

适配 Spring Cloud

Sentinel 对 Spring Cloud 的支持,也就是 Spring Cloud Alibaba全家桶,默认为 Sentinel 整合了 Servlet、RestTemplate、FeignClient 和 Spring WebFlux。Sentinel 在 Spring Cloud 生态中,不仅补全了 Hystrix 在 Servlet 和 RestTemplate 这一块的空白,而且还完全兼容了 Hystrix 在 FeignClient 中限流降级的用法,并且支持运行时灵活地配置和调整限流降级规则。

在Spring Cloud 项目中引入 Sentinel,添加如下依赖就可以,

<dependency>
    <groupid>com.alibaba.cloud</groupid>
    <artifactid>spring-cloud-starter-alibaba-sentinel</artifactid>
</dependency>

总结

这节给大家演示了一个 Sentinel的应用实例,并且介绍了Sentinel 和主流框架的集成,下一节的内容会深入解析 @SentinelResource注解。

Original: https://www.cnblogs.com/binyue/p/12251456.html
Author: 邴越
Title: Spring Cloud Alibaba 之 Sentinel 限流规则和控制台实例

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/540591/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 基于CAS实现SSO单点登录

    1. 概述 1.1. 什么是SSO? 单点登录( Single Sign-On , 简称 SSO )是目前比较流行的服务于企业业务整合的解决方案之一, SSO 使得在多个应用系统中…

    Java 2023年5月29日
    0167
  • 实现线程同步

    1 为何需要线程同步? 由于线程共享进程的资源,会产生 竞态条件,在某些情况下需要 协调指令执行的先后顺序,也就是实现 线程同步。 下面是一个常见的多线程累加程序,由于sum++并…

    Java 2023年5月30日
    045
  • golang实现文件上传功能

    前端页面form表单 注意:实现文件上传的时候,form表单必须有enctype=”multipart/form-data”属性; 可以自己设置上传文件的限…

    Java 2023年6月13日
    073
  • java线程池的介绍与使用(Executor框架)

    先来看一下类构成 public interface Executor { //顶级接口Executor,定义了线程执行的方法 void execute(Runnable comma…

    Java 2023年6月6日
    0100
  • ReentrantLock可重入、可打断、Condition原理剖析

    本文紧接上文的AQS源码,如果对于ReentrantLock没有基础可以先阅读我的上一篇文章学习ReentrantLock的源码 重入加锁其实就是将AQS的state进行加一操作 …

    Java 2023年6月16日
    064
  • Spring AntPathMatcher

    Spring AntPathMatcher AntPathMatcher是用来对资源路径或者url的字符串做匹配使用的。采用的是Ant风格的格式 Ant风格的资源地址支持3中匹配 …

    Java 2023年6月7日
    079
  • SpringMVC,3种不同的URL路由配置方法(这根本不是一个小问题)(转)

    让SpringMVC指拦截 动态请求,js、css、img等静态资源不经过Spring,直接让Web容器处理。 如果配置了拦截器,也只会拦截.html动态请求。 静态资源不走Spr…

    Java 2023年5月30日
    078
  • Nacos服务注册为指定IP和端口

    转至:https://www.jianshu.com/p/64e1f7d50c6e 如果选择固定Ip注册可以配置 spring.cloud.nacos.discovery.ip =…

    Java 2023年6月8日
    098
  • 使用jhipster 加速java web开发

    jhipster,中文释义: Java 热爱者! JHipster is a development platform to quickly generate, develop, …

    Java 2023年5月29日
    079
  • nginx 学习,详细总结

    一 、nginx介绍 1.简介 Nginx 是高性能的 HTTP 和反向代理的web服务器,处理高并发能力是十分强大的,能经受高负 载的考验,有报告表明能支持高达 50,000 个…

    Java 2023年6月8日
    077
  • 22.1.9 链表

    22.1.9 链表 1)哈希表在使用层面上可以理解为一种集合结构 2)如果只有key,没有伴随数据value,可以使用HashSet结构(C++中叫UnOrderedSet) 3)…

    Java 2023年6月13日
    067
  • 使用 sed 处理文本文件

    sed 是一款 GNU 流编辑器,可以按照指定的规则去处理文本文件或流,其强大的功能使用户在命令中快捷地修改文本文件成为可能。 它不会修改文件,除非使用shell重定向来保存结果。…

    Java 2023年6月7日
    0108
  • 2022年【米哈游】 金三银四 三月社招内推开始啦!加班少福利好,200+个岗位任你挑选,赶快来看吧!

    米哈游 金三银四 三月内推开始啦 内推类型:社招(校招同学可以使用内推码NTAHEGf进行投递) 内推方式1:直接扫下方专属二维码或使用自助内推链接查看所有在招岗位,并进行投递 自…

    Java 2023年6月8日
    085
  • 非自交任意多边形与矩形框的交集面积计算方法

    非自交任意多边形与矩形框的交集面积计算方法 1、应用背景 在对象识别的AI计算时,有时需要限定检测区域,即目标对象落在限定区域内有效,在区域外忽略。转换为数学模型为:目标检测框与限…

    Java 2023年6月14日
    075
  • JAVA的类型转换(基本类型)

    类型转换 由于java是强类型语言,所以在进行某些运算的时候,需要用到类型转换。 低–>高指的是字节大小,从小到大。 小数的优先级大于整数 数值进行类型转换时不要…

    Java 2023年6月9日
    084
  • 我的第一个博客

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月9日
    077
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球