微服务-- Sentinel的使用
目录
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 对比
Sentinel 和 Spring Cloud Hystrix 都是用于微服务架构中的服务容错、熔断降级、流量控制等功能的库。
特性 | Sentinel | Hystrix |
---|---|---|
隔离策略 | 信号量隔离(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 使用率)动态调整限流或熔断策略。
- 集成支持:核心库可以轻松与各种微服务框架进行集成,如 Dubbo、Spring 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 {@Overridepublic 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 {@Autowiredprivate 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 {@Autowiredprivate 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 {@Autowiredprivate 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 {@Overridepublic 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 {@Overridepublic 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 {@Autowiredprivate 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 {@Autowiredprivate 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 "系统过载,请稍后再试!";}
}
相关文章:

微服务-- Sentinel的使用
目录 Sentinel:微服务的哨兵 生态系统景观 sentinel与spring cloud Hystrix 对比 Sentinel 主要分为两部分 Sentinel安装与使用 Sentinel的控制规则 流控规则 流控规则的属性说明 新增流控规则 关联流控模式 SentinelResource注解的使用 SentinelResou…...
TS React 项目中使用TypeScript
在 React 项目中使用 TS 创建新项目 在现有项目中添加 TS 创建新项目 命令:npx create-react-app my-app --template typescript 说明:在命令行中,添加 --template typescript 表示创建支持 TS 的项目 项目目录的变化: 在项目…...

【JavaEE】IP协议 应用层协议
🔥个人主页: 中草药 🔥专栏:【Java】登神长阶 史诗般的Java成神之路 🕶️一.IP地址 IP协议(Internet Protocol)是TCP/IP协议族中最核心的协议之一,它定义了数据包在网络中传输的标准…...

CRM如何助力科技服务机构突破业务瓶颈?
在当今知识经济时代,科技服务机构面临着复杂的业务环境和多样化的客户需求。客户管理系统(CRM)在这个领域的应用正逐渐成为机构提升运营效率、优化客户服务的关键。 科技服务行业的业务特点 知识产权代理行业具有高度的专业性和复杂性。其业…...

牛啊,GitHub 代理加速图文教程
大家好,众所周知,GitHub 在国内访问速度堪忧,经常出现访问不了的情况,如果我们去 clone 代码,网速非常差。今天教大家如何给 GitHub 进行加速。 要用到我开发的开源项目 Cloudflare Workers Proxy,它是一个…...

基于扣子(Coze)打造第一个智能体——个性化对话机器人
文章目录 一,智能体体验二,动手打造一个自己的智能体1,主页点击创建机器人1.1 创建一个新的机器人1.2 修订Bot基础信息1.3 工具编排信息修订人设和回复逻辑、增补开场白等 2,使用插件优化机器人3,使用工作流优化机器人…...

算法-深度拷贝链表(138)
深度拷贝一个链表可以分以下几个步骤: 步骤 1:插入新节点 目标:在每个节点后面插入一个复制的节点。步骤: 遍历整个链表。对于每个节点 current,创建一个新节点 newNode,其值为 current.val。将 newNode …...
【Kubernetes】常见面试题汇总(十四)
目录 42.简述 Kubernetes 如何保证集群的安全性? 43.简述 Kubernetes 准入机制? 42.简述 Kubernetes 如何保证集群的安全性? Kubernetes 通过一系列机制来实现集群的安全控制,主要有如下不同的维度: (1&…...

灵当CRM系统index.php存在SQL注入漏洞
文章目录 免责申明漏洞描述搜索语法漏洞复现nuclei修复建议 免责申明 本文章仅供学习与交流,请勿用于非法用途,均由使用者本人负责,文章作者不为此承担任何责任 漏洞描述 灵当CRM系统是一款功能全面、易于使用的客户关系管理(C…...
详解QT元对象系统用法
文章目录 元枚举 QMetaEnum元方法 QMetaMethod元对象构建 QMetaObjectBuilder元属性 QMetaProperty定义元对象属性获取属性信息与信号和槽结合QML属性访问动态属性元类型 QMetaTypeQt的元对象系统是Qt框架中的一个核心特性,它为Qt应用程序提供了一种动态类型信息机制。这种机制…...

【Python】从基础到进阶(八):文件操作与上下文管理
🔥 个人主页:空白诗 文章目录 一、引言二、Python文件操作基础1. 打开文件2. 读取文件3. 写入文件4. 文件指针定位 三、上下文管理1. 使用with管理文件2. 自定义上下文管理器 四、文件操作的最佳实践五、案例:日志文件管理1. 需求分析2. 实现…...
c#:System.Text.Json 的使用四(如何忽略[JsonPropertyName])
环境: .net 6.0vs2022 系列篇: 《c#:System.Text.Json 的使用一》 《c#:System.Text.Json 的使用二》 《c#:System.Text.Json 的使用三(从Newtonsoft迁移)》 《c#:System.Text.Json…...

【CPU】CPU的物理核、逻辑核、超线程判断及L1、L2、L3缓存、CacheLine和CPU的TBL说明
CPU物理核及L1、L2、L3及缓存 CPU缓存 CPU 缓存是一种用于存储临时数据以提高计算机程序性能的内存层次结构。它通常分为三个层次:L1(一级)、L2(二级)和L3(三级)缓存。缓存大小是CPU的重…...

NET WPF使用组件库HandyControl
一、背景 WPF原生控件提供的API功能不够强大,设置一般的功能都需要进行很复杂的配置和实现。 1.1 原生按钮控件 例如,原生控件<Button/> 默认效果是这样的: MainWindow.xaml代码: <Window x:Class"wpf_demo.Mai…...

计算机毕业设计之:教学平台微信小程序(
博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…...

VMware Fusion虚拟机Mac版 安装Win10系统教程
Mac分享吧 文章目录 Win10安装完成,软件打开效果一、VMware安装Windows10虚拟机1️⃣:准备镜像2️⃣:创建虚拟机3️⃣:虚拟机设置4️⃣:安装虚拟机(步骤和Win11安装步骤类似,此处相同步骤处没换…...

头戴式蓝牙耳机性价比高的有哪些?四款高能性价比机型对比推荐
在当今科技日新月异的时代,头戴式蓝牙耳机已经成为了我们日常生活中不可或缺的一部分,无论是通勤路上、健身房内还是家中休闲时,一副优质的头戴式蓝牙耳机都能为我们带来沉浸式的听觉体验,那么头戴式蓝牙耳机性价比高的有哪些&…...

Linux:make,Makefile
hello,各位小伙伴,本篇文章跟大家一起学习《Linux:make,Makefile》,感谢大家对我上一篇的支持,如有什么问题,还请多多指教 ! 如果本篇文章对你有帮助,还请各位点点赞&…...

基于代理的分布式身份管理方案
目的是使用分布式的联合计算分发去替换掉区块链中原有的类第三方可信中心的证书机制,更加去中心化。 GS-TBK Group Signatures with Time-bound Keys. CS-TBK 算法 Complete subtree With Time-bound Keys,该算法是用来辅助检测用户的签名是否有效&…...

VSCode开发ros程序无法智能提示的解决方法(一)
VSCode开发ros程序无法智能提示的解决方法(一) 问题解决 问题 在Ubuntu下使用vscode开发ros程序,无法进行智能提示。 解决 将 intelli Sense Engine 设置为 Tag Parser 即可。...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...

VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...

通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...