Soul的限流斷路器的使用和流程

Soul的限流斷路器的使用和流程

因爲以前並無使用過Hystrix,Resilience4j和sentinel中的任何一種,此處僅對三種流控和斷路器插件作一個流程分析git

Soul中Hystrix的使用和操做流程

  • 關於soul中插件的流程前文已經說過屢次了,在此不在贅述。
  • 根據規則的具體選擇方式。Soul構建了兩個不一樣的操做類HystrixCommandOnThread和HystrixCommand。兩個類的不一樣是HystrixCommandOnThread爲攔截的接口創建了本身的線程池,實現了線程池的隔離。而HystrixCommand只是實現了短路器的基本功能。使用了線程池隔離以後。能夠針對不一樣的線程使用不一樣的線程池配置。既區分了不一樣的接口和自定義配置解決不一樣併發程度所形成的壓力。也解決了不一樣接口之間形成影響的問題。這兩個類基本就是@HystrixCommand的各大屬性的集合,Soul經過界面配置的方式實現了斷路器的零侵入性。這樣來講,比Hystrix直接嵌入客戶端更加方便

file

  • 另外在具體的斷路執行run過程當中使用了RxReactiveStreams.toObservable的監聽來實現具體的異步監聽的狀況。同時追蹤Hystrix源碼能夠看到Hystrix使用了RxJava
  • Hystrix插件的使用中綜合使用了建造者模式,命令模式,觀察者模式。以及RxReactiveStreams響應式流式編程。

Soul中Resilience4j的使用和操做流程

  • 在Resilience4JPlugin中的執行方法中能夠看到
protected Mono<Void> doExecute(final ServerWebExchange exchange, final SoulPluginChain chain, final SelectorData selector, final RuleData rule) {
        final SoulContext soulContext = exchange.getAttribute(Constants.CONTEXT);
        assert soulContext != null;
        Resilience4JHandle resilience4JHandle = GsonUtils.getGson().fromJson(rule.getHandle(), Resilience4JHandle.class);
        if (resilience4JHandle.getCircuitEnable() == 1) {
            return combined(exchange, chain, rule);
        }
        return rateLimiter(exchange, chain, rule);
    }

根據CircuitEnable屬性的值來決定只是作流控仍是同時同時作流控和斷流兩個方向。可是這個規則的配置是基於數字配置的。是否是能夠優化爲boolean類型的,這多是個能夠優化的方向
filegithub

  • 最後經過代理工廠Resilience4JRegistryFactory來執行斷流和流控的具體控制,相對來講比直接配置和代碼來控制簡單了不少

Soul中sentinel插件的使用和流程

  • 在SentinelPlugin中並無看到直接執行sentinel的內容,而是直接重載了PluginDataHandler的重載方法裏
  • 在重載方法中 FlowRuleManager.loadRules(flowRules)和DegradeRuleManager.loadRules(degradeRules)將sentinel都加載到了Sentinel中,由sentinel進行控制

三個斷路器的控制基本就是這樣, 後續對三個斷路器有了使用經驗再來具體進行對比。面試

歡迎搜索關注本人與朋友共同開發的微信面經小程序【大廠面試助手】和公衆號【微瞰技術】,以及總結的分類面試題https://github.com/zhendiao/JavaInterview編程

file
file

相關文章
相關標籤/搜索