zoukankan      html  css  js  c++  java
  • 服务治理-Resilience4j(限流)

    Bulkhead

    Bulkhead一般用于服务调用客户端,用于限定对特定的服务的并发请求数量,起到一下作用:
    1、防⽌下游依赖被并发请求冲击
    2、防⽌发⽣连环故障

    1、配置规则“order”

    //允许最大的并发数量
    resilience4j.bulkhead.backends.order.max-concurrent-call=1
    //阻塞线程的最大时间量
    resilience4j.bulkhead.backends.order.max-wait-time=5

    2、注解方式使用

    @PostMapping("/order")
        @io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker(name = "order")
        @io.github.resilience4j.bulkhead.annotation.Bulkhead(name = "order")
        public CoffeeOrder createOrder() {
            NewOrderRequest orderRequest = NewOrderRequest.builder()
                    .customer("Li Lei")
                    .items(Arrays.asList("capuccino"))
                    .build();
            CoffeeOrder order = coffeeOrderService.create(orderRequest);
            log.info("Order ID: {}", order != null ? order.getId() : "-");
            return order;
        }

    3、使用配置注册方式

            private CircuitBreaker circuitBreaker;
        private Bulkhead bulkhead;
    
          //构造方法
        public CustomerController(CircuitBreakerRegistry circuitBreakerRegistry,
                                  BulkheadRegistry bulkheadRegistry) {
            circuitBreaker = circuitBreakerRegistry.circuitBreaker("order");
            bulkhead = bulkheadRegistry.bulkhead("order");
        }
    
        @GetMapping("/menu")
        public List<Coffee> readMenu() {
            return Try.ofSupplier(
                    Bulkhead.decorateSupplier(bulkhead,
                            CircuitBreaker.decorateSupplier(circuitBreaker,
                                    () -> coffeeService.getAll())))
                    .recover(CircuitBreakerOpenException.class, Collections.emptyList())
                    .recover(BulkheadFullException.class, Collections.emptyList())
                    .get();
        }

    RateLimiter

    RateLimiter用于限制特定时间段内的执⾏次数,一般用于服务提供方,保护自己不受到冲击。

    1、配置限流策略-“order”

    //一个限制周期内可访问次数
    resilience4j.ratelimiter.limiters.order.limit-for-period=3
    //限制周期,每个周期之后,速率限制器将重置回limitForPeriod值
    resilience4j.ratelimiter.limiters.order.limit-refresh-period-in-millis=30000
    //线程等待允许执行时间
    resilience4j.ratelimiter.limiters.order.timeout-in-millis=1000
    //开启时间订阅
    resilience4j.ratelimiter.limiters.order.subscribe-for-events=true
    //开启监控监控
    resilience4j.ratelimiter.limiters.order.register-health-indicator=true

    2、使用注解方式

    @PostMapping(path = "/", consumes = MediaType.APPLICATION_JSON_VALUE,
                produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
        @ResponseStatus(HttpStatus.CREATED)
        @io.github.resilience4j.ratelimiter.annotation.RateLimiter(name = "order")
        public CoffeeOrder create(@RequestBody NewOrderRequest newOrder) {
            log.info("Receive new Order {}", newOrder);
            Coffee[] coffeeList = coffeeService.getCoffeeByName(newOrder.getItems())
                    .toArray(new Coffee[]{});
            return orderService.createOrder(newOrder.getCustomer(), coffeeList);
        }

    3、使用配置注册方式

        private RateLimiter rateLimiter;
        //构造方法
        public CoffeeOrderController(RateLimiterRegistry rateLimiterRegistry) {
            rateLimiter = rateLimiterRegistry.rateLimiter("order");
        }
    
        @GetMapping("/{id}")
        public CoffeeOrder getOrder(@PathVariable("id") Long id) {
            CoffeeOrder order = null;
            try {
                order = rateLimiter.executeSupplier(() -> orderService.get(id));
                log.info("Get Order: {}", order);
            } catch (RequestNotPermitted e) {
                log.warn("Request Not Permitted! {}", e.getMessage());
            }
            return order;
        }
  • 相关阅读:
    Ubuntu下cc和gcc的关系
    Ubuntu下makefile的简单使用
    Ubuntu下配置Apache以及搭载CGI
    Easy C 编程 in Linux
    Ubuntu下配置GitHub
    Ubuntu学习之路2
    Ubuntu下配置Java环境
    Vim学习之路1
    将博客搬至CSDN
    ubuntu连接手机的方法
  • 原文地址:https://www.cnblogs.com/aiaitie/p/11806215.html
Copyright © 2011-2022 走看看