微服務架構 MSA 是 Microservice Architect 的簡稱,它是一種架構模式,它提倡將單一應用程序劃分紅一組小的服務,服務之間互相通信、互相配合,爲用戶提供最終價值。它與 SOA 之間的區別以下:html
咱們的微服務框架 MsaFx.dll 是個基於 ServiceStack 4.0.60 包裝實現的.NET Web Services 框架,而 ServiceStack 自己支持通用的輕量級協議和 Metadata。MsaFx 與普通 Web Services 框架如 WCF 相比,主要優點以下:java
MSA 服務端的架構請見下圖的第一張圖,MSA 的 HTTP 客戶端架構請見下圖的第二張圖。MSA 的內部是創建在原生的 ASP.NET IHttpHandler 之上實現的,支持 JSON、XML、JSV、HTML、Message Pack、ProtoBuf、CSV 等消息格式。git
MSA 服務端的架構github
MSA HTTP Client 的架構json
服務端的服務對外提供服務前,必須先要把服務端給託管起來。MSA 提供了經過 IIS、Self-Host 等多種形式把服務端給託管起來,宿主環境能夠是控制檯應用或 Windows Service 或 ASP.NET Web 應用或 ASP.NET MVC 應用。提供的 MSA Demo 的宿主環境用的是 ASP.NET Web 應用。瀏覽器
A、MSA 自身提供的默認路由是:安全
/[xml|json|html|jsv|csv]/[reply|oneway]/[Request DTO 名] [(?query 參數 1={值}&query 參數 2={值}&......&query 參數 n={值})]。
B、建立自定義路由,其建立方法是:使用 RouteAttribute 或在宿主環境中配置。提供的 MSA Demo 採用的是在宿主環境中配置路由這種方式來建立自定義路由。網絡
若是你須要在提交請求參數前,驗證請求參數是否必填或是否合法,那麼驗證邏輯必須寫在繼承自 MSA 的 AbstractValidator的類裏(參考例子請見 MSA Demo 的 OrderValidator.cs),而後在宿主環境中進行開啓驗證的配置:架構
Plugins.Add(new ValidationFeature()); container.RegisterValidator(typeof(OrderValidator));
建立 MSA 服務時,必須繼承來自 MSA 的 Service 類。併發
5.1、MSA 內置了一些便捷訪問的客戶端,這些對象都實現了 IServiceClient 接口,其中支持 REST 的客戶端還都實現了 IRestClient 接口。
這些客戶端對象包括:JsonServiceClient、JsvServiceClient、XmlServiceClient、MsgPackServiceClient、ProtoBufServiceClient、Soap11ServiceClient、Soap12ServiceClient 等。
從名稱能夠看出,這幾種不一樣之處在於支持的序列化和反序列化格式不一樣。由於它們實現的是相同的接口,因此它們的用法相同,也能夠相互替換。
MSA Demo 中用到了 JsonServiceClient 和 ProtoBufServiceClient 這兩種客戶端,其中當用到 ProtoBufServiceClient 客戶端時,你還須要完成以下工做:
a、除了須要引用 MSA.dll 外,還須要引用 protobuf-net.dll。
b、須要在宿主環境中進行以下配置:
Plugins.Add(new ProtoBufFormat());
c、必須分別給 Request DTO 對象和 Response DTO 對象的各屬性標上 [DataMember(Order = {0})] 特性,具體寫法請見 MSA Demo 的 ProductRequestDTO.cs 和 ProductResponseDTO.cs。
5.2、MSA 內置的客戶端提供 Get、Send、Post、Put、Delete 等方法。查詢數據通常用 Get 方法,新增操做通常用 Post 方法,更新操做通常用 Put 方法,刪除操做通常用 Delete 方法。這些方法都有重載。
如下是 Get 方法的其中一個簽名:
TResponse Get<TResponse>(IReturn<TResponse> requestDto);
在宿主環境中加以下配置:
Plugins.Add(new SwaggerFeature());
若是須要在 MSA API 可視化說明文檔中可以看到各請求參數、響應的含義說明,那麼須要爲 Request DTO、Response DTO 對象的各屬性標上 ApiMember,代碼參考以下:
1 public class OrderRequest : IReturn<OrderResponse> 2 { 3 [ApiMember(Name = "Id", Description = "訂單 ID 號", IsRequired = false)] 4 public int Id { get; set; } 5 [ApiMember(Name = "CustomerName", Description = "客戶名", IsRequired = false)] 6 public string CustomerName { get; set; } 7 //...... 8 [ApiMember(Name = "OrderItemList", Description = "訂購的產品列表", IsRequired = false)] 9 public List<OrderItem> OrderItemList { get; set; } 10 }
運行結果以下圖所示:
在 MSA API 可視化說明文檔中顯示各請求參數、響應的含義說明
先運行託管應用(如 MSA Demo 中 ServiceHost 項目),出現下圖所示的 Metadata 頁。而後再運行客戶端來調用微服務;也可經過瀏覽器查看數據,網址輸入格式如:
http://localhost:34833/orders/1.html?CustomerName= 客戶 _1&IsTakeAway=true&StatusCode=1&CreatedDate=2017-08-21 10:58:48.230
或:
http://localhost:34833/html/reply/GetOrderRequest?Id=1&CustomerName= 客戶 _1&IsTakeAway=true&StatusCode=1&CreatedDate=2017-08-21 10:58:48.230
其中,第 1 個網址格式規則就是 MSA Demo 中在宿主環境中所配的自定義路由規則,第 2 個網址格式規則就是由 MSA 提供的默認路由規則。
單擊下圖所示 Metadata 頁中的【MSA API UI】後,進入下圖所示的 MSA API 可視化說明文檔界面,開發人員能夠經過這份由 MSA 自動生成的說明文檔進行調試,十分方便。
Metadata 頁
MSA API 可視化說明文檔界面
在咱們自主開發的框架管理系統中,進行接口註冊,請見下圖。其中,規定內部服務訪問名的命名規範是:/{***Service}/ 方法名,如 /OrderService/CreateOrder;規定外部服務訪問名 OpenApiName 的命名規範是:{各產品線的縮寫英文名}方法名,如 FltCreateOrder,其中 Flt 表示國內機票業務的縮寫英文名。
MSA 接口註冊頁
API Gateway 風格的核心理念是使用一個輕量級的消息網關做爲全部客戶端的主入口,而且在 API Gateway 層面上實現通用的非功能性需求。以下圖所示:全部的服務經過 API 網關來暴露,這是全部客戶端訪問的惟一入口;若是一個服務要訪問另外一個服務,也要經過這個網關。
全部服務經過一個 API 網關來暴露
一旦 API 網關容許客戶端消費一個受管理的 API,那麼咱們就能夠以受管理的 API 形式使用它來暴露這個微服務所實現的業務邏輯。API 網關以 NIO、IOCP 來鏈接內部受管理的 API,以實現 API 網關的高併發。
API Gateway 主要實現如下功能:
在使用 API Gateway 以前,須要先配置網關參數。網關參數的配置是在自主開發的 API 網關後臺管理子系統中進行:
在自主開發的 API 網關後臺管理子系統中配置網關參數