微服務實踐 | 焱融雲前端微服務架構的設計要點

什麼是微服務

微服務是一種開發軟件的架構和組織方法,其中軟件由通過明確定義的 API 進行通信的小型獨立服務組成,這些服務由各個小型獨立團隊負責,每個服務可被獨立部署,服務之間是松耦合的,每個服務僅關注於完成一件任務。微服務架構使應用程序更易於擴展和更快地開發,從而加速創新並縮短新功能的上線時間。

整體式架構與微服務架構

整體式架構,所有進程緊密耦合,並可作爲單項服務運行。這意味着,如果應用程序的一個進程達到峯值,則必須擴展整個架構。隨着代碼庫的增長,添加或改進整體式應用程序的功能變得更加複雜。這種複雜性限制了試驗的可行性,並使實施新功能變得困難。整體式架構增加了應用程序可用性的風險,因爲許多互相依賴、且緊密耦合的進程會擴大單個進程故障的影響。

微服務架構,應用程序通過多個獨立運行的組件構成,每個組件作爲一項服務運行。這些服務圍繞業務功能進行構建,每項服務提供一項功能,彼此之間使用輕量級 API 通過明確定義的接口進行通信。由於各個服務獨立運行,因此可以針對各項服務進行更新、部署和擴展,以滿足對應用程序日常運行和更新的需求。

微服務的優勢

靈活擴展

通過微服務,可以獨立擴展各項服務以滿足其整體應用程序功能的需求。這使團隊能夠適當調整基礎設施需求,並在服務需求激增時保持整體應用的可用性。

輕鬆部署

微服務支持持續集成和持續交付,可以輕鬆嘗試新想法,並可以在無法正常運行時回滾。由於故障成本較低,因此可以大膽試驗,更輕鬆地更新代碼,並縮短新功能的上線時間。

技術自由

微服務架構中,團隊可以自由選擇最佳工具來解決他們的具體問題。因此,構建微服務的團隊可以爲每項作業選擇最佳工具。

彈性

服務獨立性增加了應用程序應對故障的彈性。在整體式架構中,如果一個組件出現故障,可能導致整個應用程序無法運行。

焱融雲前端微服務技術選型

框架選型

焱融雲前端所有服務和組件均基於 NestJS 框架進行開發。NestJS 基於 Express 框架開發,相比於原生 Express 和 Koa 框架,NestJS 的優勢在於:

  1. 兼容所有 Express 中間件
  2. 完美支持 TypeScript
  3. 依賴注入以及模塊化思想
  4. 大量使用裝飾器和註解,能快速編寫業務代碼

服務發現和配置管理

我們選用 Consul 作爲我們的服務註冊中心,同時也作爲動態配置中心。Consul 的優勢:

  1. 使用 Raft 一致性算法,保證分佈式集羣各節點狀態一致
  2. 提供服務註冊,服務發現,主動服務狀態檢查
  3. 支持 HTTP、DNS 等協議
  4. 提供分佈式一致性 KV 存儲

焱融雲前端微服務架構

在我們的微服務體系中,所有服務被劃分了三個層次:

  1. 基礎設施層,如 MySQL、Memcached、Consul 等第三方成熟組件組成,爲業務提供基礎服務。
  2. 業務服務層:根據業務不同拆分成不同的微服務。
  3. 接入層:對外提供服務,如網站,API 接口等。

其中,業務層的服務之間可互相調用且是無狀態的;接入層服務之間不可互相調用,不包含業務代碼。架構如圖所示:

配置管理

在微服務分佈式環境下,一個系統拆分成很多個微服務,需要告別手工修改配置的方式,採用集中配置管理的方式提升運維效率。

配置文件主要有運行前的靜態配置和運行期間的動態配置兩種。靜態配置在部署的時候就設置好,動態配置則是在服務運行中調整的系統變量或者業務參數。

我們採用 Consul 的 KV 存儲來做動態配置中心,配置修改同步流程如下:

配置修改後,通過定時拉取或者服務監聽的方式更新並緩存到本地內存中,供服務使用。

服務集成

在服務集成方面我們開發了 NodeJS 的聲明式 Web Service 客戶端,方便開發人員在服務之間快速集成。

服務端,我們聲明一個 Restful 服務接口:

import { Controller, Get, Param } from '@nestjs/common';

@Controller('/users')
export class UserController {
    @Get('/:userId')
    getUser(@Param('userId') userId: string) {
        return {id: 1, name: 'yanrong'};
    }
}

客戶端使用一個微服務接口:

import { Injectable } from '@nestjs/common';
import { Post, Loadbalanced, Param } from '@nestcloud/feign';

@Injectable()
@Loadbalanced('yrcloudfile-user-service')
export class UserClient {
    @Get('/users/:userId')
    getUser(@Param('userId') userId: string): any {
    }
}

服務質量

在服務質量方面,由於服務間調用是跨系統調用,各服務獨立運行,所以必須考慮服務的伸縮性和容錯性,主要包括以下幾點要求:

1. 服務可以平滑的加入和移除,並且可以平滑升級

當服務啓動完成的時候通過 Consul 接口註冊服務,並將 /health 作爲健康檢查地址,Consul 每隔 5s 訪問 /health,檢查服務狀態,如果狀態是 UP,則 Consul 將服務標記爲可用,否則標記爲不可用。

當服務關閉的時候,先從 Consul 取消服務註冊,再關閉服務。

2. 流量均勻分佈在不同的實例上

微服務的基礎能力之一就是支持負載均衡,而我們通常所說的負載均衡都是指服務端負載均衡,但是這裏指的是客戶端負載均衡,我們針對 Consul ,有針對性地開發了一個客戶端負載均衡器模塊,使之能很好地和我們的聲明式客戶端結合起來。

和服務端負載均衡不同的是,在客戶端負載均衡中,所有的客戶端節點都要維護自己要訪問的服務端列表,而這些服務端的列表來自注冊中心,通過心跳檢測來保證列表中的服務節點都是可用的,從而剔除故障的服務節點。當負載均衡收到請求後會按照某種算法(隨機,輪詢和加權等)從可用的服務列表中取出一臺服務端的地址,然後進行轉發,如圖所示:

 

3. 能支持接口降級並隔離故障節點

通過封裝第三方斷路器組件實現接口降級並隔離故障。根據請求的成功數、失敗數、超時數、被拒數,其中當失敗請求的比例高於某一值時,將會觸發斷路器工作,請求將會快速失敗,不再向後發送,直接調用 fallback 函數返回,避免集羣雪崩,之後會開放部分請求進行自我檢查,如果服務恢復正常,則斷路器會關閉。斷路器工作流程如圖所示:

總結

以上就是焱融雲前端微服務實施的一些實踐,充分滿足了當前階段開發需求。我們秉承擁抱變化的態度,對整個體系結構也在持續進行改善和優化,積極推動前端架構的演進,希望能更好地支持YRCloudFile等產品對前端的業務需求。


關於焱融雲

焱融雲是一家以軟件定義存儲技術爲核心競爭力的高新技術企業,在分佈式存儲等關鍵技術上擁有自主知識產權,是容器存儲的領導者。焱融雲針對各行業業務特性,打造個性化行業解決方案,提供一站式的產品與服務。焱融雲系列產品已服務於金融、政府、製造業、互聯網等行業的衆多客戶。瞭解更多焱融科技信息,請訪問官網http://www.yanrongyun.com

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章