第四次课:基于Sentinel的服务限流及熔断

飞一样的编程
飞一样的编程
擅长邻域:Java,MySQL,Linux,nginx,springboot,mongodb,微信小程序,vue

分类: Java springboot 专栏: 分布式学习 标签: sentinel

2023-06-15 01:26:22 778浏览

基于Sentinel的服务限流及熔断

Sentinel简介

Sentinel是阿里巴巴出品的面向分布式服务架构的轻量级流量控制组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护等多个维度来保障微服务的稳定性。

主页地址: https://sentinelguard.io/zh-cn/docs/introduction.html

资源级别做限流

什么是限流:拿旅游景点举例子

针对某个微服务的某个接口,属于资源级别的限流

基本使用

依赖

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-core</artifactId>
    <version>1.7.2</version>
</dependency>

定义资源——抛出异常的方式

  // 1.5.0 版本开始可以直接利用 try-with-resources 特性
        try (Entry entry = SphU.entry("storge")) {
            // 被保护的逻辑
            //商品id和数量  这里就只模拟了 业务代码省略
            return "success";
        } catch (BlockException ex) {
            // 处理被流控的逻辑
            return "系统繁忙,请稍后重试";
        }

定义规则-编码方式

 //定义规则每秒最多只能通过 2个请求。
    @PostConstruct
    private static void initFlowRules(){
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule = new FlowRule();
        rule.setResource("storge");
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        // Set limit QPS to 2
        rule.setCount(2);
        rules.add(rule);
        FlowRuleManager.loadRules(rules);
    }

定义规则-sentinel控制台操作

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

去下载控制台jar,然后启动项目

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

让微服务项目跟sentinel关联起来

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-transport-simple-http</artifactId>
    <version>1.7.2</version>
</dependency>
# 设置sentinel控制台的主机地址和端口
-Dcsp.sentinel.dashboard.server=localhost:9000
# 设置本地应用在sentinel控制台中的名称
-Dproject.name=StrogeSentinel

页面上新建流控规则

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

SphO 提供 if-else 风格的 API。用这种方式,当资源发生了限流之后会返回 false,这个时候可以根据返回值,进行限流之后的逻辑处理。示例代码如下:

 // 资源名可使用任意有业务语义的字符串
  if (SphO.entry("自定义资源名")) {
    // 务必保证finally会被执行
    try {
      /**
      * 被保护的业务逻辑
      */
    } finally {
      SphO.exit();
    }
  } else {
    // 资源访问阻止,被限流或被降级
    // 进行相应的处理操作
  }

定义资源——异步调用的方式

Sentinel 支持异步调用链路的统计。在异步调用中,需要通过 SphU.asyncEntry(xxx) 方法定义资源,并通常需要在异步的回调函数中调用 exit 方法。以下是一个简单的示例:

try {
    AsyncEntry entry = SphU.asyncEntry(resourceName);

    // 异步调用.
    doAsync(userId, result -> {
        try {
            // 在此处处理异步调用的结果.
        } finally {
            // 在回调结束后 exit.
            entry.exit();
        }
    });
} catch (BlockException ex) {
    // Request blocked.
    // Handle the exception (e.g. retry or fallback).
}

写一个异步调用接口的步骤

@EnableAsync
public class StorgeApp {
@Async
    String  doAsync(){
        return "success";
    }


    @GetMapping
    public String  updateStorge(){
        try {
            AsyncEntry entry = SphU.asyncEntry("storge3");


                try {
                    // 在此处处理异步调用的结果.
                   return  doAsync();

                } finally {
                    // 在回调结束后 exit.
                    entry.exit();
                }
        } catch (BlockException ex) {
            return "系统繁忙,请稍后重试";
        }

    }

定义资源——注解的方式

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

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-annotation-aspectj</artifactId>
    <version>x.y.z</version>
</dependency>
@Configuration
public class SentinelAspectConfiguration {

    @Bean
    public SentinelResourceAspect sentinelResourceAspect() {
        return new SentinelResourceAspect();
    }
}
    @GetMapping
    @SentinelResource(value = "storge4",blockHandler = "handler")
    public String  updateStorge(){
        return "success";
    }
    public String handler(BlockException e){
        e.printStackTrace();
        return "系统繁忙,请稍后重试";
    }

整合springcloud-alibaba

 <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    <version>2.1.0.RELEASE</version>
</dependency>
@RestController
@RequestMapping("/stroge")
public class StrogeController {
    @GetMapping
    @SentinelResource(value = "storge",blockHandler = "storgeBlockHandler")
    public String update(){

        return "success";
    }


    String storgeBlockHandler(BlockException e){
        e.printStackTrace();
        return "系统繁忙,请稍后重试";

    }
}
spring:
  application:
    name: storge-service
  cloud:
    sentinel:
      transport:
        dashboard: localhost:9000

资源级别熔断机制

针对某个微服务的某个接口,属于资源级别的

平均响应时间rt ,这里设置时间短一点便于测试

系统级别的保护机制

Sentinel 系统自适应保护从整体维度对应用入口流量进行控制,结合应用的 Load、总体平均 RT、入口 QPS 和线程数等几个维度的监控指标,让系统的入口流量和系统的负载达到一个平衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。

其实是针对整个微服务

@RestController
@RequestMapping("/storge3")
public class StorgeController3 {
    @GetMapping
    @SentinelResource(entryType = EntryType.IN)
    public String hello(){

        return "success";
    }

}

补充:

各种整合

sentinel整合RestTemplate,也可以整合springcloud 整合后面要学习的Feign,整合gateway网关等。以及sentinel数据持久化。这些就自行学习

熔断和降级的区别

降级(Degradation)降低级别的意思,它是指程序在出现问题时,仍能保证有限功能可用的一种机制。

比如电商交易系统在双 11 时,使用的人比较多,此时如果开放所有功能,可能会导致系统不可用,所以此时可以开启降级功能,优先保证支付功能可用,而其他非核心功能,如评论、物流、商品介绍等功能可以暂时关闭。

所以,从上述信息可以看出:降级是一种退而求其次的选择,而熔断却是整体不可用。

好博客就要一起分享哦!分享海报

此处可发布评论

评论(7展开评论

蓝色妖姬 能力:10

2023-06-16 16:14:31

抖音关注 ll3291563663, 这是我朋友,大家多多关注,他会回关
蓝色的妖姬 能力:10

2023-06-16 11:39:06

有没有我的粉丝?
蓝色的妖姬 能力:10

2023-06-16 11:32:01

学习中
蓝色妖姬 能力:10

2023-06-15 16:15:09

大家可以都来注册一下,为宇将军上上人气,打打call
绿你奇迹 能力:10

2023-06-15 15:07:21

学习中
周杰伦 能力:10

2023-06-15 08:16:59

学习中
蓝色妖姬 能力:10

2023-06-15 07:52:53

稍微瞅一眼中
点击查看更多评论

展开评论

您可能感兴趣的博客

客服QQ 1913284695