sentinel介绍
sentinel 是阿里开源的流量控制,熔断降级,系统负载保护的一个Java组件;
Sentinel 分为两个部分:
核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。
快速开始
我们这里还是以springboot 项目写一个demo,创建完成springboot 项目之后pom中引入依赖:
1 | <dependency> |
然后定义流控规则并加载到内存:
1 |
|
然后创建 controller
并定义资源:
1 |
|
然后我们启动项目并访问 http://localhost:8081/test0
然后不断的刷新,就会发现如果刷新频率超过一秒就会返回error 否则会返回一个时间戳。
这里这些类的api和源码我们先不介绍,只对其功能先做一个大致的体验。
接下来我们继续引入依赖:
1 | <dependency> |
同时注入一个切面到springboot 中去:
1 |
|
这个时候我们就可以通过注解去做流量控制了,写一个接口测试一下:
1 |
|
同样通过浏览器访问这个接口并不断刷新,会发现会频率过快的时候会返回 springboot 的错误页面,这是因为当aop切面会抛出 BlockException
,当没有对应的
异常处理器的时候springboot就会返回默认错误页面。这个时候我们有两种方式处理我们超出访问频率的时候的逻辑。
第一种,加降级方法:
1 |
|
第二种,加BlockException
异常处理器:
1 |
|
对所有controller 层做流控
sentinel
还提供了 spring-mvc 的拦截器,配置该拦截器你可以对你项目的所有所有请求进行流控管理,首先我们需要引入依赖:
1 | <dependency> |
然后注入一个sentinel 的拦截器:
1 |
|
代码中 SimpleBlockExceptionHandler
是自定义流控异常处理器,作用是处理流控异常 BlockException
源码如下:
1 |
|
SentinelWebMvcConfig
是流控配置类,通过其属性命名就不难猜出其作用 isHttpMethodSpecify
是否区分请求方式;isWebContextUnify
是否使用统一web上下文; UrlCleaner
是url清理器,作用是对url进行整理
接入控制台
sentinel
为我们提供了一个控制台应用,通过这个控制台我们可以直观的看到流控数据,动态的修改流控规则,下面让我们看看如何接入控制台。
首先引入依赖:
1 | <dependency> |
这个依赖sentinel连接 控制端的通讯包。
然后添加配置:
1 | localhost:8080 = |
注意,因为这个配置项不是属于 springboot的 所以不能添加在application中,要通过 -D 的方式在jvm启动的时候添加这个配置项。
再去 sentinel的github 下载 控制台jar包 ,启动该jar包;访问8080 端口,
登录账号密码和密码都是 sentinel。这个控制台实际上是一个springboot应用,启动端口和账号密码都可以通过application 修改。
接下来,启动我们自己的应用,并访问一些接口,我们就能再界面上看到监控数据:
通过控制台我们可以监控流量,管理流控降级等规则,这些规则都是存储在我们程序应用的内存中的,因此我们还需要学会这些规则的配置使用及其持久化。
sentinel 官方还提供了 springcloud 的包,可以让我们很方便的在 spring cloud 项目中使用sentinel,springcloud 中使用 sentinel和 springboot
中使用sentinel方式差不多,只是多了一个链路调用;因此我们要先学会了如何在 springboot中使用它。