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次, 触发方法限流后执行限流方法

相关推荐
ZePingPingZe8 小时前
TCC—最终一致性分布式事务方案及【案例】
分布式·微服务
indexsunny9 小时前
互联网大厂Java面试实战:Spring Boot与微服务在电商场景中的应用解析
java·数据库·spring boot·微服务·maven·flyway·电商
振华OPPO11 小时前
开源高性能RPC框架:Apache Dubbo全览与实践指南
微服务·rpc·开源·apache·dubbo·总线
ChineHe11 小时前
Docker基础篇001_Docker入门指南(基于官方教程,5W字详细版)
运维·docker·微服务·容器·云计算·devops
lbb 小魔仙12 小时前
【Java】微服务架构 Java 实战:Spring Cloud Gateway + Nacos 全链路搭建指南
java·微服务·架构
今晚务必早点睡20 小时前
微服务改数据库密码后服务仍能访问?一次“看似异常、实则常见”的生产现象全解析
数据库·微服务·oracle
周壮1 天前
01 一探究竟:从架构的演变看微服务化架构
微服务·云原生·架构
周壮1 天前
04 服务治理:Nacos 如何实现微服务服务治理
微服务·云原生·架构
2301_815357701 天前
Java项目架构从单体架构到微服务架构的发展演变
java·微服务·架构
努力搬砖的咸鱼1 天前
Kubernetes 核心对象详解:Pod、Deployment、Service
微服务·云原生·容器·架构·kubernetes