微服務神經元(Neural)


微服務架構中的神經組織,主要爲分佈式架構提供了集羣容錯的三大利刃:限流、降級和熔斷。並同時提供了SPI、過濾器、JWT、重試機制、插件機制。此外還提供了不少小的黑科技(如:IP黑白名單、UUID增強版、Snowflake和大併發時間戳獲取等)。java

Features算法

  • 分佈式限流(Limiter
    • 致力於分佈式服務調用的流量控制,能夠在服務之間調用和服務網關中進行限流!
  • 服務降級(Degrade
    • 致力於提供分佈式的服務降級開關!
  • 個性化重試(Retryer
    • 致力於打造更加智能的重試機制,帶你見證重試AI!
  • 服務鑑權(Auth
    • 致力於保證每次分佈式調用鑑定,可在服務註冊、訂閱及調用環節進行服務鑑權!
  • 鏈路追蹤(Trace
    • 致力於爲微服務架構提供鏈路追蹤的埋點!
  • 黑科技
    • Perf:性能測試神器,能夠用於爲單個方法或代碼塊進行性能測試
    • NUUID:UUID擴展版,提供更豐富的UUID生產規則
    • Filter:基於責任鏈模式的過濾器
    • IPFilter:IP黑白名單過濾器
    • Snowflake:基於Snowflake算法的分佈式ID生成器
    • SystemClock:解決大併發場景下獲取時間戳時的性能問題

1 NPI

1.1 JDK中SPI缺陷

  • JDK標準的SPI會一次性實例化擴展點全部實現,若是有擴展實現初始化很耗時,但若是沒用上也加載,會很浪費資源
  • 不支持擴展點的IoC和AOP
  • 不支持實現排序
  • 不支持實現類分組
  • 不支持單例/多例的選擇

1.2 NPI功能特性

  • 支持自定義實現類爲單例/多例
  • 支持設置默認的實現類
  • 支持實現類order排序
  • 支持實現類定義特徵屬性category,用於區分多維度的不一樣類別
  • 支持根據category屬性值來搜索實現類
  • 支持自動掃描實現類
  • 支持手動添加實現類
  • 支持獲取全部實現類
  • 支持只建立所需實現類,解決JDK原生的全量方式
  • 支持自定義ClassLoader來加載class

TODO:須要實現對擴展點IoC和AOP的支持,一個擴展點能夠直接setter注入其它擴展點。sql

1.3 使用方式

第一步:定義接口安全

@NPI
public interface IDemo {}
複製代碼

第二步:定義接口實現類bash

@Extension("demo1")
public class Demo1Impl implements IDemo {}

@Extension("demo2")
public class Demo2Impl implements IDemo {}</pre>
複製代碼

第三步:使用接口全路徑(包名+類名)建立接口資源文件服務器

src/main/resources/META-INF/neural/io.neural.demo.IDemo架構

第四步:在接口資源文件中寫入實現類全路徑(包名+類名)併發

io.neural.demo.Demo1Impl
io.neural.demo.Demo2Impl</pre>
複製代碼

第五步:使用ExtensionLoader來獲取接口實現類運維

public class Demo{
 public static void main(String[] args){
 IDemo demo1 =ExtensionLoader.getLoader(IDemo.class).getExtension("demo1");
 IDemo demo2 =ExtensionLoader.getLoader(IDemo.class).getExtension("demo2"); 
 }
}</pre>
複製代碼

2 限流(Limiter)

在分佈式架構中,限流的場景主要分爲兩種:injvm模式和cluster模式。dom

2.1 injvm模式

2.1.1 併發量(Concurrency)

使用JDK中的信號量(Semaphore)進行控制。

public class Test{
 public static void main(String[] args){
 Semaphore semaphore = new Semaphore(10,true);
 semaphore.acquire();
 //do something here
 semaphore.release();
 }
}</pre>
複製代碼

2.1.2 速率控制(Rate)

使用Google的Guava中的限速器(RateLimiter)進行控制。

public class Test{
 public static void main(String[] args){
 RateLimiter limiter = RateLimiter.create(10.0); // 每秒不超過10個任務被提交
 limiter.acquire(); // 請求RateLimite
 }
}</pre>
複製代碼

2.2 cluster模式(待完成)

分佈式限流主要適用於保護集羣的安全或者用於嚴格控制用戶的請求量(API經濟)。

2.3 限制瞬時併發數

  • 定義:瞬時併發數,系統同時處理的請求/事務數量
  • 優勢:這個算法可以實現控制併發數的效果
  • 缺點:使用場景比較單一,通常用來對入流量進行控制

2.4 限制時間窗最大請求數

  • 定義:時間窗最大請求數,指定的時間範圍內容許的最大請求數
  • 優勢:這個算法可以知足絕大多數的流控需求,經過時間窗最大請求數能夠直接換算出最大的QPS(QPS = 請求數/時間窗)
  • 缺點:這種方式可能會出現流量不平滑的狀況,時間窗內一小段流量佔比特別大

2.5 令牌桶

算法描述

  • 假如用戶配置的平均發送速率爲r,則每隔1/r秒一個令牌被加入到桶中
  • 假設桶中最多能夠存放b個令牌。若是令牌到達時令牌桶已經滿了,那麼這個令牌會被丟棄
  • 當流量以速率v進入,從桶中以速率v取令牌,拿到令牌的流量經過,拿不到令牌流量不經過,執行熔斷邏輯

屬性

  • 長期來看,符合流量的速率是受到令牌添加速率的影響,被穩定爲:r
  • 由於令牌桶有必定的存儲量,能夠抵擋必定的流量突發狀況
    • M是以字節/秒爲單位的最大可能傳輸速率。 M>r
    • T max = b/(M-r) 承受最大傳輸速率的時間
    • B max = T max * M 承受最大傳輸速率的時間內傳輸的流量

優勢:流量比較平滑,而且能夠抵擋必定的流量突發狀況

3 熔斷(CircuitBreaker)

在分佈式架構中,熔斷的場景主要分爲兩種:injvm模式和cluster模式。

3.1事件統計熔斷器(EventCountCircuitBreaker)

在指定時間週期內根據事件發生的次數來實現精簡版熔斷器。如10秒以內觸發5次事件,則進行熔斷。

3.2 門限熔斷器(ThresholdCircuitBreaker)

TODO

4 降級(Degrade)(待完成)

服務降級是指當服務器壓力劇增時,根據當前業務狀況及流量對一些服務和頁面有策略的降級,以此緩解了服務器資源壓力,以保證核心任務的正常運行,同時也保證了部分甚至大部分客戶獲得正確響應。

4.1 管理方式

4.1.1 直接管理方式:運維人員能夠指定哪些模塊降級

當服務器檢測到壓力增大,服務器監測自動發送通知給運維人員,運維人員根據本身或相關人員判斷後經過配置平臺設置當前運行等級來降級。降級首先能夠對非核心業務進行接口降級。若是效果不顯著,開始對一些頁面進行降級,以此保證核心功能的正常運行。

4.1.2 分級管理方式:運維人員無需關心業務細節,直接按級別下降便可

業務肯定好對應業務的優先級別,指定好分級降級方案。當服務器檢測到壓力增大,服務檢測自動發送通知給運維人員。運維人員根據狀況選擇運行等級。

5 重試(Retryer)

5.1 重試策略

5.1.1 塊策略(BlockStrategy)

使當前線程使用Thread.sleep()的方式進行休眠重試。

5.1.2 中止策略(StopStrategy)

  • NeverStopStrategy:從不中止策略
  • StopAfterAttemptStrategy:嘗試後中止策略
  • StopAfterDelayStrategy:延遲後中止策略

5.1.3 等待策略(WaitStrategy)

  • FixedWaitStrategy:固定休眠時間等待策略
  • RandomWaitStrategy:隨機休眠時間等待策略,支持設置隨機休眠時間的下限值(minmum)與上限值(maxmum)
  • IncrementingWaitStrategy:定長遞增休眠時間等待策略
  • ExponentialWaitStrategy:指數函數(2^x,其中x表示嘗試次數)遞增休眠時間等待策略。支持設置休眠時間的上限值(maximumWait)
  • FibonacciWaitStrategy:斐波那契數列遞增休眠時間等待策略。支持設置休眠時間的上限值(maximumWait)
  • CompositeWaitStrategy:複合等待策略,即支持以上等待策略的組合計算休眠時間,最終休眠時間是以上策略中休眠時間之和
  • ExceptionWaitStrategy:異常等待策略

5.2 指定結果重試

retryIfResult(Predicate< V> resultPredicate):設置重試不知足條件的結果

eg:若是返回結果爲空則重試:retryIfResult(Predicates.< Boolean>isNull())

5.3 指定異常重試

  • retryIfException():重試全部異常
  • retryIfRuntimeException():重試運行時異常
  • retryIfExceptionOfType(Class<? extends Throwable> exceptionClass):重試指定類型異常
  • retryIfException(Predicate< Throwable> exceptionPredicate) :自定義過濾後的異常重試

5.4 重試監聽器(RetryListener)

withRetryListener(RetryListener listener):添加劇試監聽器

5.5 嘗試時間限制器(AttemptTimeLimiter)

withAttemptTimeLimiter(AttemptTimeLimiter< V> attemptTimeLimiter):添加嘗試時間限制器

6 JWT(JSON Web Token)

功能來源於java-jwt項目,但有必定的調整,後續會繼續簡化。

7 過濾器(Filter)

基於@NPI擴展方式和責任鏈模式實現的過濾器機制。

8 黑科技(Micro)

  • Perf:性能測試工具
  • IPFilter:IP黑白名單過濾器
  • SystemClock:解決大併發場景中獲取System.currentTimeMillis()的性能問題
  • Snowflake:基於Snowflake算法實現的高性能Long型ID生成器。理論QPS > 400w/s
  • NUUID:UUID擴展版。支持36/32/22/19位的UUID生成方式(不犧牲精度),支持犧牲必定精度後的15位超短UUID

須要更詳細思惟導圖和視頻資料的能夠加一下技術交流分享羣:「603619042」免費獲取

同時我通過多年的收藏目前也算收集到了一套完整的學習資料,包括但不限於:分佈式架構、高可擴展、高性能、高併發、Jvm性能調優、Spring,MyBatis,Nginx源碼分析,Redis,ActiveMQ、、Mycat、Netty、Kafka、Mysql、Zookeeper、Tomcat、Docker、Dubbo、Nginx等多個知識點高級進階乾貨,但願對想成爲架構師的朋友有必定的參考和幫助


做者:Java高端架構老王 連接:https://juejin.im/post/5cc84cb6518825250e146c61 來源:掘金 著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
相關文章
相關標籤/搜索