Spring Cloud Alibaba学习笔记(6) - Sentinel使用总结
使用Sentinel API
Sentinel主要有三个核心Api:
SphU:定义资源,让资源收到监控,保护资源
SphU 包含了 try-catch 风格的 API。用这种方式,当资源发生了限流之后会抛出 BlockException。这个时候可以捕捉异常,进行限流之后的逻辑处理。
String resourceName = "test_sentinel_api";
Entry test_sentinel_api = null;
// 定义一个Sentinel保护的资源
try {
test_sentinel_api = SphU.entry(resourceName);
...
}
// 若被保护的资源被限流或者降级
catch (BlockException e) {
e.printStackTrace();
return "限流,或者降级了";
}
finally {
if (test_sentinel_api != null) {
test_sentinel_api.exit();
}
}
PS:SphU.entry(xxx) 需要与 entry.exit() 方法成对出现,匹配调用,否则会导致调用链记录异常,抛出 ErrorEntryFreeException 异常。
若 entry 的时候传入了热点参数,那么 exit 的时候也一定要带上对应的参数(exit(count, args)),否则可能会有统计错误。这个时候不能使用 try-with-resources 的方式。
Tracer:异常统计
// 针对来源
String resourceName = "test_sentinel_api";
Entry test_sentinel_api = null;
// 定义一个Sentinel保护的资源
try {
test_sentinel_api = SphU.entry(resourceName);
if (StringUtils.isBlank(a)) {
throw new IllegalArgumentException("a不能为空");
}
return a;
}
// 若被保护的资源被限流或者降级
catch (BlockException e) {
e.printStackTrace();
return "限流,或者降级了";
}
catch (IllegalArgumentException e2) {
// 统计IllegalArgumentException
Tracer.trace(e2);
return "参数非法";
}
finally {
if (test_sentinel_api != null) {
test_sentinel_api.exit();
}
}
通过 Tracer.trace(ex) 来统计异常信息时,由于 try-with-resources 语法中 catch 调用顺序的问题,会导致无法正确统计异常数,因此统计异常信息时也不能在 try-with-resources 的 catch 块中调用 Tracer.trace(ex)。
ContextUtil:实现调用来源,实现调用
// 针对来源
String resourceName = "test_sentinel_api";
ContextUtil.enter(resourceName, "study01");
通过SentinelResource注解的方式
Sentinel 支持通过 @SentinelResource 注解定义资源并配置 blockHandler 和 fallback 函数来进行限流之后的处理。
@GetMapping("test_sentinel_resource")
@SentinelResource(
value = "test_sentinel_resource",
blockHandler = "block",
fallback = "fallback"
)
public String testSentinelResource(@RequestParam(required = false) String a) {
if (StringUtils.isBlank(a)) {
throw new IllegalArgumentException("a不能为空");
}
return a;
}
/**
* 处理限流或者降级
*/
public String block(String a, BlockException e) {
log.warn("限流,或者降级了", e);
return "限流,或者降级了 block";
}
public String fallback(String a, BlockException e) {
return "限流,或者降级了 fallback";
}
@SentinelResource同样支持通过配置blockHandlerClass和fallbackClass配置类来进行限流后的处理
RestTemplate整合Sentinel
在初始化restTemplate的时候添加@SentinelRestTemplate注解就可以为RestTemplate整合Sentinel,代码如下:
@Bean
@LoadBalanced
@SentinelRestTemplate
public RestTemplate restTemplate() {
return new RestTemplate();
}
可以通过配置resttemplate. sentinel.enabled来开启或关闭整合,代码如下:
resttemplate:
sentinel:
# 关闭、打开SentinelRestTemplate注解
enabled: true
Feign整合Sentinel
在配置文件中添加如下配置便可以为Feign整合Sentinel:
feign:
# feign整合sentinel
sentinel:
enabled: true
如果服务被限流或降级时,如果想要定制定制自己的处理逻辑,可以使用@FeignClient注解的fallback属性;如果定制处理逻辑的同时,还想拿到异常的具体细节,可以使用fallbackFactory属性,示例代码如下:
@FeignClient(
name = "study02",
// 拿不到异常
fallback = CommentFeignClientFallback.class,
// 拿到异常
fallbackFactory = CommentFeignClientFallbackFactory.class
)
public interface CommentFeignClient {
@GetMapping("/find")
DemoComment find();
}
@Component
public class CommentFeignClientFallback implements CommentFeignClient {
/**
* 一旦被限流,就会进入这个方法
* @return
*/
@Override
public DemoComment find() {
DemoComment demoComment = new DemoComment();
return demoComment;
}
}
@Component
@Slf4j
public class CommentFeignClientFallbackFactory implements FallbackFactory<CommentFeignClient> {
@Override
public CommentFeignClient create(Throwable throwable) {
return new CommentFeignClient() {
@Override
public DemoComment find() {
DemoComment demoComment = new DemoComment();
return demoComment;
}
};
}
}
Spring Cloud Alibaba学习笔记(6) - Sentinel使用总结的更多相关文章
- Spring Cloud Alibaba学习笔记(1) - 整合Spring Cloud Alibaba
Spring Cloud Alibaba从孵化器版本毕业:https://github.com/alibaba/spring-cloud-alibaba,记录一下自己学习Spring Cloud Al ...
- Spring Cloud Alibaba学习笔记(15) - 整合Spring Cloud Gateway
Spring Cloud Gateway 概述 Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于Netty.Reactor以及WEbFlux构建,它 ...
- Spring Cloud Alibaba学习笔记
引自B站楠哥:https://space.bilibili.com/434617924 一.创建父工程 创建父工程hello-spring-cloud-alibaba Spring Cloud Ali ...
- Spring Cloud Alibaba学习笔记(3) - Ribbon
1.手写一个客户端负载均衡器 在了解什么是Ribbon之前,首先通过代码的方式手写一个负载均衡器 RestTemplate restTemplate = new RestTemplate(); // ...
- Spring Cloud Alibaba学习笔记(22) - Nacos配置管理
目前业界流行的统一配置管理中心组件有Spring Cloud Config.Spring Cloud Alibaba的Nacos及携程开源的Apollo,本文将介绍Nacos作为统一配置管理中心的使用 ...
- Spring Cloud Alibaba学习笔记(2) - Nacos服务发现
1.什么是Nacos Nacos的官网对这一问题进行了详细的介绍,通俗的来说: Nacos是一个服务发现组件,同时也是一个配置服务器,它解决了两个问题: 1.服务A如何发现服务B 2.管理微服务的配置 ...
- Spring Cloud Alibaba学习笔记(7) - Sentinel规则持久化及生产环境使用
Sentinel 控制台 需要具备下面几个特性: 规则管理及推送,集中管理和推送规则.sentinel-core 提供 API 和扩展接口来接收信息.开发者需要根据自己的环境,选取一个可靠的推送规则方 ...
- Spring Cloud Alibaba学习笔记(5) - 整合Sentinel及Sentinel规则
整合Sentinel 应用整合Sentinel 在dependencies中添加依赖,即可整合Sentinel <dependency> <groupId>com.alibab ...
- Spring Cloud Alibaba学习笔记(18) - Spring Cloud Gateway 内置的过滤器工厂
参考:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.1.0.RELEASE/single/spring-clou ...
- Spring Cloud Alibaba学习笔记(23) - 调用链监控工具Spring Cloud Sleuth + Zipkin
随着业务发展,系统拆分导致系统调用链路愈发复杂一个前端请求可能最终需要调用很多次后端服务才能完成,当整个请求陷入性能瓶颈或不可用时,我们是无法得知该请求是由某个或某些后端服务引起的,这时就需要解决如何 ...
随机推荐
- 微信小程序左滑删除未操作有复位效果
1.wxml <!--pages/test/test.wxml--> <view class="page"> <movable-area class= ...
- Activity: launchMode 和 Intent.FLAG_ACTIVITY_CLEAR_TOP
Activity 的 launchMode: 1. standard: 标准模式 这种启动模式为标准模式,也是默认模式.每当我们启动一个Activity,系统就会相应的创建一个实例,不管这个实例是否已 ...
- IOS CocoaPods基本使用技巧
目录: 什么是CocoaPods 如何下载并安装CocoaPods 如何使用CocoaPods 什么是CocoaPods 当开发iOS应用时,或多或少的都会引用第三方类库,例如AFNetworking ...
- 【转】Python常见web系统返回码
responses = { 100: ('Continue', 'Request received, please continue'), 101: ('Switching Protocols', ' ...
- 我的一个PLSQL函数 先查询再插入数据库的函数 动态SQL拼接查询条件、通用游标、记录定义(封装部分查询字段并赋值给游标)、insert select 序列、常量【我】
先查询再插入数据库的函数 CREATE OR REPLACE FUNCTION F_REVENUE_SI(l_p_cd in Varchar2, l_c_cd in Varchar2, l_prod_ ...
- ES6深入浅出-4 迭代器与生成器-1.字面量增强
今天的内容 字面量literal 写出来就是它的值 例如字符串hello.这就是自变量. 一个空对象,也是自变量 写出来就是代表它写出来的那个意思就是自变量. 与其相反的就是构造出来的.例如下面的ne ...
- 软件定义网络基础---SDN数据平面
主要介绍SDN架构和转发模型 一:传统网络设备 (一)传统设备控制平面和数据平面 (二)数据平面的任务 数据平面对数据包的处理,主要通过查询由控制平面所生成的转发信息表来完成 (三)传统网络数据平面数 ...
- 报错:WARN [WorkerSender[myid=1]:QuorumCnxManager@584] - Cannot open channel to 2 at election address /x.x.x.x:3888
报错背景: zookeeper安装完成之后,启动之后正常,但是查看log文件zookeeper.log时发现报错. 报错现象: -- ::, [myid:] - INFO [WorkerSender[ ...
- Form表单的传递与接收
目录 表单的构建 后端接收 创建model 用Model接收表单的后端 表单的构建 我才知道这个东西,在开发中经常遇到表单的情况.一下子提交一串内容.表单元素 form,里面的内容必须有name字段. ...
- 登录另一台linux主机并且执行相应的命令
[root@bogon ~]# cat a.sh #!/bin/bash ssh root@192.168.0.98 'ls /root'