书接上篇 微服务守护神-Sentinel-降级规则 ,上面介绍了Sentinel降级规则,本篇继续来Sentinel的热点、授权、系统规则。
何为热点?热点即经常访问的数据。很多时候我们希望统计某些热点数据中访问频次最高的 Top K 数据,并对其访问进行限制。比如:
商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制
用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制
热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种更细粒度的流量控制,细化到参数的控制。
需求:设置热点参数限制,当product=1进行流控,当product != 1 不处理
步骤1:在shop-order-server项目中新增HotSpotController.java
package cn.wolfcode.controller;
@RestController
@Slf4j
public class HotSpotController {
@RequestMapping("/hotSpot1")
@SentinelResource(value = "hotSpot1")
public String hotSpot1(Long productId){
log.info("访问编号为:{}的商品",productId);
return "hotSpot1";
}
}
注意:一定需要在请求方法上贴@SentinelResource直接,否则热点规则无效
步骤2:新增热点规则
步骤3:在热点规则中编辑规则,在编辑之前一定要先访问一下/hotSpot1,不然参数规则无法新增.
步骤5:点击保存,可以看到已经新增了参数规则.
步骤6:访问测试
访问http://localhost:8091/hotSpot?productId=1 访问会降级
访问http://localhost:8091/hotSpot?productId=2 访问不会降级
很多时候,我们需要根据客户端来源来判断当前请求是否允许放行,比如:项目有app,有pc,有小程序多需要往后端发起请求,为了防止一些非法请求进入,做了参数约定,带上来源标记。
Sentinel 就有来源访问控制(黑白名单控制)的功能。来源访问控制根据资源的请求来源(origin
)限制资源是否通过,若配置白名单则只有请求来源位于白名单内时才可通过;若配置黑名单则请求来源位于黑名单时不通过,其余的请求通过。
需求:约定来源标记:serviceName=pc 拦截,!= pc放行
步骤1:在shop-order-server中新建RequestOriginParser接口实现类
@Component
public class RequestOriginParserDefinition implements RequestOriginParser {
@Override
public String parseOrigin(HttpServletRequest request) {
/**
* 定义从请求的什么地方获取来源信息
* 比如我们可以要求所有的客户端需要在请求头中携带来源信息
*/
String serviceName = request.getParameter("serviceName");
return serviceName;
}
}
这个实现类目的用于解析请求来源中带有参数
步骤2:在shop-order-server中新建AuthController.java
@RestController
@Slf4j
public class AuthController {
@RequestMapping("/auth1")
public String auth1(String serviceName){
log.info("应用:{},访问接口",serviceName);
return "auth1";
}
}
步骤3:新增授权规则
这里配置来源携带触发参数值:pc, 使用的黑名单,用于拦截。
步骤4:访问测试
访问http://localhost:8091/auth1?serviceName=pc 不能访问
访问http://localhost:8091/auth1?serviceName=app 可以访问
系统保护规则是从应用级别的入口流量进行控制,从单台机器的 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 达到阈值即触发系统保护。
注意:系统规则,针对的是整个项目控制规则,配置时一定要慎重。真实开发配置前必须需要严格、专业的压测,保证系统最适合。
到这,sentinel的所有配置规则就讲完了,下一节就是其他相关逻辑了,欲知后事如何,请听下回分解。
看文字不过瘾可以切换视频版:SpringCloud Alibaba 极简入门