1.nacos的单机启动
startup.cmd -m standalone windows启动
sh startup.sh -m standalone linux启动
macos的默认的访问路径 http://localhost:8848/nacos
注意:nacos如果不配置集群,如果不使用单机启动可能会报错
以下是可执行文件的命令,包括启动的时候:1.这是监听端口,设置服务名
java -Dserver.port=8849 -Dcsp.sentinel.dashboard.server=localhost:8849 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.0.jar
1.maven的客户端的依赖
com.alibaba.cloud
spring-cloud-starter-alibaba-sentinel
org.springframework.boot
spring-boot-cloud-actuator
spring:
cloud:
sentinel:
transport:
port: 8099 #跟sentinel控制台交流的端口,随意指定一个未使用的端口即可
dashboard: localhost:8180 #指定sentinel控制台的地址
eager: true #如果访问该资源sentinel控制台才会显示,开启后不访问sentinel也会在控制台显示
1.在
1.阈值限流
2.关联限流
3.链路限制流(例如: 现在要有人在浏览A商品,有人准备购买A商品,不管是浏览A商品还是购买A商品都要对A商品进行查询,这个时候比如我可以对添加购物车这一条链路进行限流)
1.慢调用比例降级
所谓慢调用比例,就是我们自己给定一个慢调用的时间比如100ms,和一个慢调用的比例,比如是50%,也就是说在该资源被调用的过程中如果,响应时间大于100ms的情况入过大于50%那么该服务调用就是降级,也就是说在10次的请求中如果有五次请求的时间都是在100ms以上那么该资源的调用就会降级
2.异常处理降级
所谓的异常处理降级,就是该请求的处理过程中如果发生了异常情况的话,设置的异常比例比如为0.5,最小的请求数量为10,那么在十次的请求过程中如果发生了五次的异常的处理情况下,那么就要进行熔断的处理
所谓的热点数据的限流,降级主要是针对于具体的数据,也就是访问的参数进行限流降级处理,比如,我现在访问一个id=10的热点新闻数据,我将此请求中的参数设置为id=10那么的话,当平凡是的访问该数据的时候就进行限流
1)导入依赖
com.alibaba.csp
sentinel-datasource-nacos
2)在bootstrap中配置数据源
spring:
cloud:
sentinel:
# nacos 持久化数据
datasource:
# 可配置多个规则
# 可自定义key-流控规则
dashboard-flow:
nacos:
server-addr: http:localhost
dataId: ${spring.application.name}-flow
file-extension: json
rule-type: flow
namespace: ${spring.profiles.active}
# 可自定义key-系统规则
dashboard-system:
nacos:
server-addr: http:localhost
dataId: ${spring.application.name}-system
file-extension: json
rule-type: system
namespace: ${spring.profiles.active}
3)配置中心的配置
流控规则
[
{
// 资源名
"resource": "/test",
// 针对来源,若为 default 则不区分调用来源
"limitApp": "default",
// 限流阈值类型(1:QPS;0:并发线程数)
"grade": 1,
// 阈值
"count": 1,
// 是否是集群模式
"clusterMode": false,
// 流控效果(0:快速失败;1:Warm Up(预热模式);2:排队等待)
"controlBehavior": 0,
// 流控模式(0:直接;1:关联;2:链路)
"strategy": 0,
// 预热时间(秒,预热模式需要此参数)
"warmUpPeriodSec": 10,
// 超时时间(排队等待模式需要此参数)
"maxQueueingTimeMs": 500,
// 关联资源、入口资源(关联、链路模式)
"refResource": "rrr"
}
]
降级规则
根据实际的需要改变减少对应的参数即可
[
{
// 资源名
"resource": "/test1",
"limitApp": "default",
// 熔断策略(0:慢调用比例,1:异常比率,2:异常计数)
"grade": 0,
// 最大RT、比例阈值、异常数
"count": 200,
// 慢调用比例阈值,仅慢调用比例模式有效(1.8.0 引入)
"slowRatioThreshold": 0.2,
// 最小请求数
"minRequestAmount": 5,
// 当单位统计时长(类中默认1000)
"statIntervalMs": 1000,
// 熔断时长
"timeWindow": 10
}
]
热点规则
根据实际的需要改变减少对应的参数即可
[
{
// 资源名
"resource": "/test1",
// 限流模式(QPS 模式,不可更改)
"grade": 1,
// 参数索引
"paramIdx": 0,
// 单机阈值
"count": 13,
// 统计窗口时长
"durationInSec": 6,
// 是否集群 默认false
"clusterMode": 默认false,
//
"burstCount": 0,
// 集群模式配置
"clusterConfig": {
//
"fallbackToLocalWhenFail": true,
//
"flowId": 2,
//
"sampleCount": 10,
//
"thresholdType": 0,
//
"windowIntervalMs": 1000
},
// 流控效果(支持快速失败和匀速排队模式)
"controlBehavior": 0,
//
"limitApp": "default",
//
"maxQueueingTimeMs": 0,
// 高级选项
"paramFlowItemList": [
{
// 参数类型
"classType": "int",
// 限流阈值
"count": 222,
// 参数值
"object": "2"
}
]
}
]
系统规则
负值表示没有阈值检查。不需要删除参数
[
{
// RT
"avgRt": 1,
// CPU 使用率
"highestCpuUsage": -1,
// LOAD
"highestSystemLoad": -1,
// 线程数
"maxThread": -1,
// 入口 QPS
"qps": -1
}
]
受权规则
[
{
// 资源名
"resource": "sentinel_spring_web_context",
// 流控应用
"limitApp": "/test",
// 授权类型(0代表白名单;1代表黑名单。)
"strategy": 0
}
]
org.springframework.cloud
spring-cloud-starter-gateway
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
注意:nacos的服务的注册与发现的依赖并非必须的,但是如果gataway想要获取相关的服务,可以直接在服务注册发现中心进行配置,当然不配置网关的话也可,但是提供网关的服务的时候会变得异常的复杂,其次在进行负载均衡的时候,网管可以根据同一个服务找到相关的实例进行负载均衡
spring:
cloud:
gateway:
routes:
# 路由id,可以任意
- id: user-service-route
# 代理的服务地址
#uri: http://127.0.0.1:9091
# lb表示从eureka中获取具体服务
uri: lb://user-service
# 路由断言: 可以匹配映射路径
predicates:
#- Path=/user/**
#- Path=/**
- Path=/api/user/**
filters:
# 添加请求路径的前缀
#- PrefixPath=/user
#1表示过滤1个路径,2表示两个路径,以此类推
- StripPrefix=1
- MyParam=name
# 默认过滤器,对所有路由都生效
default-filters:
- AddResponseHeader=X-Response-Foo, Bar
- AddResponseHeader=abc-myname,heima
#跨域配置
globalcors:
corsConfigurations:
'[/**]':
#allowedOrigins: * # 这种写法或者下面的都可以,*表示全部
allowedOrigins:
- "http://docs.spring.io"
allowedMethods:
- GET
@Configuration
public class GateWayConfig {
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder) {
RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
//下面是完整的添加路由机制
RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
return routes.route("roulte03", new Function() {
@Override
public Route.AsyncBuilder apply(PredicateSpec predicateSpec) {
predicateSpec.query("username","zhangsan");//查询参数的断言
predicateSpec.path("/user/**");
//predicateSpec.header("token","admin"); //匹配请求头的断言
//predicateSpec.before();添加时间的断言
predicateSpec.query("username").filters(f -> {
return f.addRequestParameter("password", "123456");//添加参数的的过滤器
});
Route.AsyncBuilder asyncBuilder = predicateSpec.uri("lb://jt-auth");
return asyncBuilder;
}
}).build();
//下面是简化版的路由的配置
routes.route("path_rote_xiaozhi",
r -> r.path("/guonei")
.uri("http://news.baidu.com/guonei")).build();
return routes.build();
}
@Bean
public RouteLocator customRouteLocator2(RouteLocatorBuilder builder) {
RouteLocatorBuilder.Builder routes = builder.routes();
routes.route("path_route_xiaozhi2", r -> r.path("/guoji").uri("http://news.baidu.com/guoji")).build();
return routes.build();
}
}
public class AuthGobalFilter implements GlobalFilter, Order {
@Override
public Class extends Annotation> annotationType() {
return null;
}
@Override
public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
return null;
}
@Override
public int value() {
return 0;
}
}
com.alibaba.cloud
spring-cloud-starter-alibaba-sentinel
com.alibaba.cloud
spring-cloud-alibaba-sentinel-gateway
RELEASE
2.参数的设置,打开项目的配置
将vm-opton设置为:-Dcsp.sentinel.app.type=1
注意版本之间的控制
阀值得类型:QPS 与 线程数
匹配的方式:精确,子串,正则
匹配的内容:clint-ip,head请求头,cookie缓存,URL请求的参数,Remote port 远程端口
自定义分组限流:通过分组的方式进行限流,但是这种方式只进行路径的匹配,不能进行参数的匹配
@Configuration
public class GatewayReturnConfig {
public GatewayReturnConfig(){
GatewayCallbackManager.setBlockHandler(new BlockRequestHandler() {
@Override
public Mono handleRequest(ServerWebExchange serverWebExchange, Throwable throwable) {
ServerHttpResponse response = serverWebExchange.getResponse();
String json="{\"code\":200,\"message\":\"您现在访问过于频繁,请稍后再访问\"}";
Mono body = ServerResponse.ok().body(Mono.just(json), String.class);
return body;
}
});
}
}