Spring Cloud Alibaba + Grails4 学习路线四:限流熔断

本章主要内容是使用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的配置中心,所以我们可以把配置信息添加到配置中心里面

扫描二维码关注公众号,回复: 9992578 查看本文章

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 学习路线三:配置隔离

Spring Cloud Alibaba + Grails4 学习路线二:服务调用

Spring Cloud Alibaba + Grails4 学习路线一:服务注册

发布了102 篇原创文章 · 获赞 40 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/qq_16165281/article/details/104054982