1 引言摘要:Spring Cloud Netflix Hystrix 基于 Netflix Hystrix 实现服务熔断功能。Netflix Hystrix,Netflix 开源的一款容错库,使用HystrixCircuitBreaker类实现熔断器。
响应式编程不仅是编程技术,更是一种架构设计的系统方法,可应用于任何地方:
简单的 Web 应用系统大型企业解决方案数据流处理是响应式编程一大应用场景,流式系统特点:
低延迟高吞吐量用非阻塞式通信,可确保资源高效利用,实现低延迟、高吞吐量。
高并发通常涉及大量 IO 操作,相比传统同步阻塞式 IO 模型,响应式编程的异步非阻塞式IO模型适合应对。
网关:响应来自前端系统的流量,并将其转发到后端服务。
构建一个具有异步非阻塞式的请求处理流程的 Web 服务,需要高效处理跨服务之间的网络请求。
响应式编程的广泛应用:Hystrix、Spring Cloud Gateway 及 Spring WebFlux。
Spring Cloud Netflix Hystrix 基于 Netflix Hystrix 实现服务熔断功能。Netflix Hystrix,Netflix 开源的一款容错库,使用HystrixCircuitBreaker类实现熔断器。
HealthCountsStream采用滑动窗口,大量采用数据流处理方面技术及 RxJava 响应式编程框架。Hystrix 以s为单位统计系统中所有请求的处理情况,再每次取最近 10s 数据计算,如失败率超过阈值,熔断。
把系统运行时产生数据视为一个个事件,滑动窗口中每个桶的数据都来自事件,通常需对其转换以便后续操作。
Hystrix采用RxJava,用其一系列操作符实现滑动窗口:
window 操作符,把当前流中的元素收集到另外的流序列flatMap 操作符,把流中的每个元素转换成一个流,再把转换之后得到的所有流中的元素进行合并reduce 操作符,对流中包含的所有元素进行累积操作,得到一个包含计算结果的流this.bucketedStream = Observable.defer(new Func0> {@Overridepublic Observable call {return inputEventStream.observe// 使用 window 操作符收集一个 Bucket 时间内的数据.window(bucketSizeInMs, TimeUnit.MILLISECONDS)// 将每个 window 内聚集起来的事件集合汇总成 Bucket.flatMap(reduceBucketToSummary).startWith(emptyEventCountsToStart);}});this.sourceStream = bucketedStream// 将 N 个 Bucket 进行汇总.window(numBuckets, 1)// 汇总成一个窗口.flatMap(reduceWindowToSummary)...// 添加背压控制.onBackpressureDrop;Hystrix 用 RxJava 的 window、flatMap等操作符来将单位窗口时间内的事件。以及将一个窗口大小内的 Bucket 聚集到一起形成滑动窗口,并基于滑动窗口集成指标数据。
Spring开发的API网关,基于Spring5和Spring Boot2和Proiect Reactor框架提供响应式、非阻塞式I/O模型:
只需实现GlobalFilter接口,重写 filter:
public class IPLimitFilter implements GlobalFilter@Overridepublic Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 1 获取当前请求路径String url = exchange.getRequest.getURI.getPath;// 2 获得所有需ip限流校验的url listList ipLimitList = excludeUrlProperties.getipLimitUrls;// 3 校验并判断if (ipLimitList != null && !ipLimitList.isEmpty) {for (String limitUrl : ipLimitList) {if (antPathMatcher.matchStart(limitUrl, url)) {// 若匹配到,则表明需进行ip拦截校验log.info("IPLimitFilter - 拦截到需要进行ip限流校验的方法:URL = " + url);return doLimit(exchange, chain);}}}// 4 默认放行return chain.filter(exchange);}}filter返回的Mono对象,是响应式编程框架 Project Reactor 中代表单个返回值的流式对象。
@Componentpublic class PreGatewayFilterFactory extends AbstractGatewayFilterFactory {public PreGatewayFilterFactory {super(Config.class);}@Overridepublic GatewayFilter apply(Config config) {// grab configuration from Config objectreturn (exchange, chain) -> {//If you want to build a "pre" filter you need to manipulate the//request before calling chain.filterServerHttpRequest.Builder builder = exchange.getRequest.mutate;//use builder to manipulate the requestreturn chain.filter(exchange.mutate.request(builder.build).build);};}public static class Config {//Put the configuration properties for your filter here}}Spring 5 中引入的全新的响应式 Web 服务开发框架。针对涉及大量I/O 操作的服务化架构,WebFlux也是解决方案。
public Mono handle(ServerWebExchange exchange) {if (this.handlerMappings == null) {return createNotFoundError;}return Flux.fromIterable(this.handlerMappings).concatMap(mapping -> mapping.getHandler(exchange)).next// 如果没有找到 handlerMapping,则抛出异常.switchIfEmpty(createNotFoundError)// 触发 HandlerAdapter 的 handle 方法.flatMap(handler -> invokeHandler(exchange, handler))// 触发HandlerResultHandler的handleResult方法.flatMap(result -> handleResult(exchange, result));}通过理论联系实际,讨论了响应式编程的具体应用场景。
响应式编程技术已经应用到了日常开发的很多开源框架中,这些框架在分布式系统和微服务架构中得到了广泛的应用。
Q:Netflix Hystrix 中基于响应式流的滑动窗口实现机制?
A:Netflix Hystrix 中基于响应式流的滑动窗口实现机制是通过在数据流中使用滑动窗口来实现的。滑动窗口是一种将数据流分成固定大小的块的技术,每个块的大小和时间范围是可配置的。在 Hystrix 中,滑动窗口被用来收集服务调用的响应时间、成功率等指标,并在这些指标上执行断路器逻辑。
通过基于响应式流的滑动窗口实现机制,Hystrix 可以快速地检测到服务调用失败、超时等问题,并在出现问题时快速地停止向该服务发送请求,从而提高了系统的可靠性和稳定性。
魔都架构师 | 全网30W技术追随者 大厂分布式系统/数据中台实战专家 主导交易系统百万级流量调优 & 车联网平台架构 AIGC应用开发先行者 | 区块链落地实践者 以技术驱动创新,我们的征途是改变世界! 实战干货:编程严选网来源:JavaEdge