Sentinel学习
系列文章目录
前言
本文我们要讲述:
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: redis
cloud:
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 {
@Bean
public 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 {
@Override
public 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);
}
@Override
public Result id(String id) {
return null;
}
@Override
public 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:限制流量、熔断资源
在下攸攸太上,绿联风扇挺好用。
原文地址:https://blog.csdn.net/howwickhappy/article/details/142648301
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!