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

相关推荐
zfj3213 小时前
手动搭建Redis1主2从+ 3 Sentinel 高可用集群
redis·sentinel·高可用
WeiLai11127 小时前
面试基础--微服务架构:如何拆分微服务、数据一致性、服务调用
java·分布式·后端·微服务·中间件·面试·架构
Swift社区9 小时前
【微服务优化】ELK日志聚合与查询性能提升实战指南
spring·elk·微服务·云原生·架构
陌殇殇13 小时前
002 SpringCloudAlibaba整合 - Feign远程调用、Loadbalancer负载均衡
java·spring cloud·微服务
落落落sss1 天前
MongoDB
数据库·windows·redis·mongodb·微服务·wpf
黄名富1 天前
Spring Cloud — 深入了解Eureka、Ribbon及Feign
分布式·spring·spring cloud·微服务·eureka·ribbon
LUCIAZZZ1 天前
SkyWalking快速入门
java·后端·spring·spring cloud·微服务·springboot·skywalking
黄名富1 天前
Spring Cloud — Hystrix 服务隔离、请求缓存及合并
java·分布式·spring·spring cloud·hystrix·微服务
yinbp1 天前
bboss v7.3.5来袭!新增异地灾备机制和Kerberos认证机制,助力企业数据安全
大数据·elasticsearch·微服务·etl·restclient·bboss
一位卑微的码农2 天前
深入解析Spring Cloud Config:构建高可用分布式配置中心
分布式·spring cloud·微服务·架构