服务治理-Resilience4j(限流)

  

舱壁

  

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

  

1,配置规则“秩序”

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

2,注解方式使用

  
 <代码> @PostMapping (“/?
  @io.github.resilience4j.circuitbreaker.annotation。断路器(name="秩序")
  @io.github.resilience4j.bulkhead.annotation。舱壁(name="秩序")
  公共CoffeeOrder createOrder () {
  NewOrderRequest orderRequest=NewOrderRequest.builder ()
  .customer(“李雷”)
  . items (arrays . aslist(“卡布奇诺”))
  .build ();
  CoffeeOrder订单=coffeeOrderService.create (orderRequest);
  log.info(“订单ID:{}”,命令!=零?order.getId ():“-”);
  返回订单;
  } 
  

3,使用配置注册方式

  
 <代码>私人断路器断路器;
  私人舱壁舱壁;//构造方法
  公共CustomerController (CircuitBreakerRegistry CircuitBreakerRegistry,
  BulkheadRegistry BulkheadRegistry) {
  断路器=circuitBreakerRegistry.circuitBreaker(“订单”);
  舱壁=bulkheadRegistry.bulkhead(“订单”);
  }
  
  @GetMapping(“/菜单”)
  公共ListreadMenu () {
  返回Try.ofSupplier (
  Bulkhead.decorateSupplier(舱壁,
  CircuitBreaker.decorateSupplier(断路器,
  ()→coffeeService.getAll ())))
  .recover (CircuitBreakerOpenException。类,Collections.emptyList ())
  .recover (BulkheadFullException。类,Collections.emptyList ())
  . get ();
  } 
  

RateLimiter

  

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

  

1,配置限流策略——“秩序”

  
 <代码>//一个限制周期内可访问次数
  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(路径="/",消耗=MediaType.APPLICATION_JSON_VALUE,
  生产=MediaType.APPLICATION_JSON_UTF8_VALUE)
  @ResponseStatus (HttpStatus.CREATED)
  @io.github.resilience4j.ratelimiter.annotation。RateLimiter (name="秩序")
  公共CoffeeOrder创建(@RequestBody NewOrderRequest里newOrder) {
  log.info(“接收新订单{}”,里newOrder);
  咖啡[]coffeeList=coffeeService.getCoffeeByName (newOrder.getItems ())
  .toArray(新咖啡[]{});
  返回orderService.createOrder (newOrder.getCustomer (), coffeeList);
  } 
  

3,使用配置注册方式

  
 <代码>私人RateLimiter RateLimiter;//构造方法
  公共CoffeeOrderController (RateLimiterRegistry RateLimiterRegistry) {
  rateLimiter=rateLimiterRegistry.rateLimiter(“订单”);
  }
  
  @GetMapping ("/{id} ")
  公共CoffeeOrder getOrder (@PathVariable (" id ") id) {
  CoffeeOrder订单=零;
  尝试{
  订单=rateLimiter.executeSupplier (()→orderService.get (id));
  log.info(“订单:{}”,顺序);
  }捕捉(RequestNotPermitted e) {
  日志。警告(“要求不允许!{}”,e.getMessage ());
  }
  返回订单;
  } 

服务治理-Resilience4j(限流)