.NET微服务架构及API网关
生活随笔
收集整理的這篇文章主要介紹了
.NET微服务架构及API网关
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
.NET微服務(wù)架構(gòu)及API網(wǎng)關(guān) 原文:.NET微服務(wù)架構(gòu)及API網(wǎng)關(guān)
一、MSA簡介
1.1、MSA是什么
微服務(wù)架構(gòu)MSA是Microservice Architecture的簡稱,它是一種架構(gòu)模式,它提倡將單一應(yīng)用程序劃分成一組小的服務(wù),服務(wù)之間互相通訊、互相配合,為用戶提供最終價值。它與SOA之間的區(qū)別如下:| SOA實現(xiàn) | 微服務(wù)架構(gòu)實現(xiàn) | ? |
| 企業(yè)級,自頂向下開展實施 | 團隊級,自底向上開展實施 | ? |
| 粒度大:服務(wù)由多個子系統(tǒng)組成 | 粒度細:一個系統(tǒng)被拆分成多個服務(wù),且服務(wù)的定義更加清晰 | ? |
| 重ESB:企業(yè)服務(wù)總線,集中式的服務(wù)架構(gòu) | 輕網(wǎng)關(guān):無集中式總線,松散的服務(wù)架構(gòu) | ? |
| 開發(fā)過程復(fù)雜 | 易開發(fā):減少了企業(yè)ESB開發(fā)的復(fù)雜性,與敏捷開發(fā)的思想高度結(jié)合在一起 | ? |
| 單塊架構(gòu)系統(tǒng),相互依賴,部署復(fù)雜 | 服務(wù)能被獨立部署 | ? |
| ? | ? | ? |
1.2、我們的MSA框架
我們的微服務(wù)框架MsaFx.dll是個基于ServiceStack 4.0.60包裝實現(xiàn)的.NET Web Services框架,而ServiceStack本身支持通用的輕量級協(xié)議和Metadata。MsaFx與普通Web Services框架如WCF相比,主要優(yōu)勢如下: 1、??高性能:性能好、速度快。 2、??支持跨平臺運行:基于MsaFx開發(fā)出的Web Services既能夠運行在Windows環(huán)境中,又能夠運行在支持Mono的Linux環(huán)境中。 3、??支持多協(xié)議:如JSON格式的也支持XSD。 4、??更加Web化:RESTful。 5、??服務(wù)端實現(xiàn)與客戶端實現(xiàn)的完全解耦:MSA基于消息的設(shè)計,使得服務(wù)端的API改變并不會破壞現(xiàn)有的客戶端,達到服務(wù)端實現(xiàn)與客戶端實現(xiàn)完全解耦的目的。 6、??MSA API可視化說明文檔便于你調(diào)試。 7、??易學(xué):使用MSA進行開發(fā)和維護服務(wù)所需的技術(shù)和時間投入要小很多。 8、??易用:簡化了REST以及WCF SOAP風(fēng)格的Web Services的開發(fā)過程。1.3、MSA框架實現(xiàn)架構(gòu)
MSA服務(wù)端的架構(gòu)請見下圖的第一張圖,MSA的HTTP客戶端架構(gòu)請見下圖的第二張圖。MSA的內(nèi)部是建立在原生的ASP.NET IHttpHandler之上實現(xiàn)的,支持JSON、XML、JSV、HTML、Message Pack、ProtoBuf、CSV等消息格式。 MSA服務(wù)端的架構(gòu) ? MSA HTTP Client的架構(gòu)二、MSA框架的使用
1、服務(wù)托管
服務(wù)端的服務(wù)對外提供服務(wù)前,必須先要把服務(wù)端給托管起來。MSA提供了通過IIS、Self-Host等多種形式把服務(wù)端給托管起來,宿主環(huán)境可以是控制臺應(yīng)用或Windows Service或ASP.NET Web應(yīng)用或ASP.NET MVC應(yīng)用。提供的MSA Demo的宿主環(huán)境用的是ASP.NET Web應(yīng)用。2、 路由
A、MSA自身提供的默認路由是:/[xml|json|html|jsv|csv]/[reply|oneway]/[Request DTO名] [(?query參數(shù)1={值}&query參數(shù)2={值}&......&query參數(shù)n={值})]。 B、創(chuàng)建自定義路由,其創(chuàng)建方法是:使用RouteAttribute或在宿主環(huán)境中配置。提供的MSA Demo采用的是在宿主環(huán)境中配置路由這種方式來創(chuàng)建自定義路由。3、如何驗證請求參數(shù)的合法性
如果你需要在提交請求參數(shù)前,驗證請求參數(shù)是否必填或是否合法,那么驗證邏輯必須寫在繼承自MSA的AbstractValidator<TRequest>的類里(參考例子請見MSA Demo的OrderValidator.cs),然后在宿主環(huán)境中進行開啟驗證的配置: 1 Plugins.Add(new ValidationFeature()); 2 container.RegisterValidator(typeof(OrderValidator));4、服務(wù)
創(chuàng)建MSA服務(wù)時,必須繼承來自MSA的Service類。5、MSA內(nèi)置的客戶端
5.1、MSA內(nèi)置了一些便捷訪問的客戶端,這些對象都實現(xiàn)了IServiceClient接口,其中支持REST的客戶端還都實現(xiàn)了IRestClient接口。這些客戶端對象包括:JsonServiceClient、JsvServiceClient、XmlServiceClient、MsgPackServiceClient、ProtoBufServiceClient、Soap11ServiceClient、Soap12ServiceClient等。從名稱可以看出,這幾種不同之處在于支持的序列化和反序列化格式不同。因為它們實現(xiàn)的是相同的接口,所以它們的用法相同,也可以相互替換。 MSA Demo中用到了JsonServiceClient和ProtoBufServiceClient這兩種客戶端,其中當(dāng)用到ProtoBufServiceClient客戶端時,你還需要完成如下工作: a、? 除了需要引用MSA.dll外,還需要引用protobuf-net.dll。 b、? 需要在宿主環(huán)境中進行如下配置: 1 Plugins.Add(new ProtoBufFormat());c、必須分別給Request DTO對象和Response DTO對象的各屬性標(biāo)上[DataMember(Order = {0})]特性,具體寫法請見MSA Demo的ProductRequestDTO.cs和ProductResponseDTO.cs。
? 5.2、MSA內(nèi)置的客戶端提供Get、Send、Post、Put、Delete等方法。查詢數(shù)據(jù)一般用Get方法,新增操作一般用Post方法,更新操作一般用Put方法,刪除操作一般用Delete方法。 這些方法都有重載。 以下是Get方法的其中一個簽名:? 1 TResponse Get<TResponse>(IReturn<TResponse> requestDto);6、MSA API可視化說明文檔自動生成的實現(xiàn)
在宿主環(huán)境中加如下配置: 1 Plugins.Add(new SwaggerFeature());如果需要在MSA API可視化說明文檔中能夠看到各請求參數(shù)、響應(yīng)的含義說明,那么需要為Request DTO、Response DTO對象的各屬性標(biāo)上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 = "訂購的產(chǎn)品列表", IsRequired = false)] 9 public List<OrderItem> OrderItemList { get; set; } 10 } 運行結(jié)果如下圖所示: 在MSA API可視化說明文檔中顯示各請求參數(shù)、響應(yīng)的含義說明7、運行結(jié)果???????
先運行托管應(yīng)用(如MSA Demo中ServiceHost項目),出現(xiàn)下圖所示的Metadata頁。然后再運行客戶端來調(diào)用微服務(wù);也可通過瀏覽器查看數(shù)據(jù),網(wǎng)址輸入格式如:?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個網(wǎng)址格式規(guī)則就是MSA Demo中在宿主環(huán)境中所配的自定義路由規(guī)則,第2個網(wǎng)址格式規(guī)則就是由MSA提供的默認路由規(guī)則。 ?????? 單擊下圖所示Metadata頁中的【MSA API UI】后,進入下圖所示的MSA API可視化說明文檔界面,開發(fā)人員可以通過這份由MSA自動生成的說明文檔進行調(diào)試,十分方便。 Metadata頁 ?MSA API可視化說明文檔界面三、微服務(wù)治理
在我們自主開發(fā)的框架管理系統(tǒng)中,進行接口注冊,請見下圖。其中,規(guī)定內(nèi)部服務(wù)訪問名的命名規(guī)范是:/{***Service}/方法名,如/OrderService/CreateOrder;規(guī)定外部服務(wù)訪問名OpenApiName的命名規(guī)范是:{各產(chǎn)品線的縮寫英文名}方法名,如FltCreateOrder,其中Flt表示國內(nèi)機票業(yè)務(wù)的縮寫英文名。 MSA接口注冊頁四、微服務(wù)網(wǎng)關(guān)API Gateway
4.1、API Gateway的簡介
API Gateway風(fēng)格的核心理念是使用一個輕量級的消息網(wǎng)關(guān)作為所有客戶端的主入口,并且在 API Gateway層面上實現(xiàn)通用的非功能性需求。如下圖所示:所有的服務(wù)通過API 網(wǎng)關(guān)來暴露,這是所有客戶端訪問的唯一入口;如果一個服務(wù)要訪問另一個服務(wù),也要通過這個網(wǎng)關(guān)。? 所有服務(wù)通過一個API網(wǎng)關(guān)來暴露 一旦API網(wǎng)關(guān)允許客戶端消費一個受管理的API,那么我們就可以以受管理的API形式使用它來暴露這個微服務(wù)所實現(xiàn)的業(yè)務(wù)邏輯。A posted on 2019-02-13 14:57 NET未來之路 閱讀(...) 評論(...) 編輯 收藏轉(zhuǎn)載于:https://www.cnblogs.com/lonelyxmas/p/10369868.html
總結(jié)
以上是生活随笔為你收集整理的.NET微服务架构及API网关的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 线程切换是如何给 CPU 洗脑的?
- 下一篇: 为什么80%的码农都做不了架构师?