Spring Cloud Alibaba-Sentinel熔断降级

news2024/11/23 15:29:11

Sentinel: 轻量级的流量控制、熔断降级Java库, 分布式系统的流量防卫兵。

文章目录

  • 一、Sentinel 是什么?
  • 二、安装Sentinel控制台
  • 三、Sentinel 实战
    • 3.1、准备工作
    • 3.2、流控规则
      • 快速失败
      • Warm Up
      • 匀速排队
    • 3.3、热点key限流
    • 3.4、降级规则
    • 3.5、系统规则
  • 四、补充完善
    • 4.1、自定义服务降级处理逻辑
    • 4.2、规则持久化
    • 4.3、同类组件对比

一、Sentinel 是什么?

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、流量路由、熔断降级、系统自适应过载保护、热点流量防护等多个维度保护服务的稳定性。

Sentinel 具有以下特征(来自中文官网)

丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Apache Dubbo、gRPC、Quarkus 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。同时 Sentinel 提供 Java/Go/C++ 等多语言的原生实现。
完善的 SPI 扩展机制:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。

Sentinel 主要特性:
在这里插入图片描述

Sentinel生态组件:

在这里插入图片描述

Sentinel 分为两个部分:

  • 核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
  • 控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。

二、安装Sentinel控制台

Sentinel 下载地址:点击下载,下载后,运行jar包

在这里插入图片描述
浏览器输入localhost:8080,登录账号密码均为sentinel,登录成功。

在这里插入图片描述

三、Sentinel 实战

3.1、准备工作

新建Model:cloud-alibaba-sentinel-service,pom文件添加依赖:

 <!--SpringCloud ailibaba nacos -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--SpringCloud ailibaba sentinel-datasource-nacos 持久化-->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>
        <!--SpringCloud ailibaba sentinel -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        <!--openfeign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!-- SpringBoot整合Web组件+actuator -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--日常通用jar包配置-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>4.6.3</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.swc.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </dependency>

新增配置文件application.yml

server:
  port: 8401
  
spring:
  application:
    name: cloud-alibaba-sentinel-service
  cloud:
    nacos:
      discovery:
        server-addr: 182.92.122.196:1111  #Nacos集群服务注册中心地址
    sentinel:
      transport:
        dashboard: localhost:8080    #Sentinel dashboard地址
        port: 8719    #默认8719端口,假如被占用会自动从8719开始依次+1扫描,直至找到未被占用的端口
        
management:
  endpoints:
    web:
      exposure:
        include: '*'

主启动类:

/**
 * @Auther: songweichao
 * @Date: 2023-05-17 10:37
 * @Description:
 */
@EnableDiscoveryClient
@SpringBootApplication
public class SentinelMain {

    public static void main(String[] args) {
        SpringApplication.run(SentinelMain.class,args);
    }
}

业务类

/**
 * @Auther: songweichao
 * @Date: 2023-05-17 10:38
 * @Description:
 */
@RestController
@Slf4j
public class HelloController {


    @GetMapping("/hello")
    public String hello() {
        return "Hello,Day Day UP";
    }

    @GetMapping("/hi")
    public String hi() {

        return "Hi,Good Good Study";
    }
}

启动应用,因为Sentinel采用的懒加载,任意访问一个清求,才能看到Sentinel控制台如图所示,成功部署。

在这里插入图片描述

3.2、流控规则

流量控制(flow control),其原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。

点击“流控规则”,新增流控规则:

在这里插入图片描述
参数释义:

  • 资源名:唯一名称,默认请求路径。

  • 针对来源: Sentinel可以针对调用者进行限流,填写微服务名,默认default (不区分来源)

  • 阈值类型/单机闻值:

    1. QPS(每秒钟的请求数量): 当调用该api的QPS达到阈值的时候,进行限流。
    2. 线程数:当调用该api的线程数达到闻值的时候,进行限流
  • 是否集群:不需要集群。

  • 流控模式:

    1. 直接: api达到限流条件时,直接限流;
    2. 关联:当关联的资源达到阈值时,就限流自己;
    3. 链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流) [api级别的针对来源]
  • 流控效果:

    1. 快速失败: 直接失败,抛异常;
    2. Warm Up: 根据codeFactor(冷加载因子,默认为3)的值,从阈值/odeFactor,经过预热时长,才达到设置的QPS阈值;
    3. 排队等待:匀速排队,让请求以匀速的速度通过,阈值类型必须设置为QPS,否则无效;

快速失败

直接拒绝(RuleConstant.CONTROL_BEHAVIOR_DEFAULT)方式是默认的流量控制方式,当QPS超过任意规则的阈值后,新的请求就会被立即拒绝,拒绝方式为抛出FlowException。这种方式适用于对系统处理能力确切已知的情况下,比如通过压测确定了系统的准确水位时。

在这里插入图片描述
快速点击访问http://localhost:8401/hello,结果如图所示。

在这里插入图片描述
Blocked by Sentinel (flow limiting) 是Sentinel的默认失败结果。

Warm Up

Warm Up(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)方式,即预热/冷启动方式。当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮。

通常冷启动的过程系统允许通过的 QPS 曲线如下图所示:

在这里插入图片描述
公式:阈值除以coldFactor(默认值为3),经过预热时长后才会达到阈值;

添加配置,默认coldFactor为3,即请求 QPS 从10 / 3 = 3开始,经预热时长 6s 逐渐升至设定的 QPS 阈值。
作用效果是阈值变化 3-10,经过6S。

在这里插入图片描述
不停刷新访问http://localhost:8401/hi ,刚开始阈值小,会有快速失败,慢慢阈值变大,不再出现;

在实时监控,可以看到效果如图:

在这里插入图片描述

匀速排队

匀速排队(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)方式会严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法。

该方式的作用如下图所示:
在这里插入图片描述
添加配置,测试:
在这里插入图片描述
在实时监控,可以看到,QPS设置为2,当有多个请求是,会拒绝超过2个以外的请求,去排队完成。

在这里插入图片描述

这种方式主要用于处理间隔性突发的流量,例如消息队列。在某一秒有大量的请求到来,而接下来的几秒则处于空闲状态,我们希望系统能够在接下来的空闲期间逐渐处理这些请求,而不是在第一秒直接拒绝多余的请求。

3.3、热点key限流

热点即经常访问的数据,很多时候我们希望统计或者限制某个热点数据中访问频次最高的TopN数据,并对其访问进行限流或者其它操作;

    @GetMapping("/testHotKey")
    @SentinelResource(value = "testHotKey",blockHandler = "testHotKeyHandler")
    public String testHotKey(@RequestParam(value = "v1",required = false) String v1,
                             @RequestParam(value = "v2",required = false) String v2){
        return "------测试热点数据";
    }

    public String testHotKeyHandler(String v1,String v2,BlockException exception)
    {
        return "-----热点数据访问失败回调";
    }

新增配置:

在这里插入图片描述

限流模式只支持QPS模式。

SentinelResource注解的方法参数索引,0代表第一个参数,1代表第二个参数......

单机阀值以及统计窗口时长表示在此窗口时间超过阀值就限流。

上图配置中第一个参数有值的话,1秒的QPS为1,超过就限流,限流后调用testHotKeyHandler方法。

我们期望v1参数当它是某个特殊值123时,它的限流值和平时不一样,QPS能到了20;

快速点击访问 测试:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

需要注意的是注解@SentinelResource和方法中运行时异常:

@SentinelResource 处理的是Sentinel控制台配置的违规情况,有blockHandler方法配置的兜底处理;

RuntimeException是java运行时报出的运行时异常RunTimeException,@SentinelResource不管

@SentinelResource主管配置出错,运行出错该走异常走异常。

3.4、降级规则

Sentinel 熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。

当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认行为是抛DegradeException)。

和Hystrix相比较,Sentinel的断路器是没有半开状态的。

在这里插入图片描述

  1. 慢调用比例

选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。

    @GetMapping("/RT")
    public String testRT() {
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        log.info("测试RT");
        return "test--RT";
    }

在这里插入图片描述

在这里插入图片描述

  1. 异常比列(秒级)

QPS >= 5 且异常比例(秒级统计)超过阈值时,触发降级;时间窗口结束后,关闭降级

   @GetMapping("/testY")
    public String testY() {
        log.info("testY 测试异常比例");
        int age = 10/0;
        return "******测试异常比例******";
    }

在这里插入图片描述

调用就报错:单独访问,来一次报错一次(int age = 10/0),调一次错一次;

在这里插入图片描述
用postman测试:开启20个进程,200ms完成,同时浏览器访问

在这里插入图片描述
高并发发送请求,多次调用达到我们的配置条件。断路器开启(保险丝跳闸),微服务不可用了,不再报错error而是服务降级。

在这里插入图片描述

  1. 异常数(分钟级)

异常数(分钟统计)超过阈值时,触发降级;时间窗口结束后,关闭降级

异常数,好理解,就是累积异常数,从而触发服务降级。

在这里插入图片描述

3.5、系统规则

系统保护规则是从应用级别的入口流量进行控制,从单台机器的 load、CPU 使用率、平均 RT、入口 QPS 和并发线程数等几个维度监控应用指标,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。

系统保护规则是应用整体维度的,而不是资源维度的,并且仅对入口流量生效。入口流量指的是进入应用的流量(EntryType.IN),比如 Web 服务或 Dubbo 服务端接收的请求,都属于入口流量。

系统规则支持以下的模式:

  • Load 自适应(仅对 Linux/Unix-like 机器生效):系统的 load1 作为启发指标,进行自适应系统保护。当系统 load1 超过设定的启发值,且系统当前的并发线程数超过估算的系统容量时才会触发系统保护(BBR 阶段)。系统容量由系统的 maxQps * minRt 估算得出。设定参考值一般是 CPU cores * 2.5。
  • CPU usage(1.5.0+ 版本):当系统 CPU 使用率超过阈值即触发系统保护(取值范围 0.0-1.0),比较灵敏。
  • 平均 RT:当单台机器上所有入口流量的平均 RT 达到阈值即触发系统保护,单位是毫秒。
  • 并发线程数:当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。
  • 入口 QPS:当单台机器上所有入口流量的 QPS 达到阈值即触发系统保护。

在这里插入图片描述

四、补充完善

4.1、自定义服务降级处理逻辑

可以添加一个配置类,用来做服务降级的兜底方法,在需要使用的地方,引入即可。

/**
 * @Auther: songweichao
 * @Date: 2023-05-17 11:37
 * @Description:
 */
public class CustomerBlockHandler {

    public static CommonResult handleException(BlockException exception){
        return new CommonResult(2023,"自定义的限流处理信息......CustomerBlockHandler");
    }

}
    /**
     * 自定义通用的限流处理逻辑,
     blockHandlerClass = CustomerBlockHandler.class
     blockHandler = handleException
     上述配置:找CustomerBlockHandler类里的handleException方法进行兜底处理
     */
    /**
     * 自定义通用的限流处理逻辑
     */
    @GetMapping("/rateLimit/customerBlockHandler")
    @SentinelResource(value = "customerBlockHandler",
            blockHandlerClass = CustomerBlockHandler.class, blockHandler = "handleException")
    public CommonResult customerBlockHandler()
    {
        return new CommonResult(200,"成功访问");
    }

4.2、规则持久化

经过多次的配置测试,一旦重启应用,sentinel规则将消失,而生产环境需要将配置规则进行持久化。

怎么做呢?

将限流配置规则持久化进Nacos保存,只要访问谋而请求,sentinel控制台的流控规则就能从Nacos中获取到信息,只要Nacos里面的配置不删除,针对sentinel上的流控规则持续有效;

实现上述效果,使用的是sentinel-datasource-nacos

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

配置中添加:

server:
  port: 8401
  
spring:
  application:
    name: cloud-alibaba-sentinel-service
  cloud:
    nacos:
      discovery:
        server-addr: 182.92.122.196:1111
    sentinel:
      transport:
        dashboard: localhost:8080
        port: 8719    #默认8719端口,假如被占用会自动从8719开始依次+1扫描,直至找到未被占用的端口
      datasource:
        ds1:
          nacos:
            server-addr: 182.92.122.196:1111
            dataId: cloud-alibaba-sentinel-service
            groupId: DEFAULT_GROUP
            data-type: json
            rule-type: flow

management:
  endpoints:
    web:
      exposure:
        include: '*'

关于配置中datasource,是将Sentinel的流控配置进行持久化到Nacos中的操作。通过在cloud-alibaba-sentinel-service的配置文件中添加json配置内容即可。

在这里插入图片描述

每次启动Sentinel后,都会从Nacos中加载配置;

4.3、同类组件对比

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/540605.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自定义组件3-behaviors

1、behaviors是小程序中用于实现组件间代码共享的特性&#xff0c;类似于Vue.js中的mixins 2、behaviors的工作方式 每个behaviors可以包含一组属性、数据、生命周期函数和方法。组件引用它时&#xff0c;它的数据和属性和方法会被 合并到组件中。 每个组件可以引用多个behav…

Python采集知某专栏文章保存成pdf

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 环境使用: Python 3.8 Pycharm wkhtmltopdf 软件 文末名片获取 模块使用: requests >>> pip install requests 数据请求 parsel >>> pip install parsel 数据解析 re >>> 内置模块 不…

【年度最强超级Ai让你体验真正的人工智能】

年度最强超级Ai让你体验真正的人工智能&#xff08;破解版&#xff09; 登录就是永久会员&#xff08;先上链接&#xff0c;资源来源于网络&#xff0c;如有侵权&#xff0c;联系删除&#xff09; 网易邮箱&#xff1a; 23402001163163.com 我用蓝奏浏览器分享了[GPT-AI助手V1…

100 个 Go 错误以及如何避免:5~8

协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【OpenDocCN 饱和式翻译计划】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 真相一旦入眼&#xff0c;你就再也无法视而不见。——《黑客帝国》 五、字符串 本章涵盖 理解GO中…

Oracle执行计划管理 - SPM

https://blog.51cto.com/lhrbest/3246884 目录 Oracle优化器辅助手段的发展 SPM需求背景 SPM重要构成 SQL计划基准捕获 如何创建SQL计划基准 如何查看SQL计划基准 SQL计划基准选择 执行计划的三个属性 如何选择SQL计划 SQL计划基准发展 SQL计划基准发展的三种选择 …

在外包干了三年,我废了……不吹不黑!

没错&#xff0c;我也干过外包&#xff0c;一干就是三年&#xff0c;三年后&#xff0c;我废了…… 虽说废的不是很彻底&#xff0c;但那三年我几乎是出差了三年、玩了三年、荒废了三年&#xff0c;那三年&#xff0c;我的技术能力几乎是零成长的。 说起这段三年的外包经历&a…

CTFShow-电子取证篇Writeup

CTFShow-电子取证篇Writeup 套的签到题&#xff1a;JiaJia-CP-1&#xff1a;JiaJia-CP-2&#xff1a;JiaJia-CP-3&#xff1a; CTFShow 平台&#xff1a;https://ctf.show/ 套的签到题&#xff1a; JiaJia-CP-1&#xff1a; 这是部分人熟知的刘佳佳同学的电脑&#xff0c;她…

JavaWeb-Servlet的学习

Servlet 简介 Servlet是JavaWeb最为核心的内容&#xff0c;它是Java提供的一门动态web资源开发技术。 使用Servlet就可以实现&#xff0c;根据不同的登录用户在页面上动态显示不同内容。 Servlet是JavaEE规范之一&#xff0c;其实就是一个接口&#xff0c;将来我们需要定义S…

SpringBoot 整合 ES 进行各种高级查询搜索

数据准备 因为本文都是数据的搜索&#xff0c;所以我们需要在我们的es服务器里先插入一些数据以供我们后面使用 esUserService public interface EsUserService extends ElasticsearchRepository<User, Integer> {}RestController public class EsController {Autowir…

HUSTOJ中添加初赛练习系统

文章目录 0. 基于hustoj二开的初赛练习系统&#xff0c;QQ4705852261. 主界面2. 练习界面3. 模拟考试界面4. 查看试卷回放5. 后台操作界面6. 后台试题分类-列表7.后台试题-列表8. 后台试题-添加9. 后台试卷结构-设置 0. 基于hustoj二开的初赛练习系统&#xff0c;QQ470585226 …

Requests请求库的使用

Request请求库 爬虫运行原理Requests请求库安装环境 Requests库的使用状态码网页内容 爬虫运行原理 首先回顾一下爬虫运作的基本原理&#xff08;下面是比较正式的书面语&#xff09;&#xff1a; 爬虫是一种自动化程序&#xff0c;用于从互联网上获取信息&#xff0c; 发起请…

蓝牙耳机啥牌子好?发烧友力荐五大超高性价比蓝牙耳机

预算有限的情况下&#xff0c;性价比是我们在购物时的主要衡量维度&#xff0c;挑选蓝牙耳机时也不例外&#xff0c;那么你知道哪些蓝牙耳机性价比最高吗&#xff1f;不懂的话可以看看老烧我整理的超高性价比蓝牙耳机推荐&#xff0c;了解蓝牙耳机啥牌子好。 一、JEET Air 2 蓝…

数据结构总结4:树、二叉树

后续会有补充 树 树是一种非线性的数据结构&#xff0c;是由n(n>0)个有限结点组成一个具有层次关系的集合。 1.有一个特殊的结点&#xff0c;称为根结点&#xff0c;根节点没有前驱结点 2.树是递归定义的 满足树的条件&#xff1a; 1.子树不相交 2.除了根结点外&#xff0…

白盒测试:如何进行代码级别的测试?

01、什么是白盒测试 白盒测试也称结构测试&#xff0c;透明盒测试。主要用于单元测试阶段&#xff0c;代码和逻辑的测试&#xff0c;重点复杂的测试&#xff0c;是一种测试用例设计方法&#xff0c;不同于黑盒测试&#xff0c;白盒测试是可以看到内部代码如何运作的&#xff0…

PDF.js实现按需加载pdf文件-包含前后端开发源码和详细开发教程

PDF.js实现按需加载pdf文件 说明前言前端项目分片加载的效果前端项目结构项目运行与访问 后端项目项目结构核心代码实现注意事项 项目源码 说明 本文主要是介绍pdf.js的前后端项目的实现&#xff0c;包含可直接运行的源码。由于本人偏向于后端开发&#xff0c;因此前端的vue方…

学习C这么久了,main函数的这三个参数你见过吗?

文章目录 &#x1f490;专栏导读&#x1f490;文章导读&#x1f427;引例1&#x1f427;引例2 &#x1f426;认识环境变量&#x1f514;环境变量的概念&#x1f514;常见的环境变量&#x1f514;和环境变量相关的指令 &#x1f426;main函数的第三个参数&#x1f514;如何通过代…

Django SQL注入漏洞复现 (CVE-2022-28347)

漏洞简介 在Django 2.2 的 2.2.28 之前版本、3.2 的 3.2.13 之前版本和 4.0 的 4.0.4 之前版本中的 QuerySet.deexplain() 中发现了SQL注入问题。这是通过传递一个精心编制的字典&#xff08;带有字典扩展&#xff09;作为**options参数来实现的&#xff0c;并将注入负载放置在…

这个插件厉害!Tapdata 格式的 api 也可以导入了

Tapdata 是干嘛的&#xff0c;大家都知道的吧&#xff1f;我简单介绍一下 Tapdata 是自带 ETL 的实时数据服务平台&#xff0c;通过把企业核心数据实时集中到中央化数据平台的方式并通过 API 或者反向同步方式&#xff0c;为下游的交互式应用、微服务或交互式分析提供新鲜实时的…

js逆向-阿里系某688参数sign分析

声明 本文仅供学习参考&#xff0c;如有侵权可私信本人删除&#xff0c;请勿用于其他途径&#xff0c;违者后果自负&#xff01; 如果觉得文章对你有所帮助&#xff0c;可以给博主点击关注和收藏哦&#xff01; 前言 目标网站&#xff1a;aHR0cHM6Ly93d3cuMTY4OC5jb20v 接…

html访问图片资源403问题

问题&#xff1a;图片403 页面不渲染 单独打开图片链接在浏览器却能正常查看 解决办法&#xff1a; 1.数据库中全局下载该字段链接&#xff0c;将图片存到制定文件夹&#xff0c;在系统内调用 2.检查页面head中的是否有此句“<metaname“referrer” content“no-referre…