本章主要内容是使用Sentinel给微服务加上限流熔断功能,防止异常情况拖垮应用服务
搭建环境
下载最新的jar包传送门,下载后打开cmd 运行jar包:java -jar sentinel-dashboard.jar,
端口:8080,用户名/密码:sentinel
所以接着到项目中整合一下Sentinel Dashboard的请求地址,在配置文件中添加如下配置(bootstrap.properties):
# sentinel配置
# 配置sentinel控制台的地址
spring.cloud.sentinel.transport.dashboard=127.0.0.1:8080
由于我们使用了nacos的配置中心,所以我们可以把配置信息添加到配置中心里面
Sentinel 相关配置项小结
客户端(微服务)连接控制台相关配置项:
spring:
cloud:
sentinel:
transport:
#指定控制台的地址
dashboard: localhost:8080
#指定和控制台通信的IP
#如不配置,会自动选择一个IP注册
client-ip: 127.0.0.1
#指定和控制台通信的端口,默认值8719
#如不设置,会自动从8719开始扫描,依次+1,直到找到未被占用的端口
port: 8719
#心跳发送周期,默认值null
#但在S impleHttpHeartbeatSender会用默认值10秒
heartbeat- interval-ms : 10000
经过以上几步我们准备好了使用Sentinel的基础环境,接下来我们看看限流熔断的具体配置。
限流
概念说明
生产者service是一个核心服务,我们通过压测得出服务的最大负载能力为60。如果某个时间aservice的请求数飙升达到了600,那服务肯定就直接gg了。所以为了保护我们的service,我们会给它配置一个限流规则,如果每秒钟有超过60的请求那不好意思我直接丢掉不处理了,然后丢给消费者一个异常,想拖垮我,哼,没门!
总而言之,限流是通过限制调用方对自己的调用,起到保护自己系统的效果。
限流配置
由于本人对Jmeter之类的压测工具不是很精通所以为了方便测试,我们就将service的QPS单机阈值设置成2,如果每秒QPS超过2,直接丢弃。
我们只需要在相关方法上加上@SentinelResource
注解,让其可以成为sentinel识别的资源即可
@SentinelResource(value = "index")
def index() {
render demoFegin.index()
}
然后配置
我们快速的刷新这个接口,会出现报错,我们正常访问是没有问题的
在我们程序的后台是这样的一个报错:
不要慌,这说明我们的目的达到了,限流成功!
实现限流的异常处理
我们可以通过@SentinelResource
中添加blockHandler
参数,给其添加自定义异常方法。如:
@SentinelResource(value = "test1", blockHandler = "blockExceptionHandle")
def test1() {
render 'tttttttttttttt'
}
String blockExceptionHandle(BlockException exception){
render "到顶了兄弟...."
}
注意,自定义的异常方法的参数和返回值要跟目标方法一样,参数可以追加BlockException
SentinelResource:blockHandler
处理 BlockException 的方法名,可选项。若未配置,则将 BlockException 直接抛出。
- blockHandler 函数访问范围需要是 public
- 返回类型需要与原方法相匹配
- 参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为 BlockException
- blockHandler 函数默认需要和原方法在同一个类中
我们再来访问一下接口:
持久化配置
由于Sentinel
的配置默认是放在内存中的,每当应用重启或者sentinel
重启都会丢失数据,我们这里使用Nacos作为配置中心持久化限流配置。
- 引入
sentinel-datasource-nacos
组件
// https://mvnrepository.com/artifact/com.alibaba.csp/sentinel-datasource-nacos
testCompile group: 'com.alibaba.csp', name: 'sentinel-datasource-nacos', version: '1.7.1'
系列文章链接:
Spring Cloud Alibaba + Grails4 学习路线三:配置隔离