Sentinel入门与进阶:微服务流量控制的最佳实践 ( 四 )

6.资源限流

6.1.修改程序

6.1.1.在Controller中增加下列代码

java 复制代码
    @Autowired
    private TestService testService;

    @RequestMapping("/callService")
    public String callService(){
        return testService.testMethod();
    }

6.1.2.增加service接口及接口实现类

java 复制代码
package com.yuan.scasentineldashboard.service;

public interface TestService {
    String testMethod();
}
java 复制代码
package com.yuan.scasentineldashboard.service.impl;

import com.yuan.scasentineldashboard.service.TestService;
import org.springframework.stereotype.Service;

@Service
public class TestServiceImpl implements TestService {

    @Override
    public String testMethod() {
        return "这是service中的方法";
    }
}

6.1.3.测试

浏览器访问 http://localhost:9000/sentinelTest/callService

6.2.pom.xml 增加 依赖

增加依赖以支持资源限流的注解

xml 复制代码
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-annotation-aspectj</artifactId>
        </dependency>

6.3.修改方法

在serviceImpl中增加 @SentinelResource注解,就可以实现对该方法的限流

java 复制代码
    @Override
    @SentinelResource(value = "testMethod")
    public String testMethod() {
        return "这是service中的方法";
    }

6.4.Sentinel 监听

查看 Sentinel Dashboard 可以看到

6.5.修改限流配置

json 复制代码
[
    {
        "resource": "/sentinelTest/sayHello",
        "limitApp": "default",
        "grade": 1,
        "count": 3    
    },
    {
        "resource": "/sentinelTest/callService",
        "limitApp": "default",
        "grade": 1,
        "count": 3    
    },
    {
        "resource": "testMethod",
        "limitApp": "default",
        "grade": 1,
        "count": 2    
    }
]

6.6.查看 sentinel 流控规则

6.7.测试

1秒内 连续请求 3次, 触发方法限流后抛出了异常

1秒内 连续请求4次, 触发请求限流

6.8.实现方法的限流

通过刚才的例子,我们看到方法已经成功被限流了,但是限流后直接抛出了异常, 实际开发中,我们不希望展示一个生硬的报错,我们希望限流后能自定义一些处理方式。我们可修改@SentinelResource注解的参数来达到目的,

注意:处理的方法需要与被限流的方法保持参数相同,并在最后加上BlockException异常参数,同时返回类型必须相同。

6.8.1.修改serviceImpl 类

java 复制代码
package com.yuan.scasentineldashboard.service.impl;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.yuan.scasentineldashboard.service.TestService;
import org.springframework.stereotype.Service;

@Service
public class TestServiceImpl implements TestService {

    @Override
    @SentinelResource(value = "testMethod", blockHandler = "blockMethod")
    public String testMethod(String a) {
        return "这是service中的方法";
    }

    public String blockMethod(String a, BlockException e){
        return "方法被限流了";
    }
}

6.8.2.测试效果

1秒内 连续请求 3次, 触发方法限流后执行限流方法

相关推荐
Lill_bin1 小时前
JVM内部结构解析
jvm·后端·spring cloud·微服务·云原生·ribbon
xmh-sxh-13144 小时前
微服务配置中心介绍
微服务
GoppViper17 小时前
golang学习笔记24——golang微服务中配置管理问题的深度剖析
笔记·后端·学习·微服务·golang·配置管理
2401_8566545117 小时前
员工疯狂打CALL!解锁企业微信新玩法,2024年必学秘籍来啦!
安全·微服务·微信·电脑·企业微信
1.01^100020 小时前
[000-01-008].第08节:Sentinel 环境搭建
sentinel
世俗ˊ20 小时前
微服务-- Sentinel的使用
java·微服务·sentinel
你是我的天晴2 天前
Istio:微服务网格的强大工具,Istio介绍
微服务·云原生·istio
Lill_bin2 天前
Ribbon简介
分布式·后端·spring cloud·微服务·云原生·ribbon
HoweWWW2 天前
k8s 微服务 ingress-nginx 金丝雀发布
微服务·容器·kubernetes
珍珠是蚌的眼泪2 天前
微服务_1、入门
分布式·微服务·eureka·springcloud·注册中心