有没有专门做平铺素材的网站,网站如何在google提交收录,寺院网站模板,做电商的几个网站吗目录
Sentinel#xff1a;微服务的哨兵
生态系统景观
sentinel与spring cloud Hystrix 对比
Sentinel 主要分为两部分
Sentinel安装与使用
Sentinel的控制规则
流控规则
流控规则的属性说明
新增流控规则
关联流控模式
SentinelResource注解的使用
SentinelResou…目录
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 都是用于微服务架构中的服务容错、熔断降级、流量控制等功能的库。
特性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 使用率动态调整限流或熔断策略。集成支持核心库可以轻松与各种微服务框架进行集成如 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 --dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-sentinel/artifactIdversion2023.0.1.0/version/dependency 配置 application.properties 以启用 Sentinel # 服务端口
server.port8081# 启用 Sentinel并连接 Sentinel Dashboard
spring.cloud.sentinel.transport.dashboard127.0.0.1:8080
spring.cloud.sentinel.transport.port8719 # 本地 Sentinel 客户端的监控端口
# 启用 Sentinel
spring.cloud.sentinel.enabledtrue 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?userId12345tenantId67890 流控规则 流控规则的属性说明 资源名资源名是需要限流的唯一标识可以是方法名、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;// 随机生成订单号接口限流资源名为 generateOrderGetMapping(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)
该策略会根据请求响应的时间来判断是否进行熔断适合用于防止因某些请求响应过慢而拖垮整个系统。
RTResponse 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 系统过载请稍后再试;}
}