五、Spring Cloud集成Sentinel

🚌一个人可以走的很快,一群人可以走的很远
🎉点赞➕评论➕收藏 ➕关注== 养成习惯(一键四连)📝
🎉欢迎关注💗一起学习👍一起讨论⭐️一起进步📝
🙏作者水平有限,欢迎各位大佬指点,相互学习进步!😆

本篇主要介绍Sentinel如何实现Spring Cloud应用的限流操作。
官网:https://sentinelguard.io/zh-cn/

通过代码来限流

  1. 创建一个基于Spring Boot的项目,添加sentinel相关依赖
  2. 添加Sentinel依赖包
    需要注意的是sentinel更新的版本没有springboot官网那么频繁,所以版本可能不支持高版本,目前2021.1的sentinel仅支持springboot2.4.5版本,如果版本配置错误会有详细提示
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.4.5</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

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

3.创建一个REST接口,并通过@SentinelResource配置限流保护资源

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;

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

@RestController
public class SentinelController {

    @SentinelResource(value = "sentinel",blockHandler = "exceptionHandler")
    @GetMapping("/sentinel")
    public String sentinel(){
        return "sentinel";
    }

    public String exceptionHandler(BlockException e ){
        return "请求过于频繁";
    }

}

在上面代码中,配置限流资源有几种情况:
● Sentinel starter在默认情况下会为所有HTTP服务提供限流埋点,所以如果只想对HTTP服务进行限流,只需要添加依赖即可。
● 如果想要对特定的方法进行限流或者降级,则需要通过@SentinelResource注解来实现限流资源的定义
● 可以通过SphU.entry()方法来配置资源。

4.手动配置流控规则,可以借助Sentinel的InitFunc SPI扩展接口来实现,只需要实现自己的InitFunc接口,并在init方法中编写规则加载的逻辑即可。

import com.alibaba.csp.sentinel.init.InitFunc;
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;

public class FlowRuleInitFunc implements InitFunc {
    @Override
    public void init() throws Exception {
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule = new FlowRule();
        rule.setCount(1);
        rule.setResource("sentinel");
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        rule.setLimitApp("default");
        rules.add(rule);
        FlowRuleManager.loadRules(rules);
    }
}

SPI是扩展点机制,如果需要被Sentinel加载,那么还要在resource目录下创建META-INF/services/com.alibaba.csp.sentinel.init.InitFunc文件,文件内容就是自定义扩展点的全路径
com.sentinel.springcloud.demo.FlowRuleInitFunc
按照上述配置好之后,在初次访问任意资源的时候,Sentinel就会自动加载getIpInfo资源的流控规则。

6.启动服务后,访问http://localhost:8881/sentinel方法,当访问频率超过设定阈值的时候,就会触发限流。

上述配置过程是基于手动配置来加载流控规则的,还有一种方式就是通过Sentinel Dashboard来进行配置。

基于Sentinel Dashboard来实现流控配置

启动:

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

基于Sentinel Dashboard来配置流控规则,可以实现流控规则的动态配置,执行步骤如下:
1、启动Sentinel Dashboard

2、添加配置

server.port=8882
spring.application.name=sentinel-spring-cloud-demo
spring.cloud.sentinel.transport.dashboard=localhost:8080
spring.cloud.sentinel.eager=true

spring.cloud.sentinel.transport.dashboard指向的是Sentinel Dashboard的服务器地址,可以实现流控数据的监控和流控规则的分发。
3、提供一个REST接口:

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class SentinelController {

    @SentinelResource(value = "sentinel",blockHandler = "requestTooFast")
    @GetMapping("/sentinel")
    public String sentinel(){
        return "sentinel";
    }

    public String requestTooFast(BlockException e){
        return "请求太频繁了。。。。";
    }
}

此处不需要添加任何资源埋点,在默认情况下Sentinel Starter会对所有HTTP请求进行限流。

启动服务后,此时访问http://localhost:8882/sentinel,不存在任何限流行为。

至此,Spring Cloud集成Sentinel的配置就完成了,接下来就可以进入Sentinel Dashboard去实现限流规则的配置。

● 访问local host:8080进入Sentinel Dashboard。
● 进入spring.application.name对应的菜单,访问“簇点链路”,如下图所示,在该列表下可以看到/dash这个REST接口的资源名称。

针对/sentinel这个资源,点击最右边的操作栏中的“流控”按钮设置流控规则,如下图所示:

新增规则中的所有配置信息,实际就是FlowRule中对应的属性配置。

新增完成后,再次访问http://localhost:8882/sentinel,当超过设置的阈值的时候,就可以看到限流的效果,并获得如下输出:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

黑石课堂

请给我打钱!!!谢谢,不客气!

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

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

打赏作者

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

抵扣说明:

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

余额充值