微服務神經元(Neural)


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

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注入其它擴展點。

1.3 使用方式

第一步:定義接口

@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>
復制代碼

2 限流(Limiter)

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

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 heresemaphore.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
來源:掘金
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


轉載于:https://juejin.im/post/5cb82a1df265da035b619184

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/275329.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/275329.shtml
英文地址,請注明出處:http://en.pswp.cn/news/275329.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

flash跨域訪問解決辦法

今天一個客戶的flash程序突然無法訪問到數據&#xff0c;經過檢查發現當時做flash時&#xff0c;對訪問的數據使用了域名方式訪問&#xff0c;但是現在客戶又綁定了另一個域名&#xff0c;所以另一個域名訪問時就造成了跨域訪問&#xff0c;由于flash采用完全域匹配規則&#x…

服務器內存型號與頻率,一張圖看懂如何選擇DDR4內存的頻率和容量

Intel發布了代號為Skylake的第六代酷睿處理器&#xff0c;與此同時各大主板廠商也迅速推出基于100系列芯片組的各型號主板以迎接Skylake處理器&#xff0c;分別有Z170、H170及B150三個不同級別的芯片組。那針對著不同芯片組主板&#xff0c;如何選擇DDR4內存的頻率和容量&#…

Promise 到底是什么?看這個小故事

大家好&#xff0c;我是若川&#xff0c;點此加我微信進源碼群&#xff0c;一起學習源碼。還可以進《劍指前端offer》交流群。另外&#xff0c;可以進群免費看下周六Vue專場直播&#xff0c;有尤雨溪分享「Vue3 生態現狀以及展望」如果你還是一個 JavaScript 初學者&#xff0c…

docker 修改服務器,docker-修改容器掛載目錄的3種方法小結

本文關鍵詳細介紹了docker-修改容器初始化目錄的3種方式總結&#xff0c;具備非常好的實用價值&#xff0c;期待對大伙兒有一定的協助。一起追隨我回來瞧瞧吧方法一&#xff1a;修改配置文件(需停止docker服務)1、停止docker服務systemctl stop docker.service(重要&#xff0c…

什么是測試開發

aaa轉載于:https://www.cnblogs.com/Chamberlain/p/10730856.html

DropDownList 控件不能觸發SelectedIndexChanged 事件的另一個原因

相信DropDownList 控件不能觸發SelectedIndexChanged 事件已經不是什么新鮮事情了&#xff0c;原因也無外乎以下幾種&#xff1a; 1、DropDownList 控件的屬性 AutoPostBack"True" 沒有寫&#xff1b; 2、DropDownList 控件的數據綁定沒有放在if (!Page.IsPostBack) …

Vue 團隊公開快如閃電的全新腳手架工具,未來將替代 Vue-CLI,才300余行代碼,學它!...

1. 前言大家好&#xff0c;我是若川。歡迎關注我的公眾號若川視野源碼共讀活動ruochuan12想學源碼&#xff0c;極力推薦之前我寫的《學習源碼整體架構系列》jQuery、underscore、lodash、vuex、sentry、axios、redux、koa、vue-devtools、vuex4、koa-compose、vue-next-release…

斑馬無線打印服務器,如何設置斑馬打印機無線WiFi

安裝Zebra Setup Utilities.exe&#xff0c;打開軟件(沒有該軟件的可以向客服索要)界面如果是英文請選擇options(選項)&#xff0c;選擇應用程序語言Simplified Chinese(簡體中文)點擊確定&#xff0c;關閉軟件&#xff0c;重新打開&#xff0c;界面就會顯示中文。點擊相應的打…

Python自然語言處理學習筆記(19):3.3 使用Unicode進行文字處理

3.3 Text Processing with Unicode 使用Unicode進行文字處理 Our programs will often need to deal with different languages, and different character sets. The concept of “plain text” is a fiction&#xff08;虛構&#xff09;. If you live in the English-speakin…

小程序卡片疊層切換卡片_現在,卡片和清單在哪里?

小程序卡片疊層切換卡片重點 (Top highlight)介紹 (Intro) I was recently tasked to redesign the results of the following filters:我最近受命重新設計以下過濾器的結果&#xff1a; Filtered results for users (creatives) 用戶的篩選結果(創意) 2. Filtered results fo…

記一次Sentry部署過程

前言 Sentry 是一個開源的實時錯誤報告工具&#xff0c;支持前后端、其他后端語言以及主流框架等。既然是開源&#xff0c;那么我們可以在自己的服務器上搭建&#xff0c;本文記錄搭建的過程以及搭建過程中遇到的一些問題&#xff0c;也可以跟著這個教程來搭建一遍 部署環境 Ub…

效率神器!UI 稿智能轉換成前端代碼

做前端&#xff0c;不搬磚大家好&#xff0c;我是若川。從事前端五年之久&#xff0c;也算見證了前端數次變革&#xff0c;從到DW&#xff08;Dreamweaver&#xff09;到H5C3、從JQuery到MVC框架&#xff0c;無數前端大佬在為打造前端完整生態做出努力&#xff0c;由于他們的努…

$.when.apply_When2Meet vs.LettuceMeet:UI和美學方面的案例研究

$.when.apply并非所有計劃應用程序都是一樣創建的。 (Not all scheduling apps are created equal.) As any college student will tell you, we use When2Meet almost religiously. Between classes, extracurriculars, work, and simply living, When2Meet is the scheduling…

BZOJ4825: [Hnoi2017]單旋(Splay)

題面 傳送門 題解 調了好幾個小時……指針太難寫了…… 因為只單旋最值&#xff0c;我們以單旋\(\min\)為例&#xff0c;那么\(\min\)是沒有左子樹的&#xff0c;而它旋到根之后&#xff0c;它的深度變為\(1\)&#xff0c;它的右子樹里所有節點深度不變&#xff0c;其它所有節點…

前端不容你褻瀆

大家好&#xff0c;我是若川&#xff0c;點此加我微信進源碼群&#xff0c;一起學習源碼。同時可以進群免費看Vue專場直播&#xff0c;有尤雨溪分享「Vue3 生態現狀以及展望」背景最近我在公眾號的后臺收到一條留言&#xff1a;言語里充滿了對前端的不屑和鄙夷&#xff0c;但仔…

用jquery阻止事件起泡

jquery使用過程中阻止事件起泡實例 1、通過返回false來取消默認的行為并阻止事件起泡。jQuery 代碼:$("form").bind("submit", function() { return false; })2、通過使用 preventDefault() 方法只取消默認的行為。jQuery 代碼:$("form").bind(…

利益相關者軟件工程_如何向利益相關者解釋用戶體驗的重要性

利益相關者軟件工程With the ever increasing popularity of user experience (UX) design there is a growing need for good designers. However, there’s a problem for designers here as well. How can you show the importance of UX to your stakeholders and convince…

云棲大會上,阿里巴巴重磅發布前端知識圖譜!

大家好&#xff0c;我是若川&#xff0c;點此加我微信進源碼群&#xff0c;一起學習源碼。同時可以進群免費看Vue專場直播&#xff0c;有尤雨溪分享「Vue3 生態現狀以及展望」阿里巴巴前端知識圖譜&#xff0c;由大阿里眾多前端技術專家團歷經1年時間精心整理&#xff0c;從 初…

Linux下“/”和“~”的區別

在linux中&#xff0c;”/“代表根目錄&#xff0c;”~“是代表目錄。Linux存儲是以掛載的方式&#xff0c;相當于是樹狀的&#xff0c;源頭就是”/“&#xff0c;也就是根目錄。 而每個用戶都有”家“目錄&#xff0c;也就是用戶的個人目錄&#xff0c;比如root用戶的”家“目…

在當今移動互聯網時代_誰在提供當今最好的電子郵件體驗?

在當今移動互聯網時代Hey, a new email service from the makers of Basecamp was recently launched. The Verge calls it a “genuinely original take on messaging”, and it indeed features some refreshing ideas for the sometimes painful exercise we call inbox man…