RateLimiter-限流工具

限流工具 RateLimiter ,限流工具的用法基本上和前两个差不多,可以通过 AOP 的方式使用,也可以通过编程式来使用。
github :https://github.com/ln0491/resilience4j-springboot

生产者
@RestController
public class HelloContrtoller {


    @GetMapping("/hello")
    public  String hell(String name){
        String s= "hello "+name +" !";
        System.out.println("s "+s+" "+new Date());

        return s;
    }
}

消费者端

 <dependency>
            <groupId>io.github.resilience4j</groupId>
            <artifactId>resilience4j-spring-boot2</artifactId>
            <version>0.14.1</version>
        </dependency>
AOP 式
resilience4j.ratelimiter:
    limiters:
        backendA:
            limitForPeriod: 1
            limitRefreshPeriodInMillis: 5000
            timeoutInMillis: 5000
            subscribeForEvents: true
            registerHealthIndicator: true
            eventConsumerBufferSize: 100
  • backendA 在这里依然表示配置的名称,在 Java 代码中,我们将通过指定限流工具的名称来使用某一种限流策略;
  • limitForPeriod 表示请求频次的阈值;
  • limitRefreshPeriodInMillis 表示频次刷新的周期;
  • timeoutInMillis 许可期限的等待时间,默认为5秒;
  • subscribeForEvents 表示开启事件订阅;
  • registerHealthIndicator 表示开启健康监控;
  • eventConsumerBufferSize 表示事件缓冲区大小。
@Service
@RateLimiter(name = "backendA")
public class HelloServiceRateLimiter {
    @Autowired
    RestTemplate restTemplate;
    public String hello(String name) {
        return restTemplate.getForObject("http://provider/hello?name={1}", String.class, name);
    }
}

@GetMapping("/rl")
public void rateLimiter(String name) {
    for (int i = 0; i < 5; i++) {
        String hello = helloServiceRateLimiter.hello(name);
    }
}

s hello 富士达顶戴 4234fsdfd ! Wed Jun 26 20:30:59 CST 2019
s hello 富士达顶戴 4234fsdfd ! Wed Jun 26 20:31:01 CST 2019
s hello 富士达顶戴 4234fsdfd ! Wed Jun 26 20:31:06 CST 2019
s hello 富士达顶戴 4234fsdfd ! Wed Jun 26 20:31:11 CST 2019
s hello 富士达顶戴 4234fsdfd ! Wed Jun 26 20:31:16 CST 2019

编程式
public void hello2(String name) {
    RateLimiterConfig config = RateLimiterConfig.custom()
            .limitRefreshPeriod(Duration.ofMillis(5000))
            .limitForPeriod(1)
            .timeoutDuration(Duration.ofMillis(6000))
            .build();
    RateLimiterRegistry rateLimiterRegistry = RateLimiterRegistry.of(config);
    RateLimiter rateLimiter = RateLimiter.of("backendB", config);
    Supplier<String> supplier = RateLimiter.decorateSupplier(rateLimiter, () ->
            restTemplate.getForObject("http://provider/hello?name={1}", String.class, name)
    );
    for (int i = 0; i < 5; i++) {
        Try<String> aTry = Try.ofSupplier(supplier);
        System.out.println(aTry.get());
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值