通過Dapr實現一個簡單的基於.net的微服務電商系統(十五)——集中式介面文件實現

a1010發表於2021-05-28

  之前有小夥伴在評論區留言說如何整合swagger,最開始沒有想透給了對方一個似是而非的回答。實際上後來下來想了一下,用.NET5 提供的Source Generator其實可以很方便的實現介面整合。今天就分享一下集中式介面文件的方案

目錄:
一、通過Dapr實現一個簡單的基於.net的微服務電商系統

二、通過Dapr實現一個簡單的基於.net的微服務電商系統(二)——通訊框架講解

三、通過Dapr實現一個簡單的基於.net的微服務電商系統(三)——一步一步教你如何擼Dapr

四、通過Dapr實現一個簡單的基於.net的微服務電商系統(四)——一步一步教你如何擼Dapr之訂閱釋出

五、通過Dapr實現一個簡單的基於.net的微服務電商系統(五)——一步一步教你如何擼Dapr之狀態管理

六、通過Dapr實現一個簡單的基於.net的微服務電商系統(六)——一步一步教你如何擼Dapr之Actor服務

七、通過Dapr實現一個簡單的基於.net的微服務電商系統(七)——一步一步教你如何擼Dapr之服務限流

八、通過Dapr實現一個簡單的基於.net的微服務電商系統(八)——一步一步教你如何擼Dapr之鏈路追蹤

九、通過Dapr實現一個簡單的基於.net的微服務電商系統(九)——一步一步教你如何擼Dapr之OAuth2授權 && 百度版Oauth2

十、通過Dapr實現一個簡單的基於.net的微服務電商系統(十)——一步一步教你如何擼Dapr之繫結

十一、通過Dapr實現一個簡單的基於.net的微服務電商系統(十一)——一步一步教你如何擼Dapr之自動擴/縮容

十二、通過Dapr實現一個簡單的基於.net的微服務電商系統(十二)——istio+dapr構建多執行時服務網格

十三、通過Dapr實現一個簡單的基於.net的微服務電商系統(十三)——istio+dapr構建多執行時服務網格之生產環境部署

十四、通過Dapr實現一個簡單的基於.net的微服務電商系統(十四)——開發環境容器除錯小技巧

十五、通過Dapr實現一個簡單的基於.net的微服務電商系統(十五)——集中式介面文件實現
附錄:(如果你覺得對你有用,請給個star)
一、電商Demo地址

二、通訊框架地址

  原始碼生成器(Source Generator)是 C# Roslyn 程式碼分析器的一個新特性。與.net5同一時間釋出了GA版本。開發者可以使用編譯器生成的後設資料檢查使用者程式碼,並生成附加的原始檔,與程式的其他部分一起編譯。通過這個特性我們可以很容易的在編譯階段靜態織入各種程式碼實現相應功能。所以集中式介面文件實現思路就是在編譯階段通過反射獲取到我們的remote/iapplicationservice下的介面型別,通過解析型別和方法生成對應的controller/action程式碼並織入到程式程式中。這樣生成後的應用在啟動時swagger元件即可檢查到對應的控制器,從而生成相應文件。首先來看看成品:

 

  相關程式碼已經更新至gthub,重新拉取並生成後即可通過 http://swagger.dapreshop.com:30882/swagger/index.html 訪問,下面我們講講怎麼實現的。首先我們需要通過vs2019建立一個空的webapi應用,並勾選“啟用OpenApi支援”,這樣建立的模板即可自帶swagger。接著我們建立一個.net的類庫專案,並讓webapi引用它。同時注意webapi.csproj需要申明OutputItemType="Analyzer" ReferenceOutputAssembly="false"表示該專案用於程式碼編譯器分析。

    <ProjectReference Include="..\ApiSourceGenerator\ApiSourceGenerator.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false" />

  接著類庫專案需要引入nuget:Microsoft.CodeAnalysis.CSharp。這個包就是Generator的本體了。然後我們建立對應的Generator實現類,並繼承ISourceGenerator介面。通過這個介面的兩個方法我們即可實現程式碼的分析+織入。在Execute方法裡,我們從IApplicationService程式集反射獲取我們的所有介面和方法,並通過字串的形式生成對應的程式碼檔案。最後通過GeneratorExecutionContext的AddSource注入檔案並隨其他程式碼一同編譯。具體的細節大家有興趣的可以看看Services\ApiDocument下的程式碼,實現相對比較簡單,這裡就不再贅述。api文件生成後呼叫鏈也比較簡單,其實就是充當了一個反向代理。通過api文件生成的action發起http請求扔給apigateway。和我們在靜態頁面上調介面是一個模式。

相關文章