舱壁
舱壁一般用于服务调用客户端,用于限定对特定的服务的并发请求数量,起到一下作用:
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 ()); } 返回订单; }代码>