微服務架構中的神經組織,主要爲分佈式架構提供了集羣容錯的三大利刃:限流、降級和熔斷。並同時提供了SPI、過濾器、JWT、重試機制、插件機制。此外還提供了不少小的黑科技(如:IP黑白名單、UUID增強版、Snowflake和大併發時間戳獲取等)。java
Featuresgit
分佈式限流(Limiter
)web
服務降級(Degrade
)算法
個性化重試(Retryer
)json
服務鑑權(Auth
)安全
鏈路追蹤(Trace
)服務器
黑科技架構
Perf
:性能測試神器,能夠用於爲單個方法或代碼塊進行性能測試NUUID
:UUID擴展版,提供更豐富的UUID生產規則Filter
:基於責任鏈模式的過濾器IPFilter
:IP黑白名單過濾器Snowflake
:基於Snowflake算法的分佈式ID生成器SystemClock
:解決大併發場景下獲取時間戳時的性能問題TODO:須要實現對擴展點IoC和AOP的支持,一個擴展點能夠直接setter注入其它擴展點。併發
第一步:定義接口運維
@NPI public interface IDemo {}
第二步:定義接口實現類
@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>
在分佈式架構中,限流的場景主要分爲兩種:injvm模式和cluster模式。
使用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>
使用Google的Guava中的限速器(RateLimiter)進行控制。
public class Test{ public static void main(String[] args){ RateLimiter limiter = RateLimiter.create(10.0); // 每秒不超過10個任務被提交 limiter.acquire(); // 請求RateLimite } }</pre>
分佈式限流主要適用於保護集羣的安全或者用於嚴格控制用戶的請求量(API經濟)。
算法描述
屬性
由於令牌桶有必定的存儲量,能夠抵擋必定的流量突發狀況
優勢:流量比較平滑,而且能夠抵擋必定的流量突發狀況
在分佈式架構中,熔斷的場景主要分爲兩種:injvm模式和cluster模式。
在指定時間週期內根據事件發生的次數來實現精簡版熔斷器。如10秒以內觸發5次事件,則進行熔斷。
TODO
服務降級是指當服務器壓力劇增時,根據當前業務狀況及流量對一些服務和頁面有策略的降級,以此緩解了服務器資源壓力,以保證核心任務的正常運行,同時也保證了部分甚至大部分客戶獲得正確響應。
當服務器檢測到壓力增大,服務器監測自動發送通知給運維人員,運維人員根據本身或相關人員判斷後經過配置平臺設置當前運行等級來降級。降級首先能夠對非核心業務進行接口降級。若是效果不顯著,開始對一些頁面進行降級,以此保證核心功能的正常運行。
業務肯定好對應業務的優先級別,指定好分級降級方案。當服務器檢測到壓力增大,服務檢測自動發送通知給運維人員。運維人員根據狀況選擇運行等級。
使當前線程使用Thread.sleep()的方式進行休眠重試。
retryIfResult(Predicate< V> resultPredicate):設置重試不知足條件的結果
eg:若是返回結果爲空則重試:retryIfResult(Predicates.< Boolean>isNull())
withRetryListener(RetryListener listener):添加劇試監聽器
withAttemptTimeLimiter(AttemptTimeLimiter< V> attemptTimeLimiter):添加嘗試時間限制器
功能來源於java-jwt項目,但有必定的調整,後續會繼續簡化。
基於@NPI擴展方式和責任鏈模式實現的過濾器機制。