通過 Dapr 實現一個簡單的基於- net 的微服務電商系統——集中式接口文檔實現

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

附錄:(如果你覺得對你有用,請給個 star)
一、電商 Demo 地址:https://github.com/sd797994/Oxygen-Dapr.EshopSample

二、通訊框架地址:https://github.com/sd797994/Oxygen-Dapr

  源碼生成器(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。和我們在靜態頁面上調接口是一個模式。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/xxTyyxve8iK1aaaxuXvK1Q