通過Dapr實現一個簡單的基於.net的微服務電商系統(十五)——集中式介面文檔實現
- 2021 年 5 月 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,重新拉取並生成後即可通過 //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。和我們在靜態頁面上調介面是一個模式。