day06-Sentinel热点规则+授权规则+⽹关Gateway
1.Sentinel热点规则
1.1 热点概述
何为热点?热点即经常访问的数据。
⽐如:
商品 ID 为参数,统计⼀段时间内最常购买的商品 ID 并进⾏限制.
⽤户 ID 为参数,针对⼀段时间内频繁访问的⽤户 ID 进⾏限制。
仅对包含热点参数的资源调⽤⽣效, Sentinel会利⽤ LRU 策略统计最近最常访问的热点参数,结合令牌桶算法来进⾏参数级别的流控。1.2 案例-设置热点限流
//ip:port/consumer/doFindById?id=10
@GetMapping("/consumer/findById")
@SentinelResource("res")
public String doFindById(@RequestParam("id") Integer id){
return"resource id is "+id;
}
热点规则的限流模式只有QPS模式(这才叫热点)。参数索引为@SentinelResource注解的⽅法参数下标,0代表第⼀个参数,1代表第⼆个参数。单机阈值以及统计窗⼝时长表⽰在此窗⼝时间超过阈值就限流。
测试结果:
1.3 特定参数设置
表⽰参数值为10时 ,限流 阈值为2, 参数值为20时 ,限流 阈值为2,
其它参数值阈值为1 , 限流阈值 是每秒允许请求次数
⾯试点
1.如何理解热点数据?(访问频度⽐较⾼的数据,某些商品、谋篇⽂章、某个视频)
2.热点数据的限流规则是怎样的?(主要是针对参数进⾏限流设计)
3.热点数据中的特殊参数如何理解?(热点限流中的某个参数值的阈值设计)
4.对于热点数据的访问出现限流以后底层异常是什么?(ParamFlowException)
1.4 Sentinel系统规则
Sentinel的系统保护规则是从应⽤级别的⼊⼝流量进⾏控制,从单台机器的总体 Load、RT、⼊⼝ QPS 、线程数和CPU使⽤率五个维度监控应⽤数据
1.如何理解sentinel中的系统规则?(是对所有链路的控制规则,是⼀种系统保护策略)
2.Sentinel的常⽤系统规则有哪些?(RT,QPS,CPU,线程,Load-linux,unix)
3.Sentinel系统保护规则被触发以后底层会抛出什么异常?(SystemBlockException)
1.5 Sentinel授权规则
若配置⽩名单则只有请求来源位于⽩名单内时才可通过;若配置⿊名单则请求来源位于⿊名单时不通过,其余的请求通过。
1.5.1定义RequestOriginParser接⼝的实现类
基于业务在接⼝⽅法中解析请求数据并返回
//基于此对象解析请求
package com.jt;
import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.RequestOriginParser;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
// RequestOriginParser 接⼝请求⽣成器
@Component
public class DefaultRequestOrigin implements RequestOriginParser {
//localhost:8090/consumer/echo?origin=app1
//这个⽅法会在资源访问时,由底层进⾏调⽤,获取请求中数据,再与我们指定的授权规则进⾏⽐对
微服务在哪里
@Override
public String parseOrigin(HttpServletRequest httpServletRequest){
Parameter("origin");//参数名⾃⼰定义
}
}
⾯试点:
1.如何理解Sentinel中的授权规则?(对指定资源的访问给出的⼀种简易的授权策略)
2.Sentinel的授权规则是如何设计的?(⽩名单和⿊名单)
3.如何理解Sentinel中的⽩名单?(允许访问的资源名单)
4.Sentinel如何识别⽩名单和⿊名单?(在中通过调⽤RequestOriginParser对象的⽅法检测具体的规则)
5.授权规则中RequestOriginParser类的做⽤是什么?(对流控应⽤值进⾏解析,检查服务访问时传⼊的值是否与RequestOriginParser 的parseOrigin⽅法返回值是否相同。)
6.Sentinel 的限流规则?(阈值类型-QPS&线程数,限流模式-直接,关联,链路)
7.Sentinel 的降级(熔断)策略有哪些?(慢调⽤-响应时长,异常⽐例-异常占⽐,异常数)
2. ⽹关
⽹关本质上要提供⼀个各种服务访问的⼊⼝,并提供服务接收并转发所有内外部的客户端调⽤,还有就是权限认证,限流控制等等。2.1 Spring Cloud Gateway
⼀个⽹关组件,它旨在为微服务架构提供⼀种简单有效的统⼀的 API⼊⼝,负责服务请求路由、组合及协议转换,并且基于 Filter 链的⽅式提供了权限认证,监控、限流等功能。
优点:
性能强劲:是第⼀代⽹关Zuul的1.6倍。
功能强⼤:内置了很多实⽤的功能,例如转发、监控、限流等
设计优雅,容易扩展。
缺点:
依赖Netty与WebFlux(Spring5.0),不是传统的Servlet编程模型(Spring MVC就是基于此模型实现),学习成本⾼。
需要Spring Boot 2.0及以上的版本,才⽀持
2.2 业务实现
2.2.1 添加依赖
创建sca-gateway模块,其l⽂件
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
2.2.2 添加相关配置
路由(Route) 是 gateway 中最基本的组件之⼀,表⽰⼀个具体的路由信息载体。主要定义了下⾯的⼏个信息:
id,路由标识符,区别于其他 Route。
uri,路由指向的⽬的地 uri,即客户端请求最终被转发到的微服务。
predicate,断⾔(谓词)的作⽤是进⾏条件判断,只有断⾔都返回真,才会执⾏路由。
filter,过滤器⽤于修改请求和响应信息。
server:
port: 9000
spring:
application:
name: sca-gateway
cloud:
gateway:
routes:
routes: #配置⽹关路由规则
- id: route01  #路由id,⾃⼰指定⼀个唯⼀值即可
uri: localhost:8081/ #⽹关帮我们转发的url
predicates: ###断⾔(谓此):匹配请求规则
- Path=/nacos/provider/echo/**  #请求路径定义,此路径对应uri中的资源
filters: ##⽹关过滤器,⽤于对谓词中的内容进⾏判断分析以及处理
-
StripPrefix=1#转发之前去掉path中第⼀层路径,例如nacos
2.2.3 创建启动类
jt;
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args){
SpringApplication.run(GatewayApplication.class,args);
}
}