Sentinel学习
系列文章目录
JavaSE | ||
---|---|---|
基础知识、数据类型学习 | 万年历项目 | 代码逻辑训练习题 |
代码逻辑训练习题 | 方法、数组学习 | 图书管理系统项目 |
面向对象编程:封装、继承、多态学习 | 封装继承多态习题 | 常用类、包装类、异常处理机制学习 |
集合学习 | IO流、多线程学习 | 仓库管理系统JavaSE项目 |
员工管理系统、多表查询、反射实现DBHelper学习 | DML、DDL、数据库对象学习 | |
JavaWeb | ||
网络编程、各种标签、CSS学习 | ECMAScript、BOM学习 | DOM、jQuery学习 |
Servlet、JSP、Cookie、Ajax学习 | 融资管理系统JavaWeb项目 | |
框架 | ||
MyBatis框架学习 | 逆向工程、Spring框架IOC、AOP学习 | SpringMVC框架学习 |
SpringBoot框架学习 | 招聘网站框架项目 | Vue介绍、窗体内操作、窗体间操作学习 |
Vue路由配置、网络请求访问框架项目、element组件介绍学习 | 标准管理系统Vue项目 | |
微服务 | ||
Linux安装、Nginx反向代理、负载均衡学习 | Docker学习 | Jenkins学习 |
Nexus学习 | Spring Security学习 | RabbitMQ学习 |
Redis学习 | MongoDB学习 | MongoDB学习 |
Nacos学习 | Spring Session学习 | Spring Gateway学习 |
JSR 303学习 | OpenFeign学习 | Dubbo学习 |
Hystrix学习 | Sentinel学习 |
文章目录
- 系列文章目录
- 前言
- 一、Sentinel介绍
- 1. Sentinel介绍
- 2. Sentinel概念
- 二、Sentinel代码实现
- 1. 使用OpenFeign项目
- 2. 启动Nacos和Redis
- 3. 添加依赖
- 4. Sentinel服务下载
- 5. 启动服务
- 6. 登录sentinel
- 7. 添加配置信息
- 8. 启动项目并访问项目
- 三、自定义响应
- 1. 创建SentinelFilterConfig过滤器
- 2. 创建SentinelConfig配置类
- 3. 运行项目,查看结果
- 四、熔断
- 1. 添加feign配置信息
- 2. 创建ScoreFeignImpl接口实现类
- 3. 修改ScoreFeign接口的注解
- 4. 修改UserServiceImpl实现类方法
- 5. !!在sentineldemo2项目中!!更改info方法
- 6. 启动两个项目、测试熔断处理
- 五、熔断资源
- 1. 添加setMessage方法
- 2. 新增trySources方法
- 3. 添加annotationSources、annotationSourcesError方法
- 4. 重启两个项目
- 总结
前言
本文我们要讲述:
Sentinel
通过网盘分享的文件:SpringSession——OpenFeign.zip
链接: https://pan.baidu.com/s/1uKEYyQ80RGMnDsoa5j9v5Q?pwd=tmm5 提取码: tmm5
在下攸攸太上。
一、Sentinel介绍
1. Sentinel介绍
Sentinel是一个面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点来帮助开发者保障微服务的稳定性。
2. Sentinel概念
1、QPS (Queries Per Second):每秒处理的请求数量,用于衡量系统的处理能力。
2、RT (Response Time):响应时间,指的是从发送请求到接收到响应所花费的时间。
3、慢调用 (Slow Calls):响应时间超过一定阈值的调用。
4、慢调用比例 (Slow Call Ratio):慢调用数量占总调用数量的比例。
5、比例阈值 (Threshold):一个介于0到1之间的浮点数,表示阈值的百分比,用于设置异常比例、慢调用比例等。
6、异常比例 (Exception Ratio):发生异常的调用数量占总调用数量的比例。
7、异常数 (Exception Count):发生异常的调用数量。
8、快速失败 (Fail Fast):当QPS超过阈值时,直接限流并抛出异常。适用于线程数限流。
9、排队等待 (Warm Up):每秒可以处理的请求数量有限制,超出限制的请求会进入排队等待一段时间,等待时间过后仍未处理的请求将被限流。适用于QPS限流。
10、Warm Up (Warm Up):在一段时间内逐渐增加服务器的QPS,使其慢慢达到阈值。适用于QPS限流。
11、直接拒绝 (Reject):针对单一资源,当触发阈值时直接拒绝请求。
12、关联 (Association):针对两个资源有关联时,当前资源会为关联资源让步,保证关联资源拥有更大的阈值。
13、链路 (Cascade):从资源入口开始,整个链路的阈值。
14、热点限流 (Hotspot Flow Control):对频繁访问的热点数据进行限流,以减少服务器压力。
15、系统规则 (System Rule):针对硬件层面设置的规则,比如限制CPU的使用率。
16、授权规则 (Authority Rule):根据请求的来源设置限流,实现黑白名单功能。
二、Sentinel代码实现
1. 使用OpenFeign项目
本项目基于OpenFeign的两个项目实现,可以在下面的网盘链接取到
SpringSession——OpenFeign.zip
可以看我之前的OpenFeign学习文章,里面会有介绍
以下更改均在demo-session-01内更改,demo-session-02无需任何改动,如需改动,会特别标出
2. 启动Nacos和Redis
3. 添加依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-web-servlet</artifactId>
</dependency>
4. Sentinel服务下载
https://github.com/alibaba/Sentinel/releases
5. 启动服务
java -jar sentinel-dashboard.jar
6. 登录sentinel
访问网页:http://localhost:8080/#/login
登录后,点击首页出现欢迎页
7. 添加配置信息
在application.yml配置文件中,Spring标签改为如下
spring:session:store-type: rediscloud:sentinel:transport:dashboard: localhost:8080
8. 启动项目并访问项目
刷新Sentinel页面,点击进入限流界面
快速刷新http://127.0.0.1:100/user
三、自定义响应
1. 创建SentinelFilterConfig过滤器
package com.jjy.config;import com.alibaba.csp.sentinel.adapter.servlet.CommonFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import javax.servlet.Filter;@Configuration
public class SentinelFilterConfig {@Beanpublic FilterRegistrationBean<Filter> filterFilterRegistrationBean(){FilterRegistrationBean<Filter> result = new FilterRegistrationBean<>(new CommonFilter());result.addUrlPatterns("/*");return result;}
}
2. 创建SentinelConfig配置类
package com.jjy.config;import com.alibaba.csp.sentinel.adapter.servlet.callback.WebCallbackManager;
import com.alibaba.fastjson.JSON;
import com.jjy.util.Result;
import org.springframework.context.annotation.Configuration;@Configuration
public class SentinelConfig {public SentinelConfig() {WebCallbackManager.setUrlBlockHandler((request, response, e) -> {Result error = Result.error();error.setMessage("被限流了!");response.setCharacterEncoding("UTF-8");response.setContentType("text/html;charset=utf-8");response.getWriter().write(JSON.toJSONString(error));});}
}
3. 运行项目,查看结果
重新新增流控规则
疯狂刷新项目界面
四、熔断
1. 添加feign配置信息
feign.sentinel.enabled=true
2. 创建ScoreFeignImpl接口实现类
package com.jjy.feign.impl;import com.jjy.entry.Score;
import com.jjy.entry.UserDto;
import com.jjy.feign.ScoreFeign;
import com.jjy.util.Result;
import org.springframework.stereotype.Service;import java.util.ArrayList;
import java.util.List;@Service
public class ScoreFeignImpl implements ScoreFeign {@Overridepublic Result info() {List<Score> list = new ArrayList<>();for (int i = 0; i < 3; i++) {Score score = new Score();score.setName("name" + i);score.setScore(99.99);list.add(score);}return Result.ok().put("data",list);}@Overridepublic Result id(String id) {return null;}@Overridepublic Result add(UserDto user) {return null;}
}
3. 修改ScoreFeign接口的注解
同时需要import一个ScoreFeignImpl
@FeignClient(value = "openfeignDemo2", fallback = ScoreFeignImpl.class) //fallback 一旦出现熔断,要走哪个类。
4. 修改UserServiceImpl实现类方法
修改UserServiceImpl实现类内info的第30行的result.get(“data”),改为data
5. !!在sentineldemo2项目中!!更改info方法
在ScoreController类中,更改返回值的key,将list改为data。
6. 启动两个项目、测试熔断处理
关掉sentineldemo2项目模拟宕机效果。
五、熔断资源
1. 添加setMessage方法
在Result工具类中,添加setMessage方法
public Result setMessage(String message){this.message = message;return this;}
2. 新增trySources方法
在UserController类中,新增trySources方法
@GetMapping("/try")public Result trySources(){String sourcesName = "testTry";try(Entry entry = SphU.entry(sourcesName)) { //SphU.entry方法通过传入资源名称和其他参数来获取访问令牌。如果获取到令牌,则可以访问目标资源;如果没有获取到令牌,则无法访问对应资源。return Result.ok();} catch (BlockException e) {return Result.error().setMessage("被限流了!");}}
包导这三个
import com.alibaba.csp.sentinel.Entry;
import com.alibaba.csp.sentinel.SphU;
import com.alibaba.csp.sentinel.slots.block.BlockException;
3. 添加annotationSources、annotationSourcesError方法
在UserController类中,新增trySources方法
@GetMapping("/annotation")@SentinelResource(value = "testAnnotation", blockHandler = "annotationSourcesError")public Result annotationSources() {return Result.ok();}public Result annotationSourcesError(BlockException e) {return Result.error().setMessage("被限流了!");}
4. 重启两个项目
新增流量控制规则
注意给testTry加,不要给/user/try加,如果加错了,要删掉
访问项目,刷新几次,出现如下信息
总结
本文讲述了:
Sentinel:限制流量、熔断资源
在下攸攸太上,绿联风扇挺好用。