Springboot整合 Spring Cloud Alibaba Sentinel

1.Sentinel介绍

官方文档地址:
https://sentinelguard.io/zh-cn/docs/introduction.html
https://github.com/alibaba/Sentinel/wiki/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8

Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。

2.下载Sentinel控制台

注:根据版本关系选择Sentinel版本
https://sca.aliyun.com/docs/2023/overview/version-explain/?spm=5176.29160081.0.0.748065cbd69hSu
控制台下载地址:https://github.com/alibaba/Sentinel/releases
本人Spring Cloud Alibaba版本是 2023.0.0.0-RC1所以选择Sentinel版本为sentinel-dashboard-1.8.6.jar

在这里插入图片描述

3.启动Sentinel控制台

通过命令:java -jar .\sentinel-dashboard-1.8.6.jar
默认端口为8080
访问控制台http://localhost:8080/#/login。 账密默认为sentinel/sentinel

启动日志:

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

设置端口为8088 以及 修改账密为 test/123456 启动Sentinel
Powershell窗口
java '-Dserver.port=8088' '-Dsentinel.dashboard.auth.username=test' '-Dsentinel.dashboard.auth.password=123456' -jar .\sentinel-dashboard-1.8.6.jar

cmd窗口
java -Dserver.port=8088 -Dsentinel.dashboard.auth.username=test -Dsentinel.dashboard.auth.password=123456 -jar D:\sentinel\sentinel-dashboard-1.8.6.jar

启动日志:

在这里插入图片描述

更多控制台配置项可查看地址:	https://github.com/alibaba/Sentinel/wiki/%E6%8E%A7%E5%88%B6%E5%8F%B0

在这里插入图片描述

也可以写一个bat批处理文件,双击运行,不用每次都写命令:

在这里插入图片描述

在这里插入图片描述

4.整合Sentinel

1.引入SpringCloud Alibaba sentinel依赖
<dependencies>
    <!-- SpringCloud Alibaba sentinel-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    </dependency>
</dependencies>
2.
添加yml配置,为项目模块设置sentinel控制台地址
配置好之后,先访问项目模块中的一个接口然后可在Sentinel控制台中查看
spring:
  application:
    name: @artifactId@
  profiles:
    active: ${profiles.active}
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
      config:
        server-addr: ${spring.cloud.nacos.discovery.server-addr}
    sentinel:
      transport:
        dashboard: 127.0.0.1:8088
        web-context-unify: false #流控模式为链路时将调用链路放开,不进行默认收敛

在这里插入图片描述

5.Sentinel控制台规则介绍

1)实时监控

查看每个接口QPS信息

在这里插入图片描述

2)簇点链路

实时的去拉取指定客户端(显示到sentinel控制台的服务)接口的运行情况。它一共提供两种展示模式:一种用树状结构展示资源的调用链路,另外一种则不区分调用链路展示资源的实时情况。
注意: 簇点链路监控是内存态的信息,它仅展示启动后调用过的资源。

3)流控规则(flow control)

监控应用流量的QPS或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。
应用场景:应对洪峰流量:秒杀,大促,下单,订单回流处理,付费场景,Api Gateway 网关。
通常会在服务提供端进行流控。
3.1)QPS
每秒请求数,就是说服务器在一秒的时间内处理了多少个请求。

设置每秒超过2个请求便进行流控:

在这里插入图片描述

多余的请求被流控:

在这里插入图片描述

自定义流控信息:
@SentinelResource注解介绍:https://github.com/alibaba/Sentinel/wiki/%E6%B3%A8%E8%A7%A3%E6%94%AF%E6%8C%81
@GetMapping("/testUser")
    @SentinelResource(value = "testUser",blockHandlerClass = {BlockHandler.class},blockHandler = "flowBlockHandler")
    public AjaxResult user() {
        AjaxResult ajax = AjaxResult.success();
        return ajax;
    }
public class BlockHandler {

    public static AjaxResult flowBlockHandler(BlockException blockException){
        AjaxResult ajax = AjaxResult.error("服务器繁忙,请稍后再试");
        return ajax;
    }

}
流控信息如下:

在这里插入图片描述

3.2)并发线程数
并发数控制通常在调用端进行配置。
用于保护业务线程池不被慢调用耗尽。Sentinel并发控制不负责创建和管理线程池,而是简单统计当前请求上下文的线程数目(正在执行的调用数目),如果超出阈值,新的请求会被立即拒绝。
QPS设置1和并发线程数设置为1区别:
QPS:每秒请求数为1。
并发线程数:当我第一个请求进来,如果一直在处理中,没有响应。其他请求会被排除。等第一个请求处理完了,其他才会进来。

在这里插入图片描述

接口处理逻辑睡眠2s钟:
@GetMapping("/testUser")
    @SentinelResource(value = "testUser",blockHandlerClass = {BlockHandler.class},blockHandler = "flowBlockHandler")
    public AjaxResult user() {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        AjaxResult ajax = AjaxResult.success();
        return ajax;
    }
流控信息如下:

在这里插入图片描述

3.3)流控模式
基于调用关系的流量控制。调用关系包括调用方、被调用方;一个方法可能会调用其他方法,形成一个调用链路的层次关系。

直接:接口调用达到设置的阈值后直接被流控抛出异常。

关联:当两个接口之间具有资源争抢或者依赖关系的时候,这两个接口便有了关联。比如对数据库同一个字段的读操作和写操作存在争抢,读的速度过高会影响写的速度,写的速度过高会影响读的速度。如果放任读写操作争抢资源,则争抢本身带来的开销会降低整体的吞吐量。可使用关联限流来避免具有关联关系的资源之间过度的争抢,举例来说,read_db和write_db这两个资源分别代表数据库读写,我们可以给read_db设置限流规则来达到写优先的目的。

准备两个方法:写方法addTest、读方法getTest
	@GetMapping("/addTest")
    @SentinelResource(value = "addTest",blockHandlerClass = {BlockHandler.class},blockHandler = "flowBlockHandler")
    public AjaxResult addTest() {
        AjaxResult ajax = AjaxResult.success();
        return ajax;
    }

    @GetMapping("/getTest")
    @SentinelResource(value = "getTest",blockHandlerClass = {BlockHandler.class},blockHandler = "flowBlockHandler")
    public AjaxResult getTest() {
        AjaxResult ajax = AjaxResult.success();
        return ajax;
    }
如果addTest 接口每秒钟访问超过2次,则对getTest 进行限流。

在这里插入图片描述

借助JMeter进行测试

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

当JMmeter执行addTest时,访问getTest。会发现getTest被流控。

在这里插入图片描述

链路:根据调用链路入口限流。
当一个业务方法被多个请求调用,可以通过配置该方法使某一个请求进行流控。

addTest 调用testFun
getTest 调用testFun
@Component
public class SysLoginService {
	@SentinelResource(value = "testFun",blockHandlerClass = {BlockHandler.class},blockHandler = "flowBlockHandler")
    public AjaxResult testFun(){
        return AjaxResult.success("业务方法");
    }
}
	@GetMapping("/addTest")
    @SentinelResource(value = "addTest",blockHandlerClass = {BlockHandler.class},blockHandler = "flowBlockHandler")
    public AjaxResult addTest() {
        return loginService.testFun();
    }

    @GetMapping("/getTest")
    @SentinelResource(value = "getTest",blockHandlerClass = {BlockHandler.class},blockHandler = "flowBlockHandler")
    public AjaxResult getTest() {
        return loginService.testFun();
    }

在这里插入图片描述

对testFun方法资源进行设置,当每秒钟超过2次调用该方法资源,则对addTest进行流控。

在这里插入图片描述

addTest被流控:

在这里插入图片描述

getTest都可以正常访问:

在这里插入图片描述

3.4)流控效果
快速失败:默认的流控效果,当QPS超过任意规则的阈值后,新的请求就会被立即拒绝,拒绝方式为抛出FlowException,这种方式适用于对系统处理能力确切已知的情况下,比如通过压测确定了系统的准确水位时。

Warm Up(激增流量):即预热/冷启动方式。当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过“冷启动”让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮。
冷加载因子:codeFactor默认为3,即请求QPS从threshold(阈值)/3开始,经预热时长逐渐升至设定的QPS阈值。

以下配置指:5秒钟后才会一次性接受10个请求:

在这里插入图片描述

多测几组会发现 结果会在设定的【预热时长】基础上加个2s左右。

第一组测试结果:

在这里插入图片描述

第二组测试结果:

在这里插入图片描述

在这里插入图片描述

排队等待(脉冲流量):会严格控制请求通过的间隔时间,即让请求以均匀的速度通过。
主要用于处理间隔性突发的流量,例如消息队列,在某一秒有大量的请求到来,而接下来的几秒钟则处于空闲状态。我们希望系统能够在接下来的空闲期间逐渐处理这些请求,而不是在第一秒直接拒绝多余的请求。
注:暂不支持QPS > 1000的场景。

通过JMeter模拟脉冲流量

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

测试结果:拒绝的QPS都为0,表明在超时时间5s内,所有的QPS都被处理。

在这里插入图片描述

进一步验证:同样的JMeter设置,改变流控效果,设置为快速失败,会发现每秒钟超过5个请求的被流控。

在这里插入图片描述

在这里插入图片描述

4)熔断降级

通常在服务消费端进行配置。

熔断降级官方介绍地址:https://github.com/alibaba/Sentinel/wiki/%E7%86%94%E6%96%AD%E9%99%8D%E7%BA%A7
概述:
除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。一个服务常常会调用别的模块,可能是另外的一个远程服务、数据库,或者第三方 API 等。例如,支付的时候,可能需要远程调用银联提供的 API;查询某个商品的价格,可能需要进行数据库查询。然而,这个被依赖服务的稳定性是不能保证的。如果依赖的服务出现了不稳定的情况,请求的响应时间变长,那么调用服务的方法的响应时间也会变长,线程会产生堆积,最终可能耗尽业务自身的线程池,服务本身也变得不可用。
4.1)熔断策略
慢调用比例:选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。

最大RT:单位ms,当前资源接口允许的最大响应时间,大于当前设置的时间,就属于慢调用。
比例阈值:出现慢调用的比例(0-1之间),比如设置为0.1表示,10次请求出现一次就会熔断。
熔断时长:进入熔断状态的时长(单位s)。熔断时长过完之后,熔断器进入半开状态,如果再次请求响应时间大于设置的最大 RT,直接进入熔断状态。
最小请求数:最少请求的次数。
统计时长:单位ms,在这个时长之内请求的数目。


测试:在统计时长1s请求10次,如果出现1次慢调用则进入熔断。熔断时长为10s。

在这里插入图片描述

接口睡眠3s:
@GetMapping("/testUser")
    @SentinelResource(value = "testUser",blockHandlerClass = {BlockHandler.class},blockHandler = "flowBlockHandler")
    public AjaxResult user() {
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        AjaxResult ajax = AjaxResult.success();
        return ajax;
    }
通过JMeter进行测试:
猜想:JMeter请求10次,在浏览器中进行第11次调用,此时会进入熔断。10s后会进行一次请求并成功,但再次请求会直接熔断。

在这里插入图片描述

验证结果如下:
10次都请求成功

在这里插入图片描述

当我在浏览器请求第11次:

在这里插入图片描述

10s过后请求一次:请求成功

在这里插入图片描述

再进行一次请求:直接熔断

在这里插入图片描述

异常比例:当单位统计时长内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。

比例阈值:出现异常的比例(0-1之间),比如设置为0.1表示,10次请求出现一次异常就会熔断。
熔断时长:进入熔断状态的时长(单位s)。熔断时长过完之后,熔断器进入半开状态,如果再次请求还是报异常,直接进入熔断状态。
最小请求数:最少请求的次数。
统计时长:单位ms,在这个时长之内请求的数目。

和慢调用比例一样的测试方法。只是java方法体内抛出的是异常,这里就不进行测试记录了。


异常数:当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。

异常数:出现异常的次数。
熔断时长:进入熔断状态的时长(单位s)。熔断时长过完之后,熔断器进入半开状态,如果再次请求还是报异常,直接进入熔断状态。
最小请求数:最少请求的次数。
统计时长:单位ms,在这个时长之内请求的数目。

和异常比例一样的测试方法。只是将比例换成了次数。这里就不进行测试记录了。

5)整合OpenFeign进行降级

当服务消费者 调用 服务提供者的时候,如果服务提供者发生异常,对这个服务提供者进行降级处理。

前提:nacos/sentinel/openfeign依赖都已添加。

1.yml配置文件开启OpenFeign对Sentinel的支持。
#openfeign整合sentinel
feign:
  sentinel:
    enabled: true
2.添加OpenFeign接口的fallback实现类,这个类必须实现OpenFeign的接口。

在这里插入图片描述

3.在OpenFeign接口的@FeignClient中添加fallback配置,并指向该OpenFeign接口的fallback实现类。

在这里插入图片描述

4.在服务提供者方法体中加入异常代码
@RequestMapping(value = "/feignIgnore/selectUserByUserName", method = RequestMethod.GET)
public SysUser selectUserByUserName(@RequestParam(value = "userName") String userName) {
    int a = 1/0;
    return userService.selectUserByUserName(userName);
}
测试结果:断点进入降级方法。

在这里插入图片描述

6)热点规则

热点参数限流官方地址:https://github.com/alibaba/Sentinel/wiki/%E7%83%AD%E7%82%B9%E5%8F%82%E6%95%B0%E9%99%90%E6%B5%81
在一个接口当中,某个参数的某些值访问量大,其他的值访问量平缓,这样可以针对某些访问量大的值进行流控。

以下配置为:id为5 和 6 这两个值,当每秒访问超过2次则进行限流。其他的值在每秒访问超过10次才会限流。

在这里插入图片描述

测试结果:

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

其他值:在第11次时被流控。

在这里插入图片描述

7)系统规则(兜底防护方案)

热点参数限流官方地址:https://github.com/alibaba/Sentinel/wiki/%E7%B3%BB%E7%BB%9F%E8%87%AA%E9%80%82%E5%BA%94%E9%99%90%E6%B5%81
Sentinel 系统自适应过载保护从整体维度对应用入口流量进行控制,结合应用的 Load、CPU 使用率、总体平均 RT、入口 QPS 和并发线程数等几个维度的监控指标,通过自适应的流控策略,让系统的入口流量和系统的负载达到一个平衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。

当遇到规则难配,强弱依赖难梳理时结合系统指标和服务容量,自适应动态调整流量。	

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

无需指定资源,直接在系统规则模块进行添加:

在这里插入图片描述

8)规则持久化

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

探索共享内存:解锁并发编程的潜力

文章目录 序言shm 原理对shm的理解通过代码认识shm调用shmget方法实现 序言 system V版本 指定的一种规则(俗话说一流公司定规则,二流公司重服务,三流公司重技术).这个规则虽然有很多种(消息队列,共享内存等只是比较出名的几个).但是在内核的相关技术解决上是类似的,因为都是基…

吴恩达 深度学习 神经网络 softmax adam 交叉验证

神经网络中的层&#xff1a;输入层&#xff08;layer 0&#xff09;、隐藏层、卷积层&#xff08;看情况用这个&#xff09;、输出层。&#xff08;参考文章&#xff09; 激活函数&#xff1a; 隐藏层一般用relu函数&#xff1b; 输出层根据需要&#xff0c;二分类用sigmoid&…

Selenium 自动化 —— 一篇文章彻底搞懂XPath

更多关于Selenium的知识请访问“兰亭序咖啡”的专栏&#xff1a;专栏《Selenium 从入门到精通》 文章目录 前言 一、什么是xpath&#xff1f; 二、XPath 节点 三. 节点的关系 1. 父&#xff08;Parent&#xff09; 2. 子&#xff08;Children&#xff09; 3. 同胞&#xff08;S…

[Algorithm][回溯][全排列][子集] + 回溯原理 详细讲解

目录 0.原理讲解1.全排列1.题目链接2.算法原理详解3.代码实现 2.子集1.题目链接2.算法原理详解3.代码实现 0.原理讲解 回溯算法通常⽤于解决组合问题、排列问题和搜索问题等回溯算法的基本思想&#xff1a; 从⼀个初始状态开始&#xff0c;按照⼀定的规则向前搜索&#xff0c;…

怎么下载抖音直播视频 怎么解析直播间链接的视频录制保存

尊敬的读者们&#xff0c;你们好&#xff01;今天我们将探讨一个非常实用的技巧——如何下载直播视频。随着网络技术的发展&#xff0c;直播视频已经成为我们日常生活中不可或缺的一部分。无论是观看比赛、欣赏音乐会还是探索新的美食&#xff0c;直播视频都为我们提供了更直观…

【qt】最快的开发界面效率——混合编程

混合编程 一.准备工作1.创建项目2.添加项目资源 二.ui界面设计1.menuBar菜单栏2.action ▲3.toolBar工具栏4.中心组件 三.代码界面设计1.toolBar添加组件2.statusBar状态栏添加组件 四.完成界面的功能1.对action配置信号槽2.对action转到信号槽3.代码添加的组件手动关联槽函数 …

YOLOv8+CLIP实现图文特征匹配

本文通过结合YOLOv8s的高效物体检测能力与CLIP的先进图像-文本匹配技术&#xff0c;展示了深度学习在处理和分析复杂多模态数据中的潜力。这种技术的应用不仅限于学术研究&#xff0c;还能广泛应用于工业、商业和日常技术产品中&#xff0c;以实现更智能的人机交互和信息处理。…

第四届微调——炼丹

学习地址&#xff1a;Tutorial/xtuner/README.md at main InternLM/Tutorial GitHub 笔记 微调是一种在已有的预训练模型基础上&#xff0c;通过使用新的数据对模型进行进一步优化和调整的技术手段。它的目的是使模型能够更好地适应特定的应用场景和任务需求&#xff0c;进一…

IDEA切换分支

方法一 1、选择要切换分支的module 2、右键&#xff0c;选择git 3、再点击branches 4、可以看到当前module的本地分支&#xff08;local Branches&#xff09;及远程分支&#xff08;Remote Branches&#xff09;列表。点击你要切换到的分支,Checkout即可。 方法二 1、点击…

MFC编程之设计美丽的对话框

目录 写在前面&#xff1a; Part 1&#xff1a;美美的设计一下计算器的布局 1.描述文字&#xff1a; ​编辑 2.ID&#xff1a; Part 2&#xff1a;美美熟悉一下计算器的工作流程 Part 3&#xff1a;美美设计一下控件功能 1.edit control&#xff1a; 2.相关变量初始化&…

Copilot for Microsoft 365 扩充新增 16 种语言

最近&#xff0c;微软公司发布公告&#xff0c;进一步扩大 Copilot for Microsoft 365 语言支持&#xff0c;新增 16 种&#xff0c;支持的语言总数达到 25 种。 新支持的语言如下&#xff1a; 阿拉伯语 捷克语 丹麦语 荷兰语 芬兰语 希伯来语 匈牙利语 韩语 挪威语&am…

Java面试之分布式篇

分布式锁的实现方案 &#xff08;1&#xff09;用数据库实现分布式锁比较简单&#xff0c;就是创建一张锁表&#xff0c;数据库对字段作唯一性约束。加锁的时候&#xff0c;在锁表中增加一条记录即可&#xff1b;释放锁的时候删除锁记录就行。如果有并发请求同时提交到数据库&…

二分判定+选插冒排序+归并快速堆希尔+计数排序

二分力扣题 一&#xff1a;搜索二维矩阵 74. 搜索二维矩阵 按照题意&#xff1a;直接利用二维数组转换成一维数组进行求解 方法一&#xff1a;普通等于的二分查找 class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {t…

Shell编程之循环语甸与函数

for 遍历循环 1&#xff09;for 变量 in 取值列表 for i in $(seq 1 10) do 命令序列 .... done 2&#xff09;for ((变量初始值; 变量范围; 变量的迭代方式)) for ((i1; i<10; i)) do 命令序列 .... done IFS for循环取值列表分隔符 set | grep IFS …

SSH常用功能介绍-高级功能

一、介绍 SSH&#xff08;Secure Shell&#xff09;是一种用于远程登录和执行命令的网络协议&#xff0c;它提供了加密的连接&#xff0c;保证了数据的安全性。除了基本的远程登录功能外&#xff0c;SSH还提供了许多高级功能&#xff0c;以下是一些常用的高级功能介绍&#xf…

Redis集群安装

将Redis安装包分别上传到3个文件夹&#xff0c;并解压缩 #编译并指定安装目录 cd /root/usr/local/redis-cluster/redis-7001/redis-6.2.6/ make make PREFIX/root/usr/local/redis-cluster/redis-7001 install # cd /root/usr/local/redis-cluster/redis-7002/redis-6.2.6/ m…

FreeRTOS二值信号量

目录 一、信号量的概念 1、信号量的基本概念 2、信号量的分类 二、二值信号量简介 三、二值信号量相关API 1、创建二值信号量 2、释放二值信号量 3、获取二值信号量 四、二值信号量实操 1、实验需求 2、CubeMX配置 3、代码实现 一、信号量的概念 1、信号量的基本概…

使用 CloudFlare 后如何才能不影响搜索引擎蜘蛛爬虫

今天,明月给大家再次详细讲解一下,明月在使用 CloudFlare 后如何才能不影响搜索引擎蜘蛛爬虫对站点的抓取,因为这是很多首次使用 CloudFlare 的站长们容易忽略和触犯的问题,并不是 CloudFlare 不友好,而是 CloudFlare 的防火墙(WAF)实在是太给力。其实在【CloudFlare 如…

IDEA及Maven配置代理及Maven中央仓库配置详解

一、配置代理 首先&#xff0c;需要本地开启代理入口&#xff0c;如图。 这个跟你使用代理软件有关。像我使用的是qv2ray。 其次&#xff0c;idea配置代理&#xff0c;如图。 1.1 idea配置代理 打开Settings&#xff0c;如图 1.2 maven配置代理 maven配置代理&#xff0c;修…

2024湖南理工学院程序设计竞赛(同步赛) G. 区间递减(思维题 分类讨论 ST表)

题目 https://ac.nowcoder.com/acm/contest/82672/G 思路来源 出题人 涼風青葉7代码 题解 注意到三种情况即可&#xff0c; 第一种情况&#xff0c;10 9 8 1 2&#xff0c;保留1 第二种情况&#xff0c;6 5 10 9 4 4&#xff0c;保留5 4 4 第三种情况&#xff0c;6 5 4&…