1. 程式人生 > >Node.js微服務 3 :從單塊軟體到微服務

Node.js微服務 3 :從單塊軟體到微服務

    隨著公司的增長,單塊軟體會有增長的痛苦和低下的效率。

3.1 單塊軟體

    運行於單一容器且開發週期嚴格定義的大型軟體元件是完全違背敏捷開發原則的:及早交付和頻繁交付。

    自然增長指的是,由於缺乏充分的長期規劃,在業務壓力下,軟體系統無計劃、無控制地增長。

    控制自然增長的首要任務就是確保公司中的IT部門能與業務部門相匹配。通常大型公司並不將IT部門視為業務核心部門。最終這將導致這些企業沒有理想的生態系統來有計劃地響應業務需求,只停留在逐個問題、逐個處理的原始階段。這主要歸咎於IT部門的管理者對弈系統的構建幾乎一無所知,並且常常忽視軟體開發過程中的複雜性。

    幸運的是,由於IT系統已成為世界上99%的業務的驅動者,所以上述情況將有改善的趨勢。

    可以將工作內容分成若干個可控的軟體工件,併為每個工件對應一個定義好的業務活動,併為它分配一個實體。這個階段,還不需要將其暴露成微服務,但是,將邏輯保持在一個獨立的、定義良好的、易於測試且解耦的模組中,將對我們未來改造應用帶來極大的好處。

    解決自然增長的第一步:建立具有良好邊界和具有單一職能的細粒度服務,其中單一職能表示將事情做得小而精。

    多抽象才是過度抽象:在沒有重複使用3次以上的場景下避免使用抽象。

    Seneca十分符合微服務的設計哲學,通過模式匹配,能夠在對已有程式碼無影響的情況下擴充套件微服務已有的API:我們的服務對擴充套件開放,對修改關閉,增加功能的同時不影響已有功能。

3.2 微服務的出現

     以通訊服務模組為例,如果開發者繼續加入其他通訊渠道就進入了失控階段。這就是單塊軟體的關鍵問題所在:限界上下文跨越了多個領域,從而影響到軟體的功能性和可維護性這兩方面的質量。

module.exports = function(options) {
var init = {}
//傳送簡訊
init.sendSMS = function(destination, content) {
}
//讀取未讀簡訊列表
init.readPendingSMS = function () {
}
//傳送郵件
init.sendEmail = function(subject, content) {
}
//讀取郵件列表
init.readPendingEmails = funciton() {
}
//...
return init;
}
    通過Seneca將它切分成數個小模組emails.js, sms.js
var seneca = require('seneca')()
   .use('email')
   .use('sms')
seneca.listen({port: 1932, host: "10.0.0.7"});
   微服務的缺陷:

   人工操作的開銷會使微服務帶來的好處大打折扣。

   應用的不一致性

   引入了更多的通訊複雜性,這樣可能會導致安全問題。

3.3 分割單塊軟體

    在高訪問壓力下,郵件傳送將會出現延遲,但小型的Seneca模組都是一個高內聚、低耦合的外掛,即只需在多臺機器上部署郵件服務介面。

    資料才是分割單塊軟體的主要問題:微服務的主要痛點是缺乏事務性。因此不要過於微服務化,而是對於其他例如郵件、簡訊和使用者註冊等輔助模組,則適合微服務化。

    組織架構適配:為了保證構建微服務的敏捷性,每個團隊都必須保持自治,這也意味著要確保技術的自主選擇權,如使用的語言、程式碼規範、解決問題的模式等。