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

相关推荐
Gemini19951 小时前
分布式和微服务的区别
分布式·微服务·架构
阿伟*rui3 小时前
配置管理,雪崩问题分析,sentinel的使用
java·spring boot·sentinel
茶馆大橘10 小时前
微服务系列五:避免雪崩问题的限流、隔离、熔断措施
java·jmeter·spring cloud·微服务·云原生·架构·sentinel
coding侠客10 小时前
揭秘!微服务架构下,Apollo 配置中心凭啥扮演关键角色?
微服务·云原生·架构
lexusv8ls600h12 小时前
微服务设计模式 - 网关路由模式(Gateway Routing Pattern)
spring boot·微服务·设计模式
Shenqi Lotus12 小时前
Redis-“自动分片、一定程度的高可用性”(sharding水平拆分、failover故障转移)特性(Sentinel、Cluster)
redis·sentinel·cluster·failover·sharding·自动分片·水平拆分
码农爱java15 小时前
Kafka 之消息并发消费
spring boot·微服务·kafka·mq·消息中间件·并发消费
Flamesky16 小时前
dotnet core微服务框架Jimu ~ 会员注册微服务
微服务·services·micro
Genius Kim17 小时前
SpringCloud Sentinel 服务治理详解
spring cloud·sentinel·php