SpringCloud 使用sentinel

这篇具有很好参考价值的文章主要介绍了SpringCloud 使用sentinel。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、添加依赖

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

二、配置文件配置地址

spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080

 三、流控模式介绍

直接:统计当前资源的请求,触发阈值时对当前资源直接限流,也是默认的模式

关联:统计与当前资源相关的另一个资源触发阈值时,对当前资源限流

        使用场景:比如用户支付时需要修改订单状态,同时用户要查询订单。查询和修改操作会争抢数据库锁,产生竞争。业务需求是有限支付和更新订单的业务,因此当修改订单业务触发阈值时,需要对查询订单业务限流。

SpringCloud 使用sentinel

链路:统计从指定链路访问到本资源的请求触发阈值时,对指定链路限流

例如有两条请求链路:

/test1→ /common
/test2→/common

如果只希望统计从/test2进入到/common的请求,则可以这样配置:

SpringCloud 使用sentinel

注意:

1、Sentinel默认会将Controller方法做context整合,导致链路模式的流控失效,需要修改application.yml,添加配置:

spring:
 
cloud:
    sentinel:
     
web-context-unify: false # 关闭context整合

2、Sentinel默认只标记Controller中的方法为资源,如果要标记其它方法(如service方法),需要利用@SentinelResource注解,示例:

@SentinelResource("goods")
public void queryGoods() {
    System.
err.println("查询商品");
}

 四、流控效果

快速失败:QPS超过阈值时,拒绝新的请求。

warm up: QPS超过阈值时,拒绝新的请求;但QPS阈值是逐渐提升的,可以避免冷启动时高并发导致服务宕机。

排队等待:请求会进入队列,按照阈值允许的时间间隔依次执行请求;如果请求预期等待时长大于超时时间,直接拒绝。

五、热点参数限流

热点参数限流是分别统计参数值相同的请求,判断是否超过QPS阈值。并且可以对部分参数设置例外配置:SpringCloud 使用sentinel

注意:热点参数限流对默认的SpringMVC资源无效,必须手动添加@SentinelResource注解

 六、FeignClient整合Sentinel

Sentinel支持的雪崩解决方案:1、线程隔离(仓壁模式)2、降级熔断

(1)在application.yml中配置:feign.sentienl.enable=true

feign:
  sentinel:
   
enabled: true # 开启FeignSentinel功能

(2)给FeignClient编写FallbackFactory并注册为Bean

public class UserClientFallbackFactory implements FallbackFactory<UserClient> {
    @Override
    public UserClient create(Throwable throwable) {
        // 创建UserClient接口实现类,实现其中的方法,编写失败降级的处理逻辑
        return new UserClient() {
            @Override
            public User findById(Long id) {
                // 记录异常信息
                log.error("查询用户失败", throwable);
                // 根据业务需求返回默认的数据,这里是空用户
                return new User();
            }
        };
    }
}

@Bean
public UserClientFallbackFactory userClientFallback(){
    return new UserClientFallbackFactory();
}

(3)将FallbackFactory配置到FeignClient

@FeignClient(value = "userservice", fallbackFactory =UserClientFallbackFactory.class)
public interface UserClient {
    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
}

 七、熔断降级策略

1、慢调用比例:超过指定时长的调用为慢调用,统计单位时长内慢调用的比例,超过阈值则熔断

2、异常比例:统计单位时长内异常调用的比例,超过阈值则熔断

3、异常数:统计单位时长内异常调用的次数,超过阈值则熔断

八、授权规则

授权规则可以对调用方的来源做控制,有白名单和黑名单两种方式。

SpringCloud 使用sentinel

 Sentinel是通过RequestOriginParser这个接口的parseOrigin来获取请求的来源的。

public interface RequestOriginParser {
    /**
     * 从请求request对象中获取origin,获取方式自定义
     */
    String parseOrigin(HttpServletRequest request);
}

所以在填写流控应用的时候,是根据自定义的RequestOriginParser来填写(比如在请求header上添加值来区分是网关过来的请求还是直接访问的服务的请求)

@Component
public class HeaderOriginParser implements RequestOriginParser {
    @Override
    public String parseOrigin(HttpServletRequest request) {
        String origin = request.getHeader("origin");
        if(StringUtils.isEmpty(origin)){
            return "blank";
        }
        return origin;
    }
}

九、自定义返回方法

只需实现BlockExceptionHandler接口即可

@Component
public class SentinelBlockHandler implements BlockExceptionHandler {
    @Override
    public void handle(
            HttpServletRequest httpServletRequest,
            HttpServletResponse httpServletResponse, BlockException e) throws Exception {
        String msg = "未知异常";
        int status = 429;
        if (e instanceof FlowException) {
            msg = "请求被限流了!";
        } else if (e instanceof DegradeException) {
            msg = "请求被降级了!"; 
        } else if (e instanceof ParamFlowException) {
            msg = "热点参数限流!";
        } else if (e instanceof AuthorityException) {
            msg = "请求没有权限!";
            status = 401;
        }
        httpServletResponse.setContentType("application/json;charset=utf-8");
        httpServletResponse.setStatus(status);
        httpServletResponse.getWriter().println("{\"message\": \"" + msg + "\", \"status\": " + status + "}");
    }
}

 十、配置规则持久化三种模式

1、原始模式:保存在内存

2、pull模式:保存在本地文件或数据库,定时去读取

3、push模式:保存在nacos,监听变更实时更新

通常生产环境采用push模式,需要修改Sentinel-dashboard的源码文章来源地址https://www.toymoban.com/news/detail-415511.html

到了这里,关于SpringCloud 使用sentinel的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • springcloud Alibaba中gateway和sentinel联合使用

    看到这个文章相信你有一定的sentinel和gateway基础了吧。 官网的gateway和sentinel联合使用有些过时了,于是有了这个哈哈,给你看看官网的: 才sentinel1.6,现在都几了啊,所以有些过时。 下面开始讲解: 首先我们总的回顾一下,sentinel就是需要运行一个jar包,开启dashbord页面,来

    2024年01月17日
    浏览(47)
  • 【springcloud 微服务】Spring Cloud Alibaba Sentinel使用详解

    目录 一、前言 二、分布式系统遇到的问题 2.1 服务可用性问题 2.1.1  单点故障

    2024年01月16日
    浏览(48)
  • 【SpringCloud Alibaba】(六)使用 Sentinel 实现服务限流与容错

    今天,我们就使用 Sentinel 实现接口的限流,并使用 Feign 整合 Sentinel 实现服务容错的功能,让我们体验下微服务使用了服务容错功能的效果。 因为内容仅仅围绕着 SpringCloud Alibaba技术栈展开,所以,这里我们使用的服务容错组件是阿里开源的 Sentinel。 当然,能够实现服务容错

    2024年02月14日
    浏览(46)
  • 【SpringCloud】11、Spring Cloud Gateway使用Sentinel实现服务限流

    1、关于 Sentinel Sentinel 是阿里巴巴开源的一个流量防卫防护组件,可以为微服务架构提供强大的流量防卫能力,包括流量控制、熔断降级等功能。Spring Cloud Gateway 与 Sentinel 结合,可以实现强大的限流功能。 Sentinel 具有以下特性: 丰富的应用场景:Sentinel 承接了阿里巴巴近

    2024年02月01日
    浏览(54)
  • springcloud搭建 初级人员的使用搭建。sentinel使用官网有详细的使用方法

    代码仓库地址:https://github.com/zhaoyiwen-wuxian/shop-trench spring: application: name: api-gateway cloud: nacos: config: file-extension: yaml server-addr: 127.0.0.1:8848 #添加其他的配置文件的读取 shared-configs: - dataId: redis.yaml refresh: true #是否支持动态刷新 profiles: active: dev #appConfig: #name: gateway 动态更新 #共享

    2024年02月22日
    浏览(34)
  • SpringCloud Alibaba - Sentinel 微服务保护解决雪崩问题、Hystrix 区别、安装及使用

    目录 一、Sentinel 1.1、背景:雪崩问题 1.2、雪崩问题的解决办法 1.2.1、超时处理 缺陷:为什么这里只是 “缓解” 雪崩问题,而不是百分之百解决了雪问题呢? 1.2.2、舱壁模式 缺陷:资源浪费 1.2.3、熔断降级 1.2.4、流量控制 误区:那是不是只用流量控制就可以,前面三种方法

    2024年02月07日
    浏览(33)
  • SpringCloud小项目——订单积分商城 & 使用Nacos、Open Feign、Gateway、Sentinel技术栈

    使用Nacos、Open Feign、Gateway、Sentinel技术栈实现XX公司订单、库存、积分的案例开发,以下是服务调用关系 git代码:https://gitee.com/pet365/spring-cloud-goods https://github.com/RainbowForest/e-commerce-microservices https://awesomeopensource.com/project/RainbowForest/e-commerce-microservices 使用Nacos、Open Feign、Gate

    2024年02月08日
    浏览(44)
  • 数据依赖和控制依赖 Data Dependence and Contol Dependence

    数据依赖和控制依赖分析是许多优化的重要工具,比如指令调度、激进死代码删除(ADCE)等。 数据依赖是数据流之间的一种依赖,主要包括四种(参考鲸书)。 1.流依赖/真依赖( flow/true dependence ):S1定义了一个值,随后S2使用了这个值。记 S 1   δ f   S 2 S1 delta^f S2 S 1

    2024年02月09日
    浏览(60)
  • 解决使用conda env create -f environment.yml安装依赖包时Installing pip dependencies过慢的问题

    问题描述 使用conda env create -f environment.yml安装依赖包时,会遇到Installing pip dependencies过慢的问题。这是由于没有使用镜像源。如下图所示 解决方案 可以尝试对environment.yml文件进行以下修改,添加镜像源即可: 将channels改为(注意要把default去掉): 并在pip的依赖包里添加上镜

    2024年02月12日
    浏览(51)
  • 什么是依赖注入(Dependency Injection)?

    依赖注入(Dependency Injection,简称DI)是一种设计模式,用于实现类之间的解耦和依赖关系的管理。它通过将依赖关系的创建和维护责任转移到外部容器中,使得类不需要自己实例化依赖对象,而是由外部容器动态地注入依赖。 传统的对象创建方式往往由类自身负责创建和管

    2024年02月15日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包