當前位置:首頁 » 操作系統 » 細粒度源碼

細粒度源碼

發布時間: 2023-09-21 09:36:38

⑴ 什麼代碼編輯器比較好用

著名的代碼編輯器:Microsoft Visual Studio Code、Github Atom、Sublime text、Adobe Brackets

最推薦的一種:Atom

推薦理由:

鏈接:如何評價 GitHub 發布的文本編輯器 Atom?

作者:韋易笑

用過不少編輯器:UltraEdit / EditPlus / (G) Vim / GEdit / NotePad++ / TextMate / ProgrammerPad / Sublime 。確實是工作上用他們寫過代碼的。而 VSC / Emacs 只是體驗了一下基本使用方法,算不上真用。用下來的結論是:Atom 比 Vim 更 Vim,比 Emacs 更 Emacs,同樣,比 Sublime 更 Sublime。


Atom 唯一的槽點就是「卡」,不過那是去年的情況了,1.0後性能數次大提升,比起sublime/vsc之類雖不算流暢,但同時編輯20個數千行的文件沒有壓力。如今讓人感覺慢的地方主要是啟動loading(也大大短於eclipse, idea),使用時並沒察覺它比其他編輯器慢再哪。而文本編輯器的快慢,更重要的是「讓你工作更快更有效率」。下面說說為何 Atom比其他更有效率:


兼容VIM模式


這無疑團結了一大班 Vim過來的用戶,Sublime雖然也有VIM模式,但是Sublime在 mac下面的vim模式有bug,我習慣用 hjkl來移動游標,sublime再mac下hjkl移動有問題,且我習慣CTRL_[來返回NORMAL,手指不離開主鍵盤區,而sublime的vim模式只支持ESC返回,加上其作者經常神秘消失,最穩定的2.x版本已三年沒有更新,這些問題一直得不到修正。


由於Atom的定製程度直追 Vim/Emacs,它的vim模式能夠使用插件來實現,而不像sublime必須builtin,Atom的VIM模式除了官方實現外還有很多用戶實現,各有所長,你不喜歡可以換,Sublime就傻逼了,覺得builtin的不行,你就沒辦法了,而且作者不更新你也沒辦法。


Atom里的Vim模式並不是強制的,你可以用也可以不用,這樣入門用戶也不會覺得困難,但是如果你用慣Vim的話,使用Vim模式可以取得更好的效率,我覺得Vim/Atom-VimMode能夠提升效率的地方有以下三方面:


1. 手指不離開主鍵盤區:

所有功能皆能在主鍵盤區完成,不用去按方向鍵,不用把手挪去按Home/End,更不用動滑鼠。就像詠春中強調中線理論,認為一切動作圍繞中軸線開展,守護自己中軸線的同時攻擊別人的中軸線。Vim/Atom-VimMode中,雙手不但從不離開主鍵盤,並且八根手指隨時守護再HOME位(ASDF, JKL;)有動作就移動,然後馬上歸位。


2. 細粒度微操作:

星際/dota玩的好,微操基本功,微操又快又精確,Vim/Atom-VimMode一樣,比如:

if (xxxx) {}

很多人編碼時習慣「成對編碼」,寫了申請資源的代碼,先把釋放資源寫了,寫了左括弧,先把右括弧給補充完,當你寫完第二行代碼時,需要用到「再1-2行中間插入一行」,此時你的游標停留在第二行,傳統編輯器你需要:按上箭頭移動游標到第一行 -> 按END鍵去到第一行末尾 -> 按回車插入一行,mac下的END鍵還需要用CMD+右來組合出來,而Vim/Atom-VimMode中,你只需要shift+o即可,手指完全不離開主鍵盤區,不用像傳統編輯器那樣,右手先移動到箭頭區又移動到HOME的小鍵盤區,再移動回主鍵盤區這么麻煩,類似還有:

使用o直接再下一行插入,避免 END/回車

使用I再行首插入,避免移動半天游標。

向前/後移動一個單詞到單詞頭、尾。

快速更改當前單詞,用/來快速搜索移動游標。

dd+p來快速移動代碼塊,取代shift+方向鍵半天。

shift-j 來兩行合並成一行,代替 HOME, back 若干次。

。。。

你再編輯代碼的時候,90%的情況可以直接一步完成,這就叫細粒度微操,而且整個過程手都不需要離開主鍵盤,不像傳統編輯器那樣,若干笨重的操作組合再一起,操作不夠細步驟多的同時手還要再:主鍵盤區,方向鍵區,擴展鍵區 來回移動,效率奇低。而Vim/Atom-VimMode下,手指隨時守護在home區(ASDF JKL;),所有微操都是圍繞HOME區進行,不會移動到任何主鍵盤以外的區域,更別說用滑鼠、觸摸板。


3. 批量操作:

比如要給下面代碼每行後面加一個分號:

var x = 1var y = 2var z = 3console.log('result is ' + (x + y + z).toString())

一般做法是:移動游標到行末->END->分號->移動游標到下一行,Vim裡面不需要移動游標到行末,只需循環敲入:「A;<ESC>j」 即可,本來操作就少很多。這還不是最少操作,更少操作是利用Vim裡面的句號「.」功能重復上一次操作,即第一行「A;」補充了一個分號後,第二行只需要按一下"."即可重復,於是最後操作變為:

第一行:A;<ESC>

後面所有行:J.


超級爽快的操作,這樣的操作還很多,你還可以單條命令對一萬行代碼重復上述步驟,或者把c代碼拷貝到go裡面先一句話把所有分號給刪除了。Vim下面的名言:絕不重復。


總之如果你熟悉 VIM模式,用 Atom能感到完全自由的方式,隨心所欲的書寫代碼,而不是被書寫這件事情費腦筋,解放大腦完全用於思考而不用於打字。但是同時對不習慣VIM的人照樣友好,或者對想使用VIM的便利卻又痛恨VIM這個軟體的簡陋的人帶來了福音。


脊椎記憶


「同樣動作重復300次,肌肉就會有記憶,而一個動作重復600次,脊椎就會有記憶」
-- 李小龍


編輯器就是關於脊柱記憶的東西,所以多投入一些時間去了解你使用的編輯器,掌握他們的各種快捷操作和高級功能是一個能讓你事半功倍的好主意。


格鬥游戲玩的好的人有很多,下等高手靠熟練,中等高手靠反應,上等高手靠意識。更熟練的掌握你的編輯器,讓更多日常工作固化成記憶記錄再你的脊椎上,使用的時候,脊椎這枚協處理器就能完成代碼編寫,一個操作,剛一想到,脊椎就自動執行出來了,小腦騰出空間來組織判斷,大腦騰出空間來思考更重要的東西,就像你走路,你不用思考邁腿那麼自然,別人一拳過來,你潛意識一動,一連串動作就出去了,一隻飛蛾飛過來,你潛意識的閉上眼睛保護眼部,這就是脊椎記憶,如果還要經過大腦繞一圈,反應慢不說,大腦這顆cpu都用在這些瑣事上了,思考的時間自然少了不少。


所以從內到外的了解你的編輯器,並且熟練掌握他們,是對你提高工作效率的最佳投資,Atom的全平台支持,開放源代碼,深度可定製等三個特點,比起其他閉源的,平台支持不全的,擴展少的編輯器來說能讓你有不同層面的了解機會,同時為你提供足夠的空間。


深度可定製系統


Vim/Emacs的精髓在於:「可以調教」,本來不順手的東西,只要容易調教,假以時日,都會慢慢變得越來越順手,越來越「懂你」,越來越「貼心」,以至於後面大家都離不開它了。而 Atom 也同樣是一款容易被你調教的編輯器。先前給vim寫過插件,給sublime寫過插件,如今給Atom寫過插件,橫向對比下來,幾個結論:


插件能做事情多少:Atom > Vim >> sublime

插件開發學習門檻:Vim > Atom > sublime

插件開發文檔豐富:Atom > sublime >> Vim


Atom 的定製化程度遠遠高過sublime之類(不用實際看法,看看雙方開發文檔即可),直追 Vim / Emacs,sublime的大部分定製無外乎改改json,插件能做的事情相當有限。


Atom 的定製化系統主要有三方面:


1. 細致:

設計之初就考慮的事情,方方面面都能定製,見官方文檔,以及插件:vim-mode,minimap (稍微了解下這兩個類似的功能再 Atom 和 sublime的實現就能知道 sublime被甩了多少條街了)。可以細粒度的控制編輯器內所有行為,小到移動一下游標,刪除當前一個字元,大到打開一個面板,比如 「core:more-up」 可以向上移動一行游標,「window:focus-pane-on-left」 可以把焦點設置到左邊的面板,atom內核和大量第一方第三方packages 都是以命令的方式把基礎功能提供出來,你可以隨意互相調用或者設置熱鍵。

除去命令外的API層面,幾乎每個部件每個像素點都可控,比如這樣的插件你永遠無法再 Vim / Emacs / Sublime 下面見得到:activate-power-mode。


2. 直觀:

由於使用 javascript/coffee進行開發,但 javascript/coffee是屬於即便你沒寫過他們,讀都能讀得懂,VimScript就不一樣了,雖然也能做相同的事情,但實話實說,晦澀難寫,比如我要取得當前文件的路徑和文件名,在 VimScript裡面需要這么寫:

let l:path = expand('%:p:h')let l:name = expand('%:t:r') 或者 let l:name = expand('%<')

而在 Atom 里我們用atom自己的功能直接取出路徑來,然後進行切割:

var fullpath =atom.workspace.getActiveTextEditor().getPath();var filename = path.basename(fullpath);var filepath = path.dirname(fullpath);

就問大家一下?哪段代碼更友好直觀?你一眼就知道在做什麼?你更願意用按照哪段代碼進行插件開發?是上面的VimScript?還是下面的 javascript ?


結論是很清晰的,Atom的 javascript開發插件更簡單直觀,即便沒文檔,看別人怎麼寫的自己也會了,同時靈活性大大高於VmScript,各種事件處理回調,javascript天生擅長做這些事情,還有第二行,第三行,我們用到了 node.js 的 path模塊,進行文件路徑切割。這樣的寫法,再VimScript 裡面基本是無法想像的。


Vim是強大,但是畢竟是30年前的東西了,即便最熟練的 Vimer 也都承認 VimScript 的晦澀難懂,阻礙了很多人為其開發插件。而給Atom開發插件,只需要掌握javascript,掌握 javascript的人很多,學習了javascript你也可以用在很多地方。不像VimScript那樣只能用在Vim裡面,而正因為其晦澀,Vim新版本開始支持內嵌 python的寫法:

python << EOF
import random
print random.randint(0,10)EOF


VimScript中 Python等動態的支持正是說明其開發維護者也承認 VimScript本身的古老,對比現代編程語言已經有些格格不入了,缺乏強大的描述能力,難以構建復雜的功能模塊,才會去支持Python內嵌這樣的寫法。可大量的工作還是需要再Python之外完成,同時,並非所有平台自帶的Vim都支持python,除了mac外,所有debian / ubuntu 發行版自帶的Vim都不支持 Python。導致你想寫一個通用的擴展還得判斷下是否 has('python') 沒有的話老老實實用 VimScript 去實現它,這不是折磨人么?


Sublime裡面可以用原生 Python 寫擴展,比 VimScript爽,但是 sublime 的插件能做的事情還不及VimScript的一半,所以怎麼能指望他們能寫出高端的功能來呢?


3. 強大:

Atom的內核 Electron (原來的 Atom-shell)可以理解成:Chromium + Node.JS,而整個Atom的界面,你可以理解成就是一顆 HTML 的 DOM 樹結構,這意味著你可以這樣:

var div = document.createElement("div"); div.innerText = "abc"; atom.workspace.addBottomPanel(div);

就可以簡單的在 atom 裡面增加一個顯示對象,這意味著再給div加個 html的 onclick就可以實現GUI交互,界面上的對象隨便寫點html代碼就可以控制效果,意味著你可以使用 jQuery 來為atom增加新面板,意味著你只需要寫一個簡單的 .css 文件就可以把 Atom 整個編輯器的外觀給修改了。這在 Vim/Emacs 中是幾乎不可想像的事情,sublime基本就別提了。


大量的前端開發技術和 Node.JS 基礎模塊供你任意使用,正是由於近年 Chromium / node.js 系列技術的成熟,和 Atom / Visual Studio Code 這類基於前端技術的客戶端軟體的成功,讓我看到了客戶端(桌面+移動)軟體開發的新方向。


做VIM/Emacs不能做的事情


Vim/Emacs過去給人的映像是:幾乎能做任何事情,確實如此,但畢竟是二三十年前的東西了,而他們一直堅挺到現在一方面是操作便利,更重要的是這么長時間還沒有出現一款又開源又具備同樣操作便利性和可擴展性的編輯器,所以Vimer, Emacser 們最樂意展示給別人看的就是他們又安裝了什麼插件,急於展示可以把 Vim / Emacs 裝扮成了一個多像 IDE 的東西,而今天這個「可以做任何事情」的高度可定製特性已經被Atom所吸收並完全超越,就像 Atom 的開發blog:「 Introcing Atom」 上說的一樣,對易用性和可展性 「決不妥協」 :

We think we can do better. Our goal is a zero-compromise combination of hackability and usability: an editor that will be welcoming to an elementary school student on their first day learning to code, but also a tool they won't outgrow as they develop into seasoned hackers.


拋開易用性的這個 Atom 的明顯優勢不說,前面其實已說了不少 Atom 比 Vim/Emacs 更靈活強大的地方,可能有些人還有疑惑,不是說 Emacs 「沒有不能做的事情」 么?你看 Atom的面板裡面可以嵌入一個 Terminal,Vim/Emacs一樣可以嵌入啊,為何還說 Atom 比它強啊?


沒錯,Vim用久了會產生心理舒適區,多模式編輯使人神清氣爽,命令化文本處理讓你賞心悅目,但是受限於本身機制用久了會容易痛苦掙扎:雖然vim的各種擴展似乎什麼事情都能做,但每個擴展卻只能做到70分,總有那麼30%的地方做不到位。所以用的時間長了,上半身爽的要死,下半身痛不欲生。。。。


Vim/Emacs即便大部分擴展功能也都可以稱為「能用」,可幾十年的歷史包袱太沉,很多事情對他們來講就是禁區,比如詭異的標簽功能,容易誤操作的buffer/窗口切換,缺乏非同步機制,編譯時間長只有傻等著,無法跟Atom一樣邊讀代碼,邊運行程序看結果,對照輸出結果和源代碼找問題,連實現個內嵌終端都用了若干年,還實現的那麼別扭。。。。。。。。。


這類硬傷有許多,再舉個最簡單的例子,minimap,就是 sublime那種大家喜歡的文檔縮略圖,這個現代編輯器必備的功能,誰能用 Vim/Emacs 實現一下看看?Atom 可以衍生出 Visual Studio Code 這樣漂亮的編輯器,Vim/Emacs能衍生么?Atom可以隨便用各種先進的前端技術,不當可以嵌 Terminal我甚至可以再 Atom 嵌入一個 js版本的 DOSBOX 玩老游戲《命令與征服》:

https://archive.org/details/softwarelibrary_msdos_games

Play DOS games online


當然這樣並沒有任何卯用,但是如果在 Atom裡面內嵌一個瀏覽器,方便的實時預覽html/css的效果呢?或者 Atom 裡面內嵌一個 Markdown Previewer ,實時查看 Markdown 的效果呢?請問 Vim/Emacs 里怎麼實現法?


Atom插件演示:markdown實時預覽,左邊寫右邊即時更新,100%兼容github的markdown語法


短短兩年的時間,這么多優秀的插件,只想說,如今 Atom 作為 Vim/Emacs 的繼承者和超越者出現了,所以社區對 Atom 的反應也是熱烈的,看看下面一組數據,截止今天(2016年3月15日),Atom共有擴展插件 3500+ 個,發布不到兩年的時間,這是什麼概念呢?

  • Sublime的插件(Stats - Package Control)大概 3500+個,但是sublime發布了5年的時間。

  • Emacs 的插件大概有2900個,可Emacs發布到今天已經過去 25+年的時間。

  • Vim 的各種插件雖然有9000個,但是Vi/Vim系列的歷史長達 30+年,是atom的15倍。

  • 這就叫社區的活躍度的區別,為什麼短短兩年那麼多開發者先後給atom貢獻了各種高質量的擴展,為什麼大家對atom的熱情那麼高?為何好多人接觸了atom一段時間後都深深的愛上了它?這是有原因的。

    再談性能優化

    很多人錯誤的覺得 Atom慢是因為使用了 JavaScript/Coffee 等 Web 技術,所以先天慢,其實這是個誤區,即便使用 Web 技術它也還能快很多,同時再慢可以往C++層的 Electron 挪啊,這也是這幾個版本優化的一些方向,基於 Atom 開發的 Visual Studio Code 可以那麼流暢, Atom 性能優化空間還很大,了不起多參考下自己的兒子,同樣開源的 vscode怎麼做的。

    同時 Atom編輯器1.0版本以來性能得到了很大的提升,主要是兩個方面,一方面是js層的各種渲染優化,控制項優化,延遲繪制,延遲載入,只繪制當前需要的東西等,另外一方面是將一些核心數據結構移動到 Electron 的 C++層,如今1.54版本性能較去年版本已經有了本質區別,運行時載入是慢些(但也比eclipse快很多),實際使用並沒覺得不如別的編輯器,況且,js層的優化和C層的優化未來還有很大的空間可以進步。

    不過我不太喜歡 vscode 使用 Typed Script 進行開發,用點標准技術不行么,Atom使用 JavaScript/Coffee 寫的多爽,如今 Atom 正在准備慢慢的切換到 JavaScript 的新標准 ES6 上。其次 vscode 快是快在「做的事情少」,主要是可擴展性方面的努力遠不及 Atom,插件機制相對弱智,所以 vscode 的社區如今還不是特別活躍,擴展也少,發布一年多隻有差不多300+個擴展,遠不如 Atom 的情況,如果 vscode 還是按照現有結構開發下去,可能永遠不會擁有 Atom的靈活度,這樣再未來就無法擁有各種豐富多彩的插件。

    再說開源免費

    UltraEdit 單用戶版本價格: 79 美刀

    UltraEdit 伺服器版價格: 229 美刀(多人登錄同一台伺服器的桌面使用),企業版更貴

    EditPlus 單用戶版價格: 35 美刀,而且還只有windows版本,

    Sublime 單用戶版價格:70 美刀

    TextMate 單用戶版價格:48 歐元,而且還只有mac版本。

    這些都是錢啊,可能你會說可以免費試用或者破解啊,是的個人可以,但正常來說sublime這些試用指不能拿來搞生產不能拿來工作的,個人你用用可以,但國外人家守規矩,不會亂用,這意味著失去一大批為其開發擴展的國外開發者,同時站在公司考慮IT方案的角度,免費試用和破解將來都是潛在的麻煩,現在上百人的公司微軟都會來收windows的錢了,版權問題越來越嚴肅,你得把這筆潛在費用考慮進去,同時這些閉源的或者單平台的東西,並不值得再上面花費過多精力和投資。

    拋開擴展性問題和價格問題,我們再來看各個熱門的免費編輯器的試用情況:

    Notepad++:免費,開源,只能運行於windows

    PSPad:免費,不開源,只能運行再 Windows

    Gedit:免費,開源,只能跑再 GNome下,Ubuntu用用,Windows/mac版本簡直是殘缺的。

    Programmer's Notepad : 免費開源,只能跑 Windows

    Notepad2:免費bu不開源,只能跑 Windows

    更關鍵的是:閉源的東西個人作者可能失去興趣不再更新,商業公司的話,你需要一個功能,就只能無限期的等待他們發慈悲加入進去。而免費開源的很多其他編輯器除去平台兼容性問題外,更重要的時擴展性差。

    而同時滿足:免費+開放+強擴展性的編輯器如今就只出現過三個:Vim / Emacs / Atom。他們是真正屬於使用者的編輯器,他們能變成使用者希望變成的樣子。這些曾經出現過得收費的或者免費的編輯器,憑借著一兩個自身獨有的 「賣點」,再某些時間段內都曾經流行過,可就像流星一樣一閃而過,如今他們都統統完成了自己的歷史使命,新的一頁可以翻開了。終端環境的話確實 Vim / Emacs 繼續下去,但桌面環境的話,Atom將會繼續向前,走出新的一步。

⑵ 分布式存儲有哪些

問題一:當前主流分布式文件系統有哪些?各有什麼優缺點 目前幾個主流的分布式文件系統除GPFS外,還有PVFS、Lustre、PanFS、GoogleFS等。
1.PVFS(Parallel Virtual File System)項目是Clemson大學為了運行linux集群而創建的一個開源項目,目前PVFS還存在以下不足:
1)單一管理節點:只有一個管理節點來管理元數據,當集群系統達到一定的規模之後,管理節點將可能出現過度繁忙的情況,這時管理節點將成為系統瓶頸;
2)對數據的存儲缺乏容錯機制:當某一I/O節點無法工作時,數據將出現不可用的情況;
3)靜態配置:對PVFS的配置只能在啟動前進行,一旦系統運行則不可再更改原先的配置。
2.Lustre文件系統是一個基於對象存儲的分布式文件系統,此項目於1999年在Carnegie Mellon University啟動,Lustre也是一個開源項目。它只有兩個元數據管理節點,同PVFS類似,當系統達到一定的規模之後,管理節點會成為Lustre系統中的瓶頸。
3.PanFS(Panasas File System)是Panasas公司用於管理自己的集群存儲系統的分布式文件系統。
4.GoogleFS(Google File System)是Google公司為了滿足公司內部的數據處理需要而設計的一套分布式文件系統。
5.相對其它的文件系統,GPFS的主要優點有以下三點:
1)使用分布式鎖管理和大數據塊策略支持更大規模的集群系統,文件系統的令牌管理器為塊、inode、屬性和目錄項建立細粒度的鎖,第一個獲得鎖的客戶將負責維護相應共享對象的一致性管理,這減少了元數據伺服器的負擔;
2)擁有多個元數據伺服器,元數據也是分布式,使得元數據的管理不再是系統瓶頸;
3)令牌管理以位元組作為鎖的最小單位,也就是說除非兩個請求訪問的是同一文件的同一位元組數據,對於數據的訪問請求永遠不會沖突.

問題二:分布式存儲是什麼?選擇什麼樣的分布式存儲更好? 分布式存儲系統,是將數據分散存儲在多 *** 立的設備上。傳統的網路存儲系統採用集中的存儲伺服器存放所有數據,存儲伺服器成為系統性能的瓶頸,也是可靠性和安全性的焦點,不能滿足大規模存儲應用的需要。分布式網路存儲系統採用可擴展的系統結構,利用多台存儲伺服器分擔存儲負荷,利用位置伺服器定位存儲信息,它不但提高了系統的可靠性、可用性和存取效率,還易於擴展。
聯想超融合ThinkCloud AIO超融合雲一體機是聯想針對企業級用戶推出的核心產品。ThinkCloud AIO超融合雲一體機實現了對雲管理平台、計算、網路和存儲系統的無縫集成,構建了雲計算基礎設施即服務的一站式解決方案,為用戶提供了一個高度簡化的一站式基礎設施雲平台。這不僅使得業務部署上線從周縮短到天,而且與企業應用軟體、中間件及資料庫軟體完全解耦,能夠有效提升企業IT基礎設施運維管理的效率和關鍵應用的性能

問題三:什麼是分布式存儲系統? 就是將數據分散存儲在多 *** 立的設備上

問題四:什麼是分布式數據存儲 定義:
分布式資料庫是指利用高速計算機網路將物理上分散的多個數據存儲單元連接起來組成一個邏輯上統一的資料庫。分布式資料庫的基本思想是將原來集中式資料庫中的數據分散存儲到多個通過網路連接的數據存儲節點上,以獲取更大的存儲容量和更高的並發訪問量。近年來,隨著數據量的高速增長,分布式資料庫技術也得到了快速的發展,傳統的關系型資料庫開始從集中式模型向分布式架構發展,基於關系型的分布式資料庫在保留了傳統資料庫的數據模型和基本特徵下,從集中式存儲走向分布式存儲,從集中式計算走向分布式計算。
特點:
1.高可擴展性:分布式資料庫必須具有高可擴展性,能夠動態地增添存儲節點以實現存儲容量的線性擴展。
2 高並發性:分布式資料庫必須及時響應大規模用戶的讀/寫請求,能對海量數據進行隨機讀/寫。
3. 高可用性:分布式資料庫必須提供容錯機制,能夠實現對數據的冗餘備份,保證數據和服務的高度可靠性。

問題五:分布式文件系統有哪些主要的類別? 分布式存儲在大數據、雲計算、虛擬化場景都有勇武之地,在大部分場景還至關重要。munity.emc/message/655951 下面簡要介紹*nix平台下分布式文件系統的發展歷史:
1、單機文件系統
用於操作系統和應用程序的本地存儲。
2、網路文件系統(簡稱:NAS)
基於現有乙太網架構,實現不同伺服器之間傳統文件系統數據共享。
3、集群文件系統
在共享存儲基礎上,通過集群鎖,實現不同伺服器能夠共用一個傳統文件系統。

4、分布式文件系統
在傳統文件系統上,通過額外模塊實現數據跨伺服器分布,並且自身集成raid保護功能,可以保證多台伺服器同時訪問、修改同一個文件系統。性能優越,擴展性很好,成本低廉。

問題六:分布式文件系統和分布式資料庫有什麼不同 分布式文件系統(dfs)和分布式資料庫都支持存入,取出和刪除。但是分布式文件系統比較暴力,可以當做key/value的存取。分布式資料庫涉及精煉的數據,傳統的分布式關系型資料庫會定義數據元組的schema,存入取出刪除的粒度較小。
分布式文件系統現在比較出名的有GFS(未開源),HDFS(Hadoop distributed file system)。分布式資料庫現在出名的有Hbase,oceanbase。其中Hbase是基於HDFS,而oceanbase是自己內部實現的分布式文件系統,在此也可以說分布式資料庫以分布式文件系統做基礎存儲。

問題七:分布式存儲有哪些 華為的fusionstorage屬於分布式 您好,很高興能幫助您,首先,FusionDrive其實是一塊1TB或3TB機械硬碟跟一塊128GB三星830固態硬碟的組合。我們都知道,很多超極本同樣採用了混合型硬碟,但是固態硬碟部分的容量大都只有8GB到32GB之間,這個區間無法作為系統盤來使用,只能作

問題八:linux下常用的分布式文件系統有哪些 這他媽不是騰訊今年的筆試題么
NFS(tldp/HOWTO/NFS-HOWTO/index)
網路文件系統是FreeBSD支持的文件系統中的一種,也被稱為NFS。
NFS允許一個系統在網路上與它人共享目錄和文件。通過使用NFS, 用戶和程序可以象訪問本地文件一樣訪問遠端系統上的文件。它的好處是:
1、本地工作站使用更少的磁碟空間,因為通常的數據可以存放在一台機器上而且可以通過網路訪問到。
2、用戶不必在每個網路上機器裡面都有一個home目錄。home目錄可以被放在NFS伺服器上並且在網路上處處可用。
3、諸如軟碟機、CDROM、和ZIP之類的存儲設備可以在網路上面被別的機器使用。可以減少整個網路上的可移動介質設備的數量。
開發語言c/c++,可跨平台運行。
OpenAFS(openafs)
OpenAFS是一套開放源代碼的分布式文件系統,允許系統之間通過區域網和廣域網來分享檔案和資源。OpenAFS是圍繞一組叫做cell的文件伺服器組織的,每個伺服器的標識通常是隱藏在文件系統中,從AFS客戶機登陸的用戶將分辨不出他們在那個伺服器上運行,因為從用戶的角度上看,他們想在有識別的Unix文件系統語義的單個系統上運行。
文件系統內容通常都是跨cell復制,一便一個硬碟的失效不會損害OpenAFS客戶機上的運行。OpenAFS需要高達1GB的大容量客戶機緩存,以允許訪問經常使用的文件。它是一個十分安全的基於kerbero的系統,它使用訪問控制列表(ACL)以便可以進行細粒度的訪問,這不是基於通常的Linux和Unix安全模型。開發協議IBM Public,運行在linux下。
MooseFs(derf.homelinux)
Moose File System是一個具備容錯功能的網路分布式文件統,它將數據分布在網路中的不同伺服器上,MooseFs通過FUSE使之看起來就 是一個Unix的文件系統。但有一點問題,它還是不能解決單點故障的問題。開發語言perl,可跨平台操作。
pNFS(pnfs)
網路文件系統(Network FileSystem,NFS)是大多數區域網(LAN)的重要的組成部分。但NFS不適用於高性能計算中苛刻的輸入書櫥密集型程序,至少以前是這樣。NFS標準的罪行修改納入了Parallel NFS(pNFS),它是文件共享的並行實現,將傳輸速率提高了幾個數量級。
開發語言c/c++,運行在linu下。
googleFs
據說是一個比較不錯的一個可擴展分布式文件系統,用於大型的,分布式的,對大量數據進行訪問的應用。它運行於廉價的普通硬體上,但可以提供容錯功能,它可以給大量的用戶提供性能較高的服務。google自己開發的。

問題九:分布式存儲都有哪些,並闡述其基本實現原理 神州雲科 DCN NCS DFS2000(簡稱DFS2000)系列是面向大數據的存儲系統,採用分布式架構,真正的分布式、全對稱群集體系結構,將模塊化存儲節點與數據和存儲管理軟體相結合,跨節點的客戶端連接負載均衡,自動平衡容量和性能,優化集群資源,3-144節點無縫擴展,容量、性能歲節點增加而線性增長,在 60 秒鍾內添加一個節點以擴展性能和容量。

問題十:linux 分布式系統都有哪些? 常見的分布式文件系統有,GFS、HDFS、Lustre 、Ceph 、GridFS 、mogileFS、TFS、FastDFS等。各自適用於不同的領域。它們都不是系統級的分布式文件系統,而是應用級的分布式文件存儲服務。
GFS(Google File System)
--------------------------------------
Google公司為了滿足本公司需求而開發的基於Linux的專有分布式文件系統。。盡管Google公布了該系統的一些技術細節,但Google並沒有將該系統的軟體部分作為開源軟體發布。
下面分布式文件系統都是類 GFS的產品。
HDFS
--------------------------------------
Hadoop 實現了一個分布式文件系統(Hadoop Distributed File System),簡稱HDFS。 Hadoop是Apache Lucene創始人Doug Cutting開發的使用廣泛的文本搜索庫。它起源於Apache Nutch,後者是一個開源的網路搜索引擎,本身也是Luene項目的一部分。Aapche Hadoop架構是MapRece演算法的一種開源應用,是Google開創其帝國的重要基石。
Ceph
---------------------------------------
是加州大學聖克魯茲分校的Sage weil攻讀博士時開發的分布式文件系統。並使用Ceph完成了他的論文。
說 ceph 性能最高,C++編寫的代碼,支持Fuse,並且沒有單點故障依賴, 於是下載安裝, 由於 ceph 使用 btrfs 文件系統, 而btrfs 文件系統需要 Linux 2.6.34 以上的內核才支持。
可是ceph太不成熟了,它基於的btrfs本身就不成熟,它的官方網站上也明確指出不要把ceph用在生產環境中。
Lustre
---------------------------------------
Lustre是一個大規模的、安全可靠的,具備高可用性的集群文件系統,它是由SUN公司開發和維護的。
該項目主要的目的就是開發下一代的集群文件系統,可以支持超過10000個節點,數以PB的數據量存儲系統。
目前Lustre已經運用在一些領域,例如HP SFS產品等。

⑶ 基於Spring+SpringMVC+Mybatis分布式敏捷開發系統架構(附源碼

前言

zheng項目不僅僅是一個開發架構,而是努力打造一套從 前端模板 - 基礎框架 - 分布式架構 - 開源項目 - 持續集成 - 自動化部署 - 系統監測 - 無縫升級 的全方位J2EE企業級開發解決方案。

項目介紹

基於Spring+SpringMVC+Mybatis分布式敏捷開發系統架構,提供整套公共微服務服務模塊:內容管理、支付中心、用戶管理(包括第三方)、微信平台、存儲系統、配置中心、日誌分析、任務和通知等,支持服務治理、監控和追蹤,努力為中小型企業打造全方位J2EE企業級開發解決方案。

技術

名稱

官網

技術

名稱

官網

架構圖

模塊依賴

Spring+SpringMVC+Mybatis框架集成公共模塊,包括公共配置、MybatisGenerator擴展插件、通用BaseService、工具類等。

基於bootstrap實現的響應式Material Design風格的通用後台管理系統,zheng項目所有後台系統都是使用該模塊界面作為前端展示。

各個子系統前台thymeleaf模板,前端資源模塊,使用nginx代理,實現動靜分離。

本系統是基於RBAC授權和基於用戶授權的細粒度許可權控制通用平台,並提供單點登錄、會話管理和日誌管理。接入的系統可自由定義組織、角色、許可權、資源等。用戶許可權=所擁有角色許可權合集+用戶加許可權-用戶減許可權,優先順序:用戶減許可權>用戶加許可權>角色許可權

文件存儲系統,提供四種方案:

阿里雲OSS

服務網關,對外暴露統一規范的介面和包裝響應結果,包括各個子系統的交互介面、對外開放介面、開發加密介面、介面文檔等服務,可在該模塊支持驗簽、鑒權、路由、限流、監控、容錯、日誌等功能。示例圖:

API網關

內容管理系統:支持多標簽、多類目、強大評論的內容管理,有基本單頁展示,菜單管理,系統設置等功能。

統一掃碼支付

通用用戶管理系統, 實現最常用的用戶注冊、登錄、資料管理、個人中心、第三方登錄等基本需求,支持擴展二次開發。

微信公眾號管理平台,除實現官網後台自動回復、菜單管理、素材管理、用戶管理、消息群發等基礎功能外,還有二維碼推廣、營銷活動、微網站、會員卡、優惠券等。

微信小程序後台

基於Netty實現SocketIO的實時推送系統。支持命名空間、二進制數據、SSL、ACK等功能。

環境搭建

開發指南

maven編譯安裝zheng/pom.xml文件即可

啟動演示

約定優於配置(convention over configuration),此框架約定了很多編程規范,下面一一列舉:






資料庫模型

拓撲圖

⑷ ribbon負載均衡詳解

服務端負載均衡:在客戶端和服務端中間使用代理,lvs  和 nginx。

硬體負載均衡的設備或是軟體負載均衡的軟體模塊都會維護一個下掛可用的服務端清單,通過心跳檢測來剔除故障的服務端節點以保證清單中都是可以正常訪問的服務端節點。當客戶端發送請求到負載均衡設備的時候,該設備按某種演算法(比如線性輪詢、按權重負載、按流量負載等)從維護的可用服務端清單中取出一台服務端端地址,然後進行轉發。

客戶端負載均衡:根據自己的情況做負載。Ribbon。

客戶端負載均衡和服務端負載均衡最大的區別在於 服務端地址列表的存儲位置,以及負載演算法在哪裡。

2、Spring Cloud的負載均衡機制的實現

Spring Cloud Ribbon是一個基於HTTP和TCP的客戶端負載均衡工具,它基於Netflix Ribbon實現。通過Spring Cloud的封裝,可以讓我們輕松地將面向服務的REST模版請求自動轉換成客戶端負載均衡的服務調用。Ribbon實現客戶端的負載均衡,負載均衡器提供很多對http和tcp的行為控制。Spring cloud Feign已經集成Ribbon,所以註解@FeignClient的類,默認實現了ribbon的功能。

Ribbon主要包括如下功能

1.支持通過DNS和IP和服務端通信

2.可以根據演算法從多個服務中選取一個服務進行訪問

3.通過將客戶端和伺服器分成幾個區域(zone)來建立客戶端和伺服器之間的關系。客戶端盡量訪問和自己在相同區域(zone)的服務,減少服務的延遲

4.保留伺服器的統計信息,ribbon可以實現用於避免高延遲或頻繁訪問故障的伺服器

5.保留區域(zone)的統計數據,ribbon可以實現避免可能訪問失效的區域(zone)

Ribbon負載均衡主要是通過LoadBalancerClient類實現的,而LoadBalancerClient又將具體處理委託給ILoadBalancer處理;

每個服務都有一個ILoadBalancer,ILoadBalancer裡面有該服務列表。

每個服務 Map<服務名,ILoadBalancer>

ILoadBalancer通過配置IRule、IPing等信息,並通過ServerList獲取伺服器注冊列表的信息,默認以每10s的頻率想服務列表中每個服務實例發送ping請求,檢測服務實例是否存活,最後使用負責均衡策略對ServerListFilter過濾得到最終可用的服務實例列表進行處理,然後交給服務調用器進行調用;

ILoadBalance也是一個介面,提供了3個具體實現,分別是DynamicServerListLoadBalancer、ZoneAwareLoadBalancer和NoOpLoadBalancer;

DynamicServerListLoadBalancer繼承自ILoadBalancer基礎實現BaseLoadBalancer,在基礎的負載均衡功能上增加了運行期間對服務實例動態更新和過濾的功能;

NoOpLoadBalancer沒有操作的實現;

ZoneAwareLoadBalancer(ILoadBalancer的默認的實現類是:ZoneAwareLoadBalancer。)則是繼承DynamicServerListLoadBalancer,在此基礎上增加防止跨區域訪問的問題;

首先它會剔除符合這些規則的Zone區域:所屬實例數位零的Zone區域;Zone區域內實例等平均負載小於零,或者實例故障率(斷路器斷開次數/實例數)大於等於閥值(默認為0.99999)。

然後根據Zone區域等實例平均負載計算出最差的Zone區域,這里的最差指的是實例平均負載最高的Zone區域。

如果在上面的過程中沒有符合剔除要求的區域,同時實例最大平均負載小於閥值(默認為20%),就直接返回所有Zone區域為可用區域。否則,從最壞Zone區域集合中隨機選擇一個,將它從可用Zone區域集合中剔除。

 ▪️當獲得的可用Zone區域集合不為空,並且個數小於Zone區域總數,就隨機選擇一個Zone區域。

▪️在確定了某個Zone區域後,則獲取了對應Zone區域的服務均衡器,並調用chooseServer來選擇具體的服務實例,而在chooseServer中將使用IRule介面的choose函數來選擇具體的服務實例。在這里,IRule介面的實現會使用ZoneAvoidanceRule來挑選出具體的服務實例。

服務列表就是客戶端負載均衡所使用的(同一注冊中心集群)各服務的服務實例列表。Ribbon在實現上支持以下幾種服務列表方式

靜態伺服器列表:通過Ribbon的BaseLoadBalancer所提供的setServerList()方法,初始化時直接進行動態設置指定;

基於配置的伺服器列表:需要在項目配置文件中通過<服務名稱>.ribbon.listOfServers進行設置。(如user-service.ribbon.listOfServers=http://127.0.0.1:8082,http://127.0.0.1:8083)

基於服務發現的伺服器列表:同時使用Ribbon和Eureka時,默認使用該方式,在應用啟動時Ribbon就會從Eureka伺服器中獲取所有注冊服務的列表數據,並保持同步。

該組件會對原始服務列表使用一定策略進行過濾返回有效可用的伺服器列表給客戶端負載均衡器使用。常用服務列表過濾器如下:ZoneAffinityServerListFilter:基於區域感知的方式,實現對服務實例的過濾,僅返回與本身所處區域一直的服務提供者實例列表;ServerListSubsetFilter:該過濾器繼承自ZoneAffinityServerListFilter,在進行區域感知過濾後,僅返回一個固定大小的服務列表。默認將返回20個服務實例,可以通過ribbon.ServerListSubsetFilter.size進行設置;

:使用Eureka和Ribbon時默認的過濾器。實現通過配置或者Eureka所屬區域來過濾出同區域的服務實例列表。

它實現了通過配置或者Eureka實例元數據的所屬區域(Zone)來過濾出同區域的服務實例。如下面的源碼所示,它的實現非常簡單,首先通過父類ZoneAffinityServerListFilter的過濾器來獲得「區域感知」的服務實例列表,然後遍歷這個結果,取出根據消費者配置預設的區域Zone來進行過濾,如果過濾掉結果是空就直接返回父類獲取的結果,如果不為空就返回通過消費者配置的Zone過濾後的結果。

用來檢測一個微服務實例是否存活是否有響應,Ribbon通過該組件來判斷所持有的服務實例列表中各服務可用情況,如果檢測到某服務實例不存在/一定時間未響應,則會從持有服務列表中及時移除。

PingUrl:通過定期訪問指定的URL判斷;

PingConstant:不做任何處理,只返回一個固定值,用來表示該服務是否可用,默認值為true;

NoOpPing:不做任何處理,直接返回true,表示該伺服器可用,默認策略;

DummyPing:直接返回true,但實現了initWithNiwsConfig方法;

NIWSDiscoverPing:根據DiscoveryEnabledServer中InstanceInfo的InstanceStatus屬性判斷,如果該屬性的值為InstanceStatus.UP,則表示伺服器可用;

作用就是選擇一個最終服務實例地址作為負載均衡處理結果。Ribbon提供的選擇策略有隨機 (Random)、輪詢 (RoundRobin)、一致性哈希 (ConsistentHash)、哈希 (Hash)、加權(Weighted)。

IRule負載均衡策略:通過實現該介面定義自己的負載均衡策略。它的choose方法就是從一堆伺服器列表中按規則選出一個伺服器。

默認實現:

ZoneAvoidanceRule(區域權衡策略):復合判斷Server所在區域的性能和Server的可用性,輪詢選擇伺服器。

其他規則:

BestAvailableRule(最低並發策略):會先過濾掉由於多次訪問故障而處於斷路器跳閘狀態的服務,然後選擇一個並發量最小的服務。逐個找服務,如果斷路器打開,則忽略。

RoundRobinRule(輪詢策略):以簡單輪詢選擇一個伺服器。按順序循環選擇一個server。

RandomRule(隨機策略):隨機選擇一個伺服器。

AvailabilityFilteringRule(可用過濾策略):會先過濾掉多次訪問故障而處於斷路器跳閘狀態的服務和過濾並發的連接數量超過閥值得服務,然後對剩餘的服務列表安裝輪詢策略進行訪問。

WeightedResponseTimeRule(響應時間加權策略):據平均響應時間計算所有的服務的權重,響應時間越快服務權重越大,容易被選中的概率就越高。剛啟動時,如果統計信息不中,則使用RoundRobinRule(輪詢)策略,等統計的信息足夠了會自動的切換到WeightedResponseTimeRule。響應時間長,權重低,被選擇的概率低。反之,同樣道理。此策略綜合了各種因素(網路,磁碟,IO等),這些因素直接影響響應時間。

RetryRule(重試策略):先按照RoundRobinRule(輪詢)的策略獲取服務,如果獲取的服務失敗則在指定的時間會進行重試,進行獲取可用的服務。如多次獲取某個服務失敗,就不會再次獲取該服務。主要是在一個時間段內,如果選擇一個服務不成功,就繼續找可用的服務,直到超時。

1. <clientName>:這是調用ribbon的客戶端名稱,如果此值為沒有配置,則此條屬性會作用到所有的客戶端。

2. <nameSpace>:默認值為 「ribbon」

3. <propertyName>:所有的可用的屬性都在com.netflix.client.conf.CommonClientConfigKey。

<clientName>.<nameSpace>.NFLoadBalancerClassName=xx

<clientName>.<nameSpace>.NFLoadBalancerRuleClassName=xx

<clientName>.<nameSpace>.NFLoadBalancerPingClassName=xx

<clientName>.<nameSpace>.NIWSServerListClassName=xx

<clientName>.<nameSpace>.NIWSServerListFilterClassName=xx

com.netflix.client.config.IClientConfig:Ribbon的客戶端配置,默認採用com.netflix.client.config.DefaultClientConfigImpl實現。

com.netflix.loadbalancer.IRule:Ribbon的負載均衡策略,默認採用com.netflix.loadbalancer.ZoneAvoidanceRule實現,該策略能夠在多區域環境下選出最佳區域的實例進行訪問。

com.netflix.loadbalancer.IPing:Ribbon的實例檢查策略,默認採用com.netflix.loadbalancer.NoOpPing實現,該檢查策略是一個特殊的實現,實際上它並不會檢查實例是否可用,而是始終返回true,默認認為所有服務實例都是可用的。

com.netflix.loadbalancer.ServerList:服務實例清單的維護機制,默認採用com.netflix.loadbalancer.ConfigurationBasedServerList實現。

com.netflix.loadbalancer.ServerListFilter:服務實例清單過濾機制,默認采org.springframework.cloud.netflix.ribbon.,該策略能夠優先過濾出與請求方處於同區域的服務實例。

com.netflix.loadbalancer.ILoadBalancer:負載均衡器,默認採用com.netflix.loadbalancer.ZoneAwareLoadBalancer實現,它具備了區域感知的能力。

上面的配置是在項目中沒有引入spring Cloud Eureka,如果引入了Eureka和Ribbon依賴時,自動化配置會有一些不同。

通過自動化配置的實現,可以輕松的實現客戶端的負載均衡。同時,針對一些個性化需求,我們可以方便的替換上面的這些默認實現,只需要在springboot應用中創建對應的實現實例就能覆蓋這些默認的配置實現。

@Configuration

public class MyRibbonConfiguration {

    @Bean

    public IRule ribbonRule(){

        return new RandomRule();

    }

}

這樣就會使用P使用了RandomRule實例替代了默認的com.netflix.loadbalancer.ZoneAvoidanceRule。

也可以使用@RibbonClient註解實現更細粒度的客戶端配置

對於Ribbon的參數通常有二種方式:全局配置以及指定客戶端配置

全局配置的方式很簡單

只需要使用ribbon.<key>=<value>格式進行配置即可。其中,<key>代表了Ribbon客戶端配置的參數名,<value>則代表了對應參數的值。比如,我們可以想下面這樣配置Ribbon的超時時間

ribbon.ConnectTimeout=250

ribbon.ServerListRefreshInterval=2000   ribbon獲取服務定時時間

全局配置可以作為默認值進行設置,當指定客戶端配置了相應的key的值時,將覆蓋全局配置的內容

指定客戶端的配置方式

<client>.ribbon.<key>=<value>的格式進行配置.<client>表示服務名,比如沒有服務治理框架的時候(如Eureka),我們需要指定實例清單,可以指定服務名來做詳細的配置,

user-service.ribbon.listOfServers=localhost:8080,localhost:8081,localhost:8082

對於Ribbon參數的key以及value類型的定義,可以通過查看com.netflix.client.config.CommonClientConfigKey類。

當在spring Cloud的應用同時引入Spring cloud Ribbon和Spring Cloud Eureka依賴時,會觸發Eureka中實現的對Ribbon的自動化配置。這時的serverList的維護機制實現將被com.netflix.niws.loadbalancer.的實例所覆蓋,該實現會講服務清單列表交給Eureka的服務治理機制來進行維護。IPing的實現將被com.netflix.niws.loadbalancer.NIWSDiscoveryPing的實例所覆蓋,該實例也將實例介面的任務交給了服務治理框架來進行維護。默認情況下,用於獲取實例請求的ServerList介面實現將採用Spring Cloud Eureka中封裝的org.springframework.cloud.netflix.ribbon.eureka.DomainExtractingServerList,其目的是為了讓實例維護策略更加通用,所以將使用物理元數據來進行負載均衡,而不是使用原生的AWS AMI元數據。在與Spring cloud Eureka結合使用的時候,不需要再去指定類似的user-service.ribbon.listOfServers的參數來指定具體的服務實例清單,因為Eureka將會為我們維護所有服務的實例清單,而對於Ribbon的參數配置,我們依然可以採用之前的兩種配置方式來實現。

此外,由於spring Cloud Ribbon默認實現了區域親和策略,所以,可以通過Eureka實例的元數據配置來實現區域化的實例配置方案。比如可以將不同機房的實例配置成不同的區域值,作為跨區域的容器機制實現。而實現也非常簡單,只需要服務實例的元數據中增加zone參數來指定自己所在的區域,比如:

eureka.instance.metadataMap.zone=shanghai

在Spring Cloud Ribbon與Spring Cloud Eureka結合的工程中,我們可以通過參數禁用Eureka對Ribbon服務實例的維護實現。這時又需要自己去維護服務實例列表了。

ribbon.eureka.enabled=false.

由於Spring Cloud Eureka實現的服務治理機制強調了cap原理的ap機制(即可用性和可靠性),與zookeeper這類強調cp(一致性,可靠性)服務質量框架最大的區別就是,Eureka為了實現更高的服務可用性,犧牲了一定的一致性,在極端情況下寧願接受故障實例也不要丟棄"健康"實例。

比如說,當服務注冊中心的網路發生故障斷開時候,由於所有的服務實例無法維護續約心跳,在強調ap的服務治理中將會把所有服務實例剔除掉,而Eureka則會因為超過85%的實例丟失心跳而觸發保護機制,注冊中心將會保留此時的所有節點,以實現服務間依然可以進行互相調用的場景,即使其中有部分故障節點,但這樣做可以繼續保障大多數服務的正常消費。

在Camden版本,整合了spring retry來增強RestTemplate的重試能力,對於我們開發者來說,只需要簡單配置,即可完成重試策略。

spring.cloud.loadbalancer.retry.enabled=true

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=10000

user-service.ribbon.ConnectTimeout=250

user-service.ribbon.ReadTimeout=1000

user-service.ribbon.OkToRetryOnAllOperations=true

user-service.ribbon.MaxAutoRetriesNextServer=2

user-service.ribbon.maxAutoRetries=1

spring.cloud.loadbalancer.retry.enabled:該參數用來開啟重試機制,它默認是關閉的。

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds:斷路器的超時時間需要大於Ribbon的超時時間,不然不會觸發重試。

user-service.ribbon.ConnectTimeout:請求連接超時時間。

user-service.ribbon.ReadTimeout:請求處理的超時時間

user-service.ribbon.OkToRetryOnAllOperations:對所有操作請求都進行重試。

user-service.ribbon.MaxAutoRetriesNextServer:切換實例的重試次數。

user-service.ribbon.maxAutoRetries:對當前實例的重試次數。

根據以上配置,當訪問到故障請求的時候,它會再嘗試訪問一次當前實例(次數由maxAutoRetries配置),如果不行,就換一個實例進行訪問,如果還是不行,再換一個實例訪問(更換次數由MaxAutoRetriesNextServer配置),如果依然不行,返回失敗

項目啟動的時候會自動的為我們載入LoadBalancerAutoConfiguration自動配置類,該自動配置類初始化條件是要求classpath必須要有RestTemplate這個類,必須要有LoadBalancerClient實現類。

LoadBalancerAutoConfiguration為我們幹了二件事,第一件是創建了LoadBalancerInterceptor攔截器bean,用於實現對客戶端發起請求時進行攔截,以實現客戶端負載均衡。創建了一個

RestTemplateCustomizer的bean,用於給RestTemplate增加LoadBalancerInterceptor攔截器。

每次請求的時候都會執行org.springframework.cloud.client.loadbalancer.LoadBalancerInterceptor的intercept方法,而LoadBalancerInterceptor具有LoadBalancerClient(客戶端負載客戶端)實例的一個引用,

在攔截器中通過方法獲取服務名的請求url(比如http://user-service/user),及服務名(比如user-service),然後調用負載均衡客戶端的execute方法。

執行負載客戶端RibbonLoadBalancerClient(LoadBalancerClient的實現)的execute方法,得到ILoadBalancer(負載均衡器)的實現ZoneAwareLoadBalancer,並且通過調用其chooseServer方法獲得服務列表中的一個實例,比如說user-service列表注冊到eureka中一個實例。然後向其中的一個具體實例發起請求,得到結果。

Ribbon詳解 

https://www.jianshu.com/p/1bd66db5dc46

Spring cloud系列六 Ribbon的功能概述、主要組件和屬性文件配置  

https://blog.csdn.net/hry2015/article/details/78357990

Ribbon的ZoneAwareLoadBalancer  

https://blog.csdn.net/chengqiuming/article/details/81209131

Ribbon的實際使用

https://www.jianshu.com/p/f86af82fa782

本人有道雲筆記中記錄的參考文章

文檔:04_ribbon 負載均衡.note

鏈接:http://note.you.com/noteshare?id=&sub=

熱點內容
食物語上傳 發布:2025-01-24 07:58:44 瀏覽:753
編程相關書籍 發布:2025-01-24 07:55:45 瀏覽:429
英雄聯盟手游需要哪些配置 發布:2025-01-24 07:42:03 瀏覽:984
regex可以靜態編譯嗎 發布:2025-01-24 07:40:32 瀏覽:78
怎麼編譯rec 發布:2025-01-24 07:39:04 瀏覽:55
卡片沒加密 發布:2025-01-24 07:33:56 瀏覽:380
linux備份mysql 發布:2025-01-24 07:26:54 瀏覽:390
蘋果手機忘記id密碼怎麼刷機 發布:2025-01-24 07:26:47 瀏覽:694
安卓手機系統怎麼安裝 發布:2025-01-24 07:23:31 瀏覽:537
pc伺服器是什麼樣的 發布:2025-01-24 07:23:21 瀏覽:593