微服务-- Sentinel的使用

news2024/9/29 23:39:58

目录

Sentinel:微服务的哨兵

生态系统景观

sentinel与spring cloud Hystrix 对比

Sentinel 主要分为两部分

Sentinel安装与使用

Sentinel的控制规则

流控规则

流控规则的属性说明

新增流控规则

关联流控模式

@SentinelResource注解的使用 

@SentinelResource 的主要属性

代码示例

熔断规则

慢调用比例 (SLOW_REQUEST_RATIO)

异常比例 (ERROR_RATIO)

异常数 (ERROR_COUNT)

代码示例

热点规则

热点参数限流规则的属性

代码示例

系统规则

系统规则的几种策略

代码示例


Sentinel:微服务的哨兵

随着分布式系统的普及,服务间的可靠性变得比以往更加重要。Sentinel 以“流”为切入点,从流量控制流量整形、 并发限制熔断系统自适应过载保护等多个方面进行研究,为微服务提供可靠性和弹性保障。

Sentinel 具有以下功能:

  • 丰富的应用场景:Sentinel 在阿里巴巴内部被广泛应用,几乎覆盖了近 10 年双十一的所有核心场景,比如需要限制突发流量以达到系统容量要求的秒杀、消息削峰填谷、针对下游不可靠服务的熔断、集群流控等。
  • 实时监控:Sentinel 也提供了实时监控能力,可以实时看到单台机器的运行时信息,以及 500 个节点以下集群的聚合运行时信息。
  • 广泛的开源生态系统:Sentinel 提供与常用框架和库(如 Spring Cloud、gRPC、Apache Dubbo 和 Quarkus)的开箱即用集成。您只需将适配器依赖项添加到您的服务中即可轻松使用 Sentinel。
  • 多语言支持:Sentinel 为 Java、 Go、C++和Rust提供了原生支持。
  • 多种SPI扩展:Sentinel提供了简单易用的SPI扩展接口,可以让你快速定制自己的逻辑,例如自定义规则管理,适配数据源等等。

功能概述:

生态系统景观

Sentinel 的应用场景

  • 秒杀场景:限流防止瞬时流量冲击。
  • 服务熔断与降级:当服务不可用时,快速失败,避免级联故障。
  • 系统保护:预防由于高负载引发的系统崩溃。

sentinel与spring cloud Hystrix 对比

SentinelSpring Cloud Hystrix 都是用于微服务架构中的服务容错、熔断降级、流量控制等功能的库。

特性SentinelHystrix
隔离策略信号量隔离(Semaphore)线程池隔离(Thread Pool)和信号量隔离(Semaphore)
熔断降级策略基于响应时间或失败比率基于失败比率
实时指标实现滑动窗口,基于时间维度监控滑动窗口(基于 RxJava),但更多依赖于事件流
规则配置支持多种动态数据源,如文件、Nacos、Apollo 等支持多种数据源,但集成较少
扩展性多个扩展点,便于用户定制插件形式的扩展,灵活性较低
基于注解的支持支持,如 @SentinelResource支持,如 @HystrixCommand
限流基于 QPS,支持基于调用链路的限流基础的限流支持
流量整形支持慢启动、匀速器模式不支持
系统负载保护支持,能根据系统负载(如 CPU 使用率)动态调整策略不支持
控制台开箱即用,提供规则配置、秒级监控、机器发现等功能控制台不完善,只提供简单的监控和查看
常见框架的适配适配多种框架,如 Servlet、Spring Cloud、Dubbo、gRPC适配 Spring Cloud Netflix 和基础框架

Sentinel 主要分为两部分

核心库(Java 客户端)

  • Sentinel 的核心库是一种轻量级的流量控制、熔断降级、系统保护解决方案,设计目标是不依赖任何特定的框架或库。因此,Sentinel 的核心库可以在所有 Java 运行时环境中独立运行,并且不需要特定的容器或基础设施。
  • 主要功能:
    • 限流:基于 QPS 的限流机制,可以保护服务免受突发流量的影响。
    • 熔断降级:根据响应时间、失败比率等触发熔断,防止故障扩展。
    • 系统保护:根据系统的负载(如 CPU 使用率)动态调整限流或熔断策略。
    • 集成支持:核心库可以轻松与各种微服务框架进行集成,如 DubboSpring Cloud,也能与现有的服务架构无缝适配。

控制台(Dashboard)

  • Sentinel 控制台是基于 Spring Boot 开发的一个独立应用,用于可视化的监控和管理。
  • 运行方式:它打包成一个可以直接运行的可执行 JAR 包,不需要额外的 Tomcat 或其他应用容器支持,使用非常便捷。
  • 主要功能:
    • 实时监控:可以查看每个微服务的实时请求、QPS、响应时间等指标,并展示在控制台中。
    • 规则管理:支持限流、熔断降级、系统保护等规则的动态添加、修改和删除。
    • 机器发现:自动发现并展示 Sentinel 监控的所有服务节点。

Sentinel安装与使用

Sentinel控制台的下载
下载地址:Releases · alibaba/Sentinel · GitHub

我们选择1.8.8版本,直接下载jar包

Sentinel控制台的启动

 cmd 启动jar包

java -jar sentinel-dashboard-1.8.3.jar(jar包地址)

 

访问

浏览器输入:localhost:8080
账号密码 默认都是 sentinel

注意:构建或运行仪表板需要 Java 8。

为服务打开sentinel的监控

在每个子服务的 pom.xml 文件中,添加 Sentinel 相关的依赖:

        <!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-sentinel -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
            <version>2023.0.1.0</version>
        </dependency>

配置 application.properties 以启用 Sentinel

# 服务端口
server.port=8081

# 启用 Sentinel,并连接 Sentinel Dashboard
spring.cloud.sentinel.transport.dashboard=127.0.0.1:8080
spring.cloud.sentinel.transport.port=8719  # 本地 Sentinel 客户端的监控端口
# 启用 Sentinel
spring.cloud.sentinel.enabled=true

Sentinel的控制规则

为了后续学习,写个随机生成订单号的订单接口

package cloud.service1.service;

public interface UserService {
    String generateOrder(String userId, String tenantId);
}
package cloud.service1.service.impl;

import cloud.service1.service.UserService;
import org.springframework.stereotype.Service;

import java.util.UUID;

@Service
public class UserServiceImpl implements UserService {

    @Override
    public String generateOrder(String userId, String tenantId) {
        // 使用UUID生成随机订单号
        String orderNo = generateRandomOrderNo();
        return "生成订单号: " + orderNo + ", 用户ID: " + userId + ", 租户ID: " + tenantId;
    }

    // 生成随机订单号的方法
    private String generateRandomOrderNo() {
        // 使用UUID随机生成订单号
        return "ORD-" + UUID.randomUUID().toString().replace("-", "").substring(0, 12).toUpperCase();
    }
}
package cloud.service1.controller;

import cloud.service1.service.UserService;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    // 随机生成订单号接口
    @GetMapping("generateOrder")
    public String generateOrder(String userId, String tenantId, HttpServletRequest request) {
        return userService.generateOrder(userId, tenantId);
    }
}

测试接口:

可以通过以下 URL 调用接口生成随机订单号:

http://localhost:8081/user/generateOrder?userId=12345&tenantId=67890

流控规则

流控规则的属性说明

资源名:资源名是需要限流的唯一标识,可以是方法名、API请求路径等。通过资源名,Sentinel能够对流量进行管理与控制。

针对来源:可以针对特定的调用方进行限流。例如,服务A调用服务B时,可以针对服务A的调用进行限流。默认为 default,表示不区分调用来源。

阈值类型/单机阈值:

  • QPS(每秒请求数):如果某个资源的每秒请求数超过设定的阈值,则会触发限流。
  • 线程数:当访问该资源的并发线程数达到设定的阈值时,触发限流。

是否集群:

  • 如果不需要集群模式限流,默认选择“不需要集群”。否则,可以开启集群限流。

流控模式:

  • 直接限流:一旦达到阈值,直接限流当前的请求。
  • 关联限流:当关联的其他资源达到限流条件时,限流当前的资源。例如:当/resourceA达到阈值时,/resourceB也被限流。
  • 链路限流:对入口资源进行链路限流,限制从指定入口进入的资源访问。当链路上的访问量达到阈值时,限制链路上的流量。常用于链路保护。

流控效果:

  • 快速失败:当达到限流条件时,直接抛出异常,返回失败结果。
  • Warm Up(预热):在一段时间内,逐步增加允许通过的流量,直至达到设定的 QPS 阈值。适合应用在高峰期流量突增的场景。
  • 排队等待:请求不会立即失败,而是进入排队状态,匀速通过。适用于平滑处理请求的场景,类似于“漏斗效应”。阈值类型必须为 QPS,否则无效。

新增流控规则

资源名称就是我们的接口访问路径
然后我们一秒一次访问一下接口(正常)

接下来我们快速请求接口后,发现已经被限流了

关联流控模式

关联流控 适用于多个接口之间的关联,当一个接口的流量达到限流条件时,关联的其他接口也会被限流。适合有相关依赖关系的接口。

创建接口:/user/sentinel(关联接口)

@GetMapping("sentinel")
public String sentinel() {
    return "我是关联接口";
}

在 Sentinel 控制台中,设置 /user/getOrderNo 的限流模式为 关联模式,关联资源设置为 /user/sentinel。

使用压力测试工具(如 JMeter),发送大量请求至 /user/sentinel,使其达到限流条件。

在关联流控触发时,访问 /user/getOrderNo,即使该接口本身没有超出 QPS 阈值,也会被限流。

@SentinelResource注解的使用 

@SentinelResource 注解在 Spring Cloud Alibaba 中用于定义资源的限流、熔断、降级策略,它提供了多种属性来处理不同的异常和限流场景。

@SentinelResource 的主要属性

value:资源名称,必填。定义需要进行保护的资源标识,比如接口名或方法名。

entryType:流量类型,默认是 OUT,可选 IN 和 OUT。IN 用于标记入口流量,OUT 用于标记出口流量。通常情况下,不需要显式指定,默认为 OUT。

blockHandler:处理限流或降级时的逻辑,方法名必须是 public,返回类型与原方法一致,且参数类型需要与原方法匹配,方法最后要加上 BlockException 参数。可以处理流控、熔断等情况触发的 BlockException。可以指定与原方法同类或通过 blockHandlerClass 在其他类中定义处理逻辑。

blockHandlerClass:指定限流处理方法所在的类,方法必须是 static,否则无法解析。

fallback:用于处理程序运行时发生的异常。fallback 方法处理除 exceptionsToIgnore 排除的异常外的所有异常。

  • 方法要求返回类型与原方法一致,参数与原方法匹配,或者可以在最后加上 Throwable 参数(捕获异常信息)。
  • 可以和原方法在同一个类,或通过 fallbackClass 指定其他类中的方法。

fallbackClass:指定 fallback 方法所在的类,方法必须是 static。

defaultFallback:全局通用的 fallback 方法。当未指定具体的 fallback 方法时触发,处理所有未排除的异常。

方法必须与原方法返回类型一致,并且没有参数或只有一个 Throwable 参数。

exceptionsToIgnore:指定不走 fallback 逻辑的异常,这些异常不会计入统计,直接抛出。

exceptionsToTrace:指定需要追踪的异常类型。

代码示例

要按照资源名称的方式对接口进行限流,并对限流后的请求进行友好处理,可以使用 Sentinel 中的 @SentinelResource 注解来实现。

在 generateOrder 接口上添加 @SentinelResource 注解,并提供限流后的友好处理方法 handleBlock.

package cloud.service1.controller;

import cloud.service1.service.UserService;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    // 随机生成订单号接口,限流资源名为 "generateOrder"
    @GetMapping("generateOrder")
    @SentinelResource(value = "generateOrder", blockHandler = "handleBlock")
    public String generateOrder(String userId, String tenantId, HttpServletRequest request) {
        return userService.generateOrder(userId, tenantId);
    }

    // 处理限流的逻辑
    public String handleBlock(String userId, String tenantId, HttpServletRequest request, BlockException ex) {
        // 当接口被限流时返回友好的提示信息
        return "订单生成服务繁忙,请稍后再试。";
    }
}

在 Sentinel 控制台设置如下规则:

  • 资源名: generateOrder
  • 流控模式: 直接
  • 阈值类型: QPS
  • 单机阈值: 比如 1(表示每秒最多允许 1 次请求)
  • 流控效果: 快速失败(即限流时直接失败)

在配置了限流规则后,调用 generateOrder 接口。如果请求超出限流阈值(比如每秒超过 1 次请求),则会触发限流,并返回友好提示 "订单生成服务繁忙,请稍后再试"。

熔断规则

Sentinel 的熔断规则主要分为三种策略,分别是 慢调用比例 (SLOW_REQUEST_RATIO)、异常比例 (ERROR_RATIO) 和 异常数 (ERROR_COUNT)。这些策略用于保护服务免于过载或连续的失败。

慢调用比例 (SLOW_REQUEST_RATIO)

该策略会根据请求响应的时间来判断是否进行熔断,适合用于防止因某些请求响应过慢而拖垮整个系统。

  • RT(Response Time):表示系统中允许的最大响应时间,如果一个请求的响应时间超过这个设定值,就会被判定为“慢调用”。
  • 最小请求数目:在统计周期内,只有请求数超过设定的最小请求数,才会触发熔断逻辑。
  • 熔断条件:当单位时间内(statIntervalMs)内的慢调用比例超过设定的阈值时,触发熔断,进入熔断状态。
  • 恢复机制:在熔断时长过后,进入半开状态,如果后续请求正常则关闭熔断器,如果再发生慢调用则继续熔断。

异常比例 (ERROR_RATIO)

该策略会根据异常的比例来判断是否进行熔断,适合用于当请求的失败率突然增加时,自动进行保护。

  • 最小请求数目:同样需要单位时间内的请求数达到设定的最小值,才会计算异常比例。
  • 熔断条件:当单位时间内(statIntervalMs)内的异常比例大于设定的阈值时,触发熔断,进入熔断状态。
  • 恢复机制:在熔断时长过后,进入半开状态,如果后续请求成功,则关闭熔断器,否则继续熔断。

异常数 (ERROR_COUNT)

该策略根据单位时间内的异常数量来判断是否熔断,适合用于系统中发生大量异常时的保护机制。

  • 熔断条件:当单位时间内(statIntervalMs)异常的数量超过设定的阈值后,自动熔断。
  • 恢复机制:与异常比例策略相同,熔断时长过后进入半开状态,后续请求成功关闭熔断器,失败则继续熔断。

代码示例

package cloud.service1.controller;

import cloud.service1.service.UserService;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    // 使用Sentinel进行熔断和限流的接口
    @GetMapping("/generateOrder")
    @SentinelResource(value = "generateOrder", blockHandler = "handleBlock", fallback = "handleFallback")
    public String generateOrder(String userId, String tenantId) {
        // 调用服务生成订单号
        return userService.generateOrder(userId, tenantId);
    }

    // 限流或者熔断时的处理方法
    public String handleBlock(String userId, String tenantId, BlockException ex) {
        System.out.println("系统繁忙,请稍后再试。");
        return "系统繁忙,请稍后再试。";
    }

    // 出现异常时的处理方法
    public String handleFallback(String userId, String tenantId, Throwable throwable) {
        System.out.println("订单生成失败,服务暂不可用,请稍后重试。");
        return "订单生成失败,服务暂不可用,请稍后重试。";
    }
}
package cloud.service1.service.impl;

import cloud.service1.service.UserService;
import org.springframework.stereotype.Service;

import java.util.UUID;

@Service
public class UserServiceImpl implements UserService {

    @Override
    public String generateOrder(String userId, String tenantId) {
        // 模拟可能出现的业务异常
        if (Math.random() < 0.3) {
            throw new RuntimeException("模拟的异常");
        }

        // 使用UUID生成随机订单号
        String orderNo = generateRandomOrderNo();
        return "订单生成成功: " + orderNo + ", 用户ID: " + userId + ", 租户ID: " + tenantId;
    }

    // 生成随机订单号
    private String generateRandomOrderNo() {
        return "ORD-" + UUID.randomUUID().toString().replace("-", "").substring(0, 12).toUpperCase();
    }
}

  • 正常情况下,调用 /user/generateOrder 接口将会生成随机订单号并返回。
  • 当请求过多时(超过QPS设置的阈值),接口会限流并返回 "系统繁忙,请稍后再试"。
  • 当服务抛出异常时(如模拟的业务异常),接口会执行降级并返回 "订单生成失败,服务暂不可用,请稍后重试"。

热点规则

热点规则(Hotspot Rule)是 Sentinel 中的一种限流机制,用于应对一些高频访问的资源。它根据传入参数的值来做限流,比如同一个接口如果频繁使用某个参数,导致资源过载,可以为此参数单独设置限流规则。

热点参数限流规则的属性

资源名:需要保护的接口或方法名,即 Sentinel 保护的资源。

参数索引位置:用于限流的热点参数的索引。对于多参数方法,通常指定参数的位置,从 0 开始。

阈值类型:

  • QPS(每秒请求数):当特定参数的请求数达到设定的 QPS 阈值时,进行限流。
  • 线程数:当调用线程数达到设定阈值时,进行限流。

限流模式:

  • 直接限流:直接对热点参数的请求进行限流。
  • 关联限流:如果某个关联的资源达到了限流条件,则对当前资源进行限流。

流控效果:

  • 快速失败:达到限流条件时,立即失败,抛出异常。
  • 排队等待:请求以匀速方式进行处理,超过的请求将排队等待。
  • Warm Up:随着时间逐渐增加限流阈值,适用于系统刚启动时的保护机制。

代码示例

package cloud.service1.service;

public interface UserService {
    // 生成订单号
    String generateOrder(String userId, String tenantId);
}
package cloud.service1.service.impl;

import cloud.service1.service.UserService;
import org.springframework.stereotype.Service;

import java.util.UUID;

@Service
public class UserServiceImpl implements UserService {

    @Override
    public String generateOrder(String userId, String tenantId) {
        // 生成随机订单号
        String orderNo = generateRandomOrderNo();
        return "订单号: " + orderNo + ", 用户ID: " + userId + ", 租户ID: " + tenantId;
    }

    // 生成随机订单号的方法
    private String generateRandomOrderNo() {
        return "ORD-" + UUID.randomUUID().toString().replace("-", "").substring(0, 12).toUpperCase();
    }
}
package cloud.service1.controller;

import cloud.service1.service.UserService;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    // 获取订单号的接口
    @GetMapping("generateOrder")
    @SentinelResource(value = "generateOrder", blockHandler = "handleGetOrderNoBlock")
    public String generateOrder(@RequestParam String userId, @RequestParam String tenantId) {
        return userService.generateOrder(userId, tenantId);
    }

    // 当触发限流规则时的处理方法
    public String handleGetOrderNoBlock(String userId, String tenantId, com.alibaba.csp.sentinel.slots.block.BlockException ex) {
        System.out.println("触发热点限流,用户ID: " + userId + " 的请求被限流");
        return "触发热点限流,用户ID: " + userId + " 的请求被限流";
    }
}

 

系统规则

Sentinel 中,系统规则 是一种特殊的流量控制规则,用于保护整体系统的稳定性。它主要从系统负载角度来防止流量过载,避免系统崩溃。通过对系统入口流量、系统平均响应时间等维度进行监控和限制,保障系统资源的合理使用。

系统规则的几种策略

1.LOAD (系统负载)

  • 作用:仅适用于 Linux/Unix-like 操作系统。用于限制系统的负载,防止系统超载。
  • 阈值:可以根据系统的 CPU 核心数设置,当系统的负载(即系统正在运行和等待的任务数量)超过指定阈值时,触发限流。
  • 典型设置:一般设置为 CPU 核心数的 0.7 ~ 0.9 倍。
  • 示例:如果机器是 4 核,负载阈值可以设为 3.0。

2.RT (平均响应时间)

  • 作用:限制请求的平均响应时间。适用于对响应时间敏感的场景。
  • 阈值:当单位时间(默认为 1 秒)内,系统请求的平均响应时间(Response Time, RT)超过某个阈值时,触发限流。
  • 示例:当平均响应时间超过 500 毫秒时,触发限流。

3. 线程数

  • 作用:控制系统的最大并发线程数。适用于保护系统免于过多线程被占用,避免资源耗尽。
  • 阈值:当入口的并发线程数达到阈值时,触发限流。
  • 示例:设置最大并发线程数为 200,当超过该线程数时,触发限流。

4. 入口 QPS (每秒请求数)

  • 作用:限制系统入口流量的最大 QPS(每秒查询数)。适用于限制外部流量,保障系统不被超负荷的流量攻击。
  • 阈值:当系统入口的 QPS 超过设定值时,触发限流。
  • 示例:当 QPS 超过 100 时,触发限流。

5. CPU 使用率

  • 作用:限制 CPU 使用率,防止 CPU 过载导致系统无法处理请求。
  • 阈值:当 CPU 使用率超过某个阈值时,触发限流。
  • 注意:Sentinel 本身不直接通过配置项支持 CPU 使用率限流,但可以通过系统监控和自定义的方式配合 Sentinel 实现。

注意:如果配置了系统规则,所有的接口都会被限流

代码示例

package cloud.service1.controller;

import cloud.service1.service.UserService;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    // 获取订单号的接口,受系统规则保护
    @GetMapping("/generateOrder")
    @SentinelResource(value = "generateOrder", blockHandler = "handleGenerateOrderBlock")
    public String generateOrder(@RequestParam String userId, @RequestParam String tenantId) {
        return userService.generateOrder(userId, tenantId);
    }

    // 当系统规则触发时的限流处理逻辑
    public String handleGenerateOrderBlock(String userId, String tenantId, BlockException exception) {
        // 处理被系统规则限流的情况,返回友好提示信息
        System.out.println("系统过载,请稍后再试!");
        return "系统过载,请稍后再试!";
    }
}

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

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

相关文章

如何将自己的项目发布到Maven中央仓库

1.背景 本教程为2024年9月最新版 我有一个java项目想发布到maven中央仓库&#xff0c;然后任何人都可以在pom文件中引用我写的代码 引用格式如下&#xff1a; <!-- 这是引用rocketmq的坐标 --> <dependency><groupId>org.apache.rocketmq</groupId>&l…

炫酷HTML蜘蛛侠登录页面

全篇使用HTML、CSS、JavaScript&#xff0c;建议有过基础的进行阅读。 一、预览图 二、HTML代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-w…

ESP8266做httpServer提示Header fields are too long for server to interpret

CONFIG_HTTP_BUF_SIZE512 CONFIG_HTTPD_MAX_REQ_HDR_LEN1024 CONFIG_HTTPD_MAX_URI_LEN512CONFIG_HTTPD_MAX_REQ_HDR_LEN由512改为1024

C++ | Leetcode C++题解之第404题左叶子之和

题目&#xff1a; 题解&#xff1a; class Solution { public:bool isLeafNode(TreeNode* node) {return !node->left && !node->right;}int sumOfLeftLeaves(TreeNode* root) {if (!root) {return 0;}queue<TreeNode*> q;q.push(root);int ans 0;while …

氢能源多旋翼无人机技术详解

1. 技术背景与优势 随着全球对低碳、环保和高效能源解决方案的需求日益增长&#xff0c;氢能源作为一种清洁、高效的能源形式&#xff0c;在多个领域展现出巨大的应用潜力。在无人机领域&#xff0c;氢能源多旋翼无人机因其独特的优势逐渐受到关注。相比传统锂电池无人机&…

Linux sh命令

目录 一. 基本语法二. 选项2.1 -c 字符串中读取内容&#xff0c;并执行2.1.1 基本用法2.1.2 获取当前目录下失效的超链接 2.2 -x 每个命令执行之前&#xff0c;将其打印出来2.3 结合Here文档使用 一. 基本语法 ⏹Linux 和 Unix 系统中用于执行 shell 脚本 或 运行命令 的命令。…

【我的 PWN 学习手札】Fastbin Double Free

前言 Fastbin的Double Free实际上还是利用其特性产生UAF的效果&#xff0c;使得可以进行Fastbin Attack 一、Double Free double free&#xff0c;顾名思义&#xff0c;free两次。对于fastbin这种单链表的组织结构&#xff0c;会形成这样一个效果&#xff1a; 如果我们mallo…

卡西莫多的手信

通过网盘分享的文件&#xff1a;卡西莫多的手信2022-2024.9.15-A5.pdf 链接: 百度网盘 请输入提取码 提取码: gig1

oracle数据库安装和配置详细讲解

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; Oracle 数据库是全球广泛使用的关系型数据库管理系统 (RDBMS)&#xff0c;提供高性能、可靠性、安全性和可扩展性&#xff0c;广泛应用于企业关键任务系统。下面详细介绍如何在 CentOS 系统上安装和配置 Or…

非金属失效与典型案例分析培训

随着生产和科学技术的发展&#xff0c;人们不断对高分子材料提出各种各样的新要求。因为技术的全新要求和产品的高要求化&#xff0c;而客户对产品的高要求及工艺理解不一&#xff0c;于是高分子材料断裂、开裂、腐蚀、变色等之类失效频繁出现&#xff0c;常引起供应商与用户间…

O2O营销,中小企业数字化转型的加速器

嘿&#xff0c;小伙伴们&#xff0c;今天咱们要聊的&#xff0c;可是那让中小企业焕发新生的O2O营销魔法&#xff01;它就像是一位时空穿梭者&#xff0c;轻松跨越线上与线下的鸿沟&#xff0c;带着商家们开启了一场数字化转型的奇妙之旅。 O2O营销&#xff1a;不只是连接&…

【主机入侵检测】Wazuh规则详解

前言 Wazuh 规则是一组用XML格式编写的条件&#xff0c;它们定义了应该如何解释日志数据。这些规则由Wazuh Manager使用&#xff0c;用于在日志消息中检测特定的模式或行为&#xff0c;并相应地生成警报或响应。它们在威胁检测中扮演着至关重要的角色&#xff0c;因为它们允许系…

NAS远程下载,Docker部署qBittorrent、Transmission、贝锐花生壳

与电脑不同&#xff0c;NAS通常都是7*24小时不间断运行&#xff0c;这使得下载资源变得更加便捷&#xff0c;解决了bt、pt下载需要长时间在线、挂机的问题。 所以&#xff0c;对于许多选择品牌NAS或自行搭建NAS系统的用户而言&#xff0c;像qBittorrent、Transmission这样的下载…

DAY 9 - 10 : 树

树的概念 定义 树&#xff08;Tree&#xff09;是n&#xff08;n≥0&#xff09;个节点的有限集合T&#xff0c;它满足两个条件 &#xff1a; 1.有且仅有一个特定的称为根&#xff08;Root&#xff09;的节点。 2.其余的节点可以分为m&#xff08;m≥0&#xff09;个互不相交的…

rk3568 parameter.txt 添加自己的分区,或者去掉已有的分区

问题&#xff1a; 客户在 之前的核心板上 可以烧写自己的镜像&#xff0c;但是在最新的核心板上却烧写不上&#xff0c;新旧核心板 只是变了emmc &#xff0c; 由 江波龙 ------->星火。 分析&#xff1a; 客户的镜像的分区是经过自己的定制的&#xff0c;所以有可能 是 由…

Linux云计算 |【第三阶段】PROJECT1-DAY3

主要内容&#xff1a; Keepalived高可用、部署Ceph分布式存储 一、网站架构进阶项目案例 案例1&#xff1a;Keepalived高可用 延续 PROJECT1-DAY2 案例&#xff0c;部署两台代理服务器&#xff0c;实现如下效果&#xff1a; 1&#xff09;利用keepalived实现两台代理服务器的…

【Java面试】第十一天

&#x1f31f;个人主页&#xff1a;时间会证明一切. 目录 Springboot是如何实现自动配置的&#xff1f;Spring的Autowired能用在Map上吗&#xff1f;ListMapSet数组注意事项 Spring的AOP在什么场景下会失效&#xff1f; Springboot是如何实现自动配置的&#xff1f; Spring Bo…

【开源免费】基于SpringBoot+Vue.JS高校心理教育辅导系统(JAVA毕业设计)

本文项目编号 T 031 &#xff0c;文末自助获取源码 \color{red}{T031&#xff0c;文末自助获取源码} T031&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析5.4 用例设计 六、核…

嵌入式C语言自我修养:C语言的面向对象编程思想

⭐关联知识点&#xff1a;C和C的区别 代码复用与分层思想 什么是代码复用呢&#xff1f; &#xff08;1&#xff09;函数级代码复用&#xff1a;定义一个函数实现某个功能&#xff0c;所有的程序都可以调用这个函数&#xff0c;不用自己再单独实现一遍&#xff0c;函数级的代…

【YashanDB知识库】单机升级典型问题及应急措施

升级典型问题 官网升级操作指引 离线升级&#xff0c;一般线上操作之前需要照着做一遍&#xff0c;但是由于数据量少、monit进程在测试环境没有启动等原因&#xff0c;一些操作、配置问题在测试过程中不会暴露&#xff0c;在生成操作的时候才暴露&#xff0c;下面3项是比较常见…