Node.js開(kāi)發(fā)指南_讀書(shū)筆記

nodejs開(kāi)發(fā)指南

Node.js簡(jiǎn)介

  1. 簡(jiǎn)介:Node.js是一個(gè)為實(shí)時(shí)Web應(yīng)用開(kāi)發(fā)而誕生的平臺(tái),從誕生之初就充分考慮了實(shí)時(shí)響應(yīng)舀寓、超大規(guī)模數(shù)據(jù)要求下架構(gòu)的擴(kuò)展性炒嘲。

  2. 特點(diǎn):?jiǎn)尉€(xiàn)程粪般、異步式I/O、事件驅(qū)動(dòng)式的程序設(shè)計(jì)模型

  3. 部分實(shí)現(xiàn)遵循了CommomJS規(guī)范

  4. Node.js能做什么:

    • 具有復(fù)雜邏輯的網(wǎng)站
    • 基于社交網(wǎng)絡(luò)的大規(guī)模Web應(yīng)用
    • Web Socket服務(wù)器
    • TCP/UDP套接字應(yīng)用程序
    • 命令行工具
    • 交互式終端程序
    • 帶有圖形用戶(hù)界面的本地應(yīng)用程序
    • 單元測(cè)試工具
    • 客戶(hù)端JavaScript編譯器
  5. 最大的特點(diǎn)就是采用異步式I/O與事件驅(qū)動(dòng)的架構(gòu)設(shè)計(jì)帕棉,使用單線(xiàn)程模型,對(duì)于所有I/O都采用異步式的請(qǐng)求方式饼记,避免了頻繁的上下文切換

  6. 采用回調(diào)函數(shù)等待結(jié)果返回

  7. Node.js的異步機(jī)制是基于事件的

  8. 弊端:

    • 不符合開(kāi)發(fā)者的常規(guī)線(xiàn)性思路香伴,往往需要把一個(gè)完整的邏輯拆分為一個(gè)個(gè)事件,增加了開(kāi)發(fā)和調(diào)試難度
  9. 阻塞:線(xiàn)程在執(zhí)行過(guò)程中如果遇到磁盤(pán)讀寫(xiě)或者網(wǎng)絡(luò)通信(統(tǒng)稱(chēng)I/O操作)具则,通常要耗費(fèi)較長(zhǎng)的事件即纲,這時(shí)操作系統(tǒng)會(huì)剝奪這個(gè)線(xiàn)程的CPU控制權(quán),使其暫停執(zhí)行博肋,同時(shí)將資源讓給其他的工作線(xiàn)程低斋,這種線(xiàn)程調(diào)度方式成為阻塞

  10. 單線(xiàn)程事件驅(qū)動(dòng)的異步式I/O比傳統(tǒng)的多線(xiàn)程阻塞式I/O好在少了多線(xiàn)程的開(kāi)銷(xiāo)

同步式I/O(阻塞式) 異步式I/O(非阻塞式)
利用多線(xiàn)程提供吞吐量 單線(xiàn)程即可實(shí)現(xiàn)高吞吐量
通過(guò)事件片分割和線(xiàn)程調(diào)度利用多核CPU 通過(guò)功能劃分利用多核CPU
需要由操作系統(tǒng)調(diào)度多線(xiàn)程使用多核CPU 可以將單進(jìn)程綁定到單核CPU
難以充分利用CPU資源 可以充分利用CPU資源
內(nèi)存軌跡大,數(shù)據(jù)局部性弱 內(nèi)存軌跡小匪凡,數(shù)據(jù)局部性強(qiáng)
符合線(xiàn)性的編程思維 不符合傳統(tǒng)編程思維
  1. Node.js不鼓勵(lì)使用同步I/O

  2. Node.js程序由事件循環(huán)開(kāi)始膊畴,到時(shí)間循環(huán)結(jié)束,所有的邏輯都是事件的回調(diào)函數(shù)

  3. 模塊(Module)和包(Package)是Node.js最重要的支柱

  4. 模塊是Node.js應(yīng)用程序的基本組成部分锹雏,文件和模塊是一一對(duì)應(yīng)的巴比,一個(gè)Node.js文件就是一個(gè)模塊

  5. 包是在模塊基礎(chǔ)上更深一步的抽象

  6. 他將某個(gè)獨(dú)立的功能封裝起來(lái),用于發(fā)布礁遵、更新轻绞、依賴(lài)管理和版本控制

  7. 包應(yīng)該具備以下特征:

    • package.json必須在包的頂層目錄下
    • 二進(jìn)制文件應(yīng)該在bin目錄下
    • Javascript代碼應(yīng)該在lib目錄下
    • 文檔應(yīng)該在doc目錄下
    • 單元測(cè)試應(yīng)該在test目錄下
  8. package.json字段:

    • name : 包的名稱(chēng),必須是唯一的佣耐,由小寫(xiě)英文字母政勃、數(shù)字和下劃線(xiàn)組成,不能包含空格
    • description : 包的簡(jiǎn)要說(shuō)明
    • version : 符合語(yǔ)義化版本識(shí)別規(guī)范的版本字符串
    • keywords : 關(guān)鍵字?jǐn)?shù)組兼砖,通常用于搜索
    • maintainers : 維護(hù)者數(shù)組奸远,每個(gè)元素要包含name、email(可選)讽挟、web(可選)字段
    • contributors : 貢獻(xiàn)者數(shù)組懒叛,格式與maintainers 相同。包的作者應(yīng)該是貢獻(xiàn)者數(shù)組的第一個(gè)元素
    • bugs : 提交bug的地址耽梅,可以是網(wǎng)址或者電子郵件地址
    • licenses : 許可證數(shù)組薛窥,每個(gè)元素要包含type(許可證名稱(chēng))和url(連接到許可證文本的地址)
    • repositories : 倉(cāng)庫(kù)托管地址數(shù)組,每個(gè)元素要包含type(倉(cāng)庫(kù)的類(lèi)型,如git)诅迷、url(倉(cāng)庫(kù)的地址)和path(相對(duì)于倉(cāng)庫(kù)的路徑佩番,可選)字段
    • dependencies : 包的依賴(lài),一個(gè)關(guān)聯(lián)數(shù)組罢杉,由包名稱(chēng)和版本號(hào)組成

Node.js 核心模塊

  • 全局對(duì)象
  • 常用工具
  • 事件機(jī)制
  • 文件訪(fǎng)問(wèn)系統(tǒng)
  • HTTP服務(wù)器與客戶(hù)端
  1. 全局對(duì)象(global) : 它及所有屬性都可以在程序的任何地方訪(fǎng)問(wèn)

  2. 全局變量 :

    • 在最外層定義的變量

    • 全局對(duì)象的屬性

    • 隱式定義的變量(未定義直接賦值的變量)

      tips :

    • 永遠(yuǎn)使用var定義變量以避免引入全局變量趟畏,因?yàn)槿肿兞繒?huì)污染命名空間,提高代碼的耦合風(fēng)險(xiǎn)

    1. process : 用于描述當(dāng)前Node.js進(jìn)程狀態(tài)的對(duì)象滩租,提供了一個(gè)與操作系統(tǒng)的簡(jiǎn)單接口*
      • process.argv : 命令行參數(shù)數(shù)組
      • process.stdout : 標(biāo)準(zhǔn)輸出流
      • process.stdin : 標(biāo)準(zhǔn)輸入流
      • process.nextTick(callback) : 為事件循環(huán)設(shè)置一項(xiàng)任務(wù)
    2. console : 用于提供控制臺(tái)標(biāo)準(zhǔn)輸出
  3. util : 提供常用函數(shù)的集合

    • util.inherits(constructor, superConstructor) : 一個(gè)思想對(duì)象間原型繼承的函數(shù)
    • util.inspect(object, [showHidden], [depth], [colors]) : 一個(gè)將任意對(duì)象轉(zhuǎn)換為字符串的方法赋秀,通常用于調(diào)試和錯(cuò)誤輸出
  4. events : 事件驅(qū)動(dòng)

    1. events.EventEmitter : 事件發(fā)射與事件監(jiān)聽(tīng)器功能的封裝
      • EventEmitter.on(event, listener) : 為指定事件注冊(cè)一個(gè)監(jiān)聽(tīng)器,接受一個(gè)字符串event和一個(gè)回調(diào)函數(shù)listener
      • EventEmitter.emit(event, [arg1], [arg2], [...]) : 發(fā)射event事件持际,傳遞若干可選參數(shù)到事件監(jiān)聽(tīng)器的參數(shù)表
      • EventEmitter.once(event, listener) : 為指定事件注冊(cè)一個(gè)單次監(jiān)聽(tīng)器沃琅,即監(jiān)聽(tīng)器最多只會(huì)觸發(fā)一次,觸發(fā)后立刻接觸該監(jiān)聽(tīng)器
      • EventEmitter.removeListener(event, listener) : 移除指定事件的某個(gè)監(jiān)聽(tīng)器蜘欲,listener必須是該事件已經(jīng)注冊(cè)過(guò)的監(jiān)聽(tīng)器
    2. error事件
    3. 繼承EventEmitter : 大多數(shù)時(shí)候我們不會(huì)直接使用EventEmitter益眉,而是在對(duì)象中繼承它。包括fs姥份、net郭脂、http
  5. 文件系統(tǒng)fs

    1. fs.readFile(filename, [encoding], [callback(err, data)])
    2. fs.readFileSync(filename, [encoding])
    3. fs.open(path, flags, [mode], [callback(err, fd)])
    4. fs.read(fd, buffer, offset, length, position, [callback(err, bytesRead, buffer)])
      • 一般來(lái)說(shuō),除非必要澈歉,否則不要使用這種方式讀取文件
  6. HTTP服務(wù)器與客戶(hù)端

    • Node.js標(biāo)準(zhǔn)庫(kù)提供了http模塊展鸡,其中封裝了一個(gè)高效的HTTP服務(wù)器和一個(gè)簡(jiǎn)易的HTTP客戶(hù)端
    1. http.Server是http模塊中的HTTP服務(wù)器對(duì)象

    2. http.Server的事件

      • request : 當(dāng)客戶(hù)端請(qǐng)求到來(lái)時(shí),該事件觸發(fā)埃难,提供兩個(gè)參數(shù)req和res莹弊,分別是http.ServerRequest和http.ServerResponse的實(shí)例,表示請(qǐng)求和響應(yīng)信息
      • connection : 當(dāng)TCP連接建立時(shí)涡尘,該事件被觸發(fā)忍弛,提供一個(gè)參數(shù)socket,為net.Socket的實(shí)例
      • close : 當(dāng)服務(wù)器關(guān)閉時(shí)考抄,該事件被觸發(fā)
    3. http.ServerRequest : HTTP請(qǐng)求的信息

      • data : 當(dāng)請(qǐng)求體數(shù)據(jù)到來(lái)時(shí)细疚,該事件被觸發(fā)。該事件提供一個(gè)參數(shù)chunk川梅,表示接收到的數(shù)據(jù)
      • end : 當(dāng)請(qǐng)求體數(shù)據(jù)傳輸完成時(shí)疯兼,該事件被觸發(fā),伺候不會(huì)再有數(shù)據(jù)到來(lái)
      • close : 用戶(hù)當(dāng)前請(qǐng)求結(jié)束時(shí)贫途,該事件被觸發(fā)
    4. http.ServerResponse : 返回給客戶(hù)端的信息

      • response.writeHead(statusCode, [headers]) : 向請(qǐng)求的客戶(hù)端發(fā)送響應(yīng)頭
      • respinse.write(data, [encoding]) : 向請(qǐng)求的客戶(hù)端發(fā)送響應(yīng)內(nèi)容
      • response.end([data], [encoding]) : 響應(yīng)結(jié)束吧彪,告知客戶(hù)端所有發(fā)送已經(jīng)完成
    5. HTTP客戶(hù)端

      • http模塊提供了http.requesthttp.get,作為客戶(hù)端向HTTP服務(wù)器發(fā)起請(qǐng)求
      1. http.request(options, callback)丢早,options :

        • host : 請(qǐng)求網(wǎng)站的域名或IP地址
        • port : 請(qǐng)求網(wǎng)站的端口来氧,默認(rèn)80
        • method : 請(qǐng)求方法,默認(rèn)GET
        • path : 請(qǐng)求的相對(duì)于根的路徑,默認(rèn)'/'
        • headers : 一個(gè)關(guān)聯(lián)數(shù)組對(duì)象啦扬,為請(qǐng)求頭的內(nèi)容
      2. http.get(options, callback) : 簡(jiǎn)化便方法處理GET請(qǐng)求

      3. http.ClientRequest : 由http.requesthttp.get返回產(chǎn)生的對(duì)象,表示一個(gè)已經(jīng)產(chǎn)生且正在進(jìn)行中的HTTP請(qǐng)求

      4. http.ClientResponse : 提供了三個(gè)事件data凫碌、endclose

        ClientResponse的屬性

        名稱(chēng) 含義
        statusCode HTTP狀態(tài)碼扑毡,如200/404/500
        httpVersion HTTP協(xié)議版本,通常是1.0或1.1
        headers HTTP請(qǐng)求頭
        trailers HTTP請(qǐng)求尾
      5. response.setEncoding([encoding]) : 設(shè)置默認(rèn)的編碼盛险,當(dāng)data事件被觸發(fā)時(shí)瞄摊,數(shù)據(jù)將會(huì)以encoding編碼,默認(rèn)值null

      6. response.pause() : 暫停接收數(shù)據(jù)和發(fā)送事件苦掘。方便實(shí)現(xiàn)下載功能

      7. response.resume() : 從暫停的狀態(tài)中恢復(fù)

Node.js 開(kāi)發(fā)

  1. Web開(kāi)發(fā)架構(gòu)對(duì)比

    特性 模板為中心架構(gòu) MVC架構(gòu)
    頁(yè)面產(chǎn)生方式 執(zhí)行并替換標(biāo)簽中的語(yǔ)句 由模板引擎生成HTML頁(yè)面
    路徑解析 對(duì)應(yīng)到文件系統(tǒng) 由控制器定義
    數(shù)據(jù)訪(fǎng)問(wèn) 通過(guò)SQL語(yǔ)句查詢(xún)或訪(fǎng)問(wèn)文件系統(tǒng) 對(duì)象關(guān)系模型
    架構(gòu)中心 腳本語(yǔ)言是靜態(tài)HTTP服務(wù)器的擴(kuò)展 靜態(tài)HTTP服務(wù)器是腳本語(yǔ)言的補(bǔ)充
    適用范圍 小規(guī)模網(wǎng)站 大規(guī)模網(wǎng)站
    學(xué)習(xí)難度 容易 較難
  2. REST : 表征狀態(tài)轉(zhuǎn)移换帜,他是一種基于HTTP協(xié)議的網(wǎng)絡(luò)應(yīng)用的接口風(fēng)格,充分利用HTTP的方法實(shí)現(xiàn)統(tǒng)一風(fēng)格接口的服務(wù)

    • GET : 請(qǐng)求獲取指定資源(常用鹤啡,獲裙咄铡)
    • HEAD : 請(qǐng)求指定資源的響應(yīng)頭
    • POST : 向指定資源提交數(shù)據(jù)(常用,新增)
    • PUT : 請(qǐng)求服務(wù)器存儲(chǔ)一個(gè)資源(常用递瑰,更新)
    • DELETE : 請(qǐng)求服務(wù)器刪除指定資源(常用祟牲,刪除)
    • TRACE : 回顯服務(wù)器收到的請(qǐng)求,主要用于測(cè)試或診斷
    • CONNECT : HTTP/1.1協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器
    • OPTIONS : 返回服務(wù)器支持的HTTP請(qǐng)求方法
  3. 冪等 : 重復(fù)請(qǐng)求多次與一次請(qǐng)求的效果是一樣的

    請(qǐng)求方式 安全 冪等
    GET
    POST
    PUT
    DELETE
    • 安全 : 指沒(méi)有附作用抖部,即請(qǐng)求不會(huì)對(duì)資源產(chǎn)生變動(dòng)说贝,連續(xù)多次訪(fǎng)問(wèn)所獲得的結(jié)果不受訪(fǎng)問(wèn)者影響
  4. 當(dāng)你訪(fǎng)問(wèn)任何被上面兩條同樣的規(guī)則匹配到的路徑時(shí),會(huì)發(fā)現(xiàn)請(qǐng)求總是被前一條路由規(guī)則捕獲慎颗,后面的規(guī)則會(huì)被忽略乡恕,Express提供了路由控制權(quán)轉(zhuǎn)移的方法,即回調(diào)函數(shù)的第三個(gè)參數(shù)next

  5. 模板引擎 : 一個(gè)從頁(yè)面模板根據(jù)一定的規(guī)則生成HTML的工具

    問(wèn)題 :

    • 頁(yè)面功能邏輯與頁(yè)面布局樣式耦合俯萎,網(wǎng)站規(guī)模變大以后逐漸難以維護(hù)
    • 語(yǔ)法復(fù)雜傲宜,對(duì)于非技術(shù)的網(wǎng)頁(yè)設(shè)計(jì)者來(lái)說(shuō)門(mén)檻較高,難以學(xué)習(xí)
    • 功能過(guò)于全面讯屈,頁(yè)面設(shè)計(jì)者可以在頁(yè)面上編程蛋哭,不利于功能劃分,也使模板解析效率降低

Node.js 進(jìn)階

  • 模塊加載機(jī)制
  • 異步編程模式下的控制流
  • Node.js 應(yīng)用部署
  • Node.js 的一些劣勢(shì)
  1. Node.js的模塊可以分為兩大類(lèi) : 核心模塊(fs涮母、http谆趾、net、vm等)叛本,文件模塊(JS代碼沪蓬、JSON等)
  2. Node.js不會(huì)被重復(fù)加載,這是因?yàn)镹ode.js通過(guò)文件名緩存所有加載過(guò)得文件模塊
  3. Node.js應(yīng)用部署缺陷 :
    • 不支持故障恢復(fù)
    • 沒(méi)有日志
    • 無(wú)法利用多核提高性能
    • 獨(dú)占端口
    • 需要手動(dòng)啟動(dòng)
  4. Node.js不適合做什么 :
    • 計(jì)算密集型程序
    • 單用戶(hù)多任務(wù)型應(yīng)用
    • 邏輯十分復(fù)雜的事務(wù)
    • Unicode與國(guó)際化
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末来候,一起剝皮案震驚了整個(gè)濱河市跷叉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖云挟,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梆砸,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡园欣,警方通過(guò)查閱死者的電腦和手機(jī)帖世,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)沸枯,“玉大人日矫,你說(shuō)我怎么就攤上這事“罅瘢” “怎么了哪轿?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)翔怎。 經(jīng)常有香客問(wèn)我窃诉,道長(zhǎng),這世上最難降的妖魔是什么姓惑? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任褐奴,我火速辦了婚禮,結(jié)果婚禮上于毙,老公的妹妹穿的比我還像新娘敦冬。我一直安慰自己,他們只是感情好唯沮,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布脖旱。 她就那樣靜靜地躺著,像睡著了一般介蛉。 火紅的嫁衣襯著肌膚如雪萌庆。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,950評(píng)論 1 291
  • 那天币旧,我揣著相機(jī)與錄音践险,去河邊找鬼。 笑死吹菱,一個(gè)胖子當(dāng)著我的面吹牛巍虫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鳍刷,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼占遥,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了输瓜?” 一聲冷哼從身側(cè)響起瓦胎,我...
    開(kāi)封第一講書(shū)人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤芬萍,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后搔啊,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體柬祠,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年负芋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瓶盛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡示罗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出芝硬,到底是詐尸還是另有隱情蚜点,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布拌阴,位于F島的核電站绍绘,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏迟赃。R本人自食惡果不足惜陪拘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望纤壁。 院中可真熱鬧左刽,春花似錦、人聲如沸酌媒。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)秒咨。三九已至喇辽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間雨席,已是汗流浹背菩咨。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留陡厘,地道東北人抽米。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像雏亚,于是被迫代替她去往敵國(guó)和親缨硝。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • https://nodejs.org/api/documentation.html 工具模塊 Assert 測(cè)試 ...
    KeKeMars閱讀 6,313評(píng)論 0 6
  • 總結(jié)一: [node.js總結(jié)](http://www.cnblogs.com/Darren_code/archi...
    xiumeiii閱讀 1,887評(píng)論 0 14
  • 內(nèi)容來(lái)自《Node.js開(kāi)發(fā)指南》 核心模塊是 Node.js 的心臟罢低,它由一些精簡(jiǎn)而高效的庫(kù)組成查辩,為 Node....
    angelwgh閱讀 891評(píng)論 0 1
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理胖笛,服務(wù)發(fā)現(xiàn),斷路器宜岛,智...
    卡卡羅2017閱讀 134,637評(píng)論 18 139
  • 首先要說(shuō)對(duì)不起萍倡。 昨天到今天一直在恐懼之中度過(guò)身弊。 可能是那場(chǎng)大雨澆潰了腦海中的大壩,我突然不切實(shí)際的不合時(shí)宜的說(shuō)出...
    愛(ài)發(fā)牢騷的上進(jìn)青年閱讀 462評(píng)論 0 0