微服务轮子项目(16) -Alibaba Sentinel限流熔断(使用示例)
文章目录
1. 引言
在上一博客《微服务轮子项目(15) -审计日志》,主要讲解了审计日志的集成使用,以及如何配置到ELK。
本文要讲解的是阿里的限流熔断框架Sentinel
。
2. 介绍
Sentinel
是阿里巴巴开源的分布式系统的流量防卫组件,Sentinel
把流量作为切入点,从流量控制,熔断降级,系统负载保护等多个维度保护服务的稳定性。
Sentinel开源项目地址:https://github.com/alibaba/Sentinel
Wiki地址:https://github.com/alibaba/Sentinel/wiki
3. 使用示例
3.1 项目集成
3.1.1 添加依赖
首先,修改pom.xml
文件,引入 Sentinel starter
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
3.1.2 配置限流规则
Sentinel 提供了两种配置限流规则的方式:代码配置
和 控制台配置
。
通过代码来实现限流规则的配置。一个简单的限流规则配置示例代码如下,更多限流规则配置详情请参考 Sentinel 文档。
List<FlowRule> rules = new ArrayList<FlowRule>();
FlowRule rule = new FlowRule();
rule.setResource(str);
// set limit qps to 10
rule.setCount(10);
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setLimitApp("default");
rules.add(rule);
FlowRuleManager.loadRules(rules);
3.2 启动 Sentinel 控制台
1.首先需要获取 Sentinel 控制台,支持直接下载和源码构建两种方式。
- 直接下载:下载 Sentinel 控制台(下载截止目前为止最新版本的控制台 jar 包)
- 源码构建:进入 Sentinel Github 项目页面,将代码 git clone 到本地自行编译打包,参考此文档。
2.启动控制台,执行 Java 命令 java -jar -Dserver.port=6999 sentinel-dashboard.jar
完成Sentinel
控制台的启动。
控制台默认的监听端口为 8080,本项目修改为6999。
3.3 应用接入配置
3.3.1 引入jar
修改pom.xml
文件,引入 Sentinel starter
:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
3.3.2 接入限流埋点
- HTTP 埋点:
Sentinel starter
默认为所有的 HTTP 服务提供了限流埋点,如果只想对 HTTP 服务进行限流,那么只需要引入依赖,无需修改代码。 - 自定义埋点:如果需要对某个特定的方法进行限流或降级,可以通过
@SentinelResource
注解来完成限流的埋点,示例代码如下:
@SentinelResource("resource")
public String hello() {
return "Hello";
}
当然也可以通过原始的SphU.entry(xxx)
方法进行埋点,可以参见 Sentinel 文档。
3.3.3 对接Sentinel 控制台
在应用的/src/main/resources/application.properties
中添加基本配置信息:
spring.cloud.sentinel.transport.dashboard=localhost:6999
3.3.4 配置降级、限流规则
Sentinel 能通过控制台动态配置规则,不过这样配置不会持久化不建议这样做,建议搭配nacos实现动态配置并且配置持久化
Sentinel
内部提供了动态规则的扩展实现 ReadableDataSource。
Sentinel starter
整合了目前存在的几类 ReadableDataSource
。只需要在配置文件中进行相关配置,即可在 Spring
容器中自动注册 DataSource
。
比如要定义两个ReadableDataSource
,分别是 FileRefreshableDataSource
和 NacosDataSource
,配置如下:
spring.cloud.sentinel.datasource.ds1.file.file=classpath: degraderule.json
spring.cloud.sentinel.datasource.ds1.file.data-type=json
spring.cloud.sentinel.datasource.ds1.file.rule-type=degrade
spring.cloud.sentinel.datasource.ds2.nacos.server-addr=localhost:8848
spring.cloud.sentinel.datasource.ds2.nacos.dataId=sentinel
spring.cloud.sentinel.datasource.ds2.nacos.groupId=DEFAULT_GROUP
spring.cloud.sentinel.datasource.ds2.nacos.data-type=json
ds1 和 ds2 表示ReadableDataSource的名称,可随意编写。ds1 和 ds2 后面的 file 和 nacos 表示ReadableDataSource的类型。
目前支持file, nacos, zk, apollo 这4种类型。
其中nacos,zk,apollo这3种类型的使用需要加上对应的依赖sentinel-datasource-nacos, sentinel-datasource-zookeeper, sentinel-datasource-apollo。
当ReadableDataSource加载规则数据成功的时候,控制台会打印出相应的日志信息:
[Sentinel Starter] DataSource ds1-sentinel-file-datasource load 3 DegradeRule
[Sentinel Starter] DataSource ds2-sentinel-nacos-datasource load 2 FlowRule
3.3.5 自定义限流处理逻辑
默认限流异常处理:
- URL 限流触发后默认处理逻辑是,直接返回 “Blocked by Sentinel (flow limiting)”。 如果需要自定义处理逻辑,实现的方式如下:
public class CustomUrlBlockHandler implements UrlBlockHandler {
@Override
public void blocked(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException {
// todo add your logic
}
}
WebCallbackManager.setUrlBlockHandler(new CustomUrlBlockHandler());
使用 @SentinelResource
注解下的限流异常处理:
- 如果需要自定义处理逻辑,填写
@SentinelResource
注解的blockHandler
属性(针对所有类型的BlockException
,需自行判断)或fallback
属性(针对熔断降级异常),注意对应方法的签名和位置有限制,详情见 Sentinel 注解支持文档。示例实现如下:
public class TestService {
// blockHandler 是位于 ExceptionUtil 类下的 handleException 静态方法,需符合对应的类型限制.
@SentinelResource(value = "test", blockHandler = "handleException", blockHandlerClass = {ExceptionUtil.class})
public void test() {
System.out.println("Test");
}
// blockHandler 是位于当前类下的 exceptionHandler 方法,需符合对应的类型限制.
@SentinelResource(value = "hello", blockHandler = "exceptionHandler")
public String hello(long s) {
return String.format("Hello at %d", s);
}
public String exceptionHandler(long s, BlockException ex) {
// Do some log here.
ex.printStackTrace();
return "Oops, error occurred at " + s;
}
}
public final class ExceptionUtil {
public static void handleException(BlockException ex) {
System.out.println("Oops: " + ex.getClass().getCanonicalName());
}
}
相关文章
- Hearthstone-Deck-Tracker项目的编译
- 【Css】Css和Html常用设计实例参考笔记(自己开发项目用)
- 淘东电商项目(32) -SSO单点登录(集成SSO认证服务)
- 微服务轮子项目(52) -Elasticsearch性能优化
- 微服务轮子项目(46) -SonarQube静态代码测试
- 微服务轮子项目(34) -Kafka
- 微服务轮子项目(25) -分布式事务(SEATA)
- 微服务轮子项目(21) -Docker安装
- 微服务轮子项目(19) -Alibaba Sentinel限流熔断(网关流控)
- 微服务轮子项目(14) - 慢查询SQL
- 微服务轮子项目(10) - 分布式ID生成器设计
- 微服务轮子项目(06) - 服务认证架构设计(URL级权限控制)
- 微服务轮子项目(03) - 服务认证架构设计(有网络隔离)
- 66分布式电商项目 - nginx基于域名配置虚拟主机
- uni-app - 实现多选功能,点击项目时选中并高亮显示(支持全选 / 反选,以及轻松的 “回显“ 数据)点击选中并改变样式,全端兼容 H5 App 小程序,代码高效简洁无 BUG
- 如何能成为测试老大?先搞懂项目中的敏捷开发模式
- Java项目(前端vue后台java微服务)在线考试系统(java+vue+springboot+mysql+maven)
- 【Java】Spring boot、Mysql项目部署到Linux中后启动日志慢8小时(时区不对/时区错误)
- mockm 是在项目中使用 mockjs 的最佳方案, 集自动模拟和调试于一身
- 《软件工艺》—第1章软件工程适合你的项目吗?
- SwiftUI macOS和iPad精品项目之天气完整App(项目含源码)
- 一、.NET Core MVC 项目结构模板
- maven项目编译运行时提示jdk版本过低问题解决方法
- Sangmado之.NET项目公共基础类库
- Fast Data(FD.io)开源项目发布,瞄准高性能IO服务框架
- apache开源项目--mina
- 可以快速搭建的免费开源项目:直播带货、富文本笔记、思维导图、声音克隆、消息推送服务、文档协作等等
- springboot 项目通过过滤器(Filter)实现白名单过滤以及拦截客户端请求服务接口进行统一日志记录的实现方式
- 各地光热发电示范项目可研陆续结束 明年将迎开工潮