之前有小夥伴在評論區留言說如何集成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。和我們在靜態頁面上調接口是一個模式。