之前有小伙伴在评论区留言说如何集成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的微服务电商系统(十五)——集中式接口文档实现
十六、通过Dapr实现一个简单的基于.net的微服务电商系统(十六)——dapr+sentinel中间件实现服务保护
十七、通过Dapr实现一个简单的基于.net的微服务电商系统(十七)——服务保护之动态配置与热重载
十八、通过Dapr实现一个简单的基于.net的微服务电商系统(十八)——服务保护之多级缓存
十九、通过Dapr实现一个简单的基于.net的微服务电商系统(十九)——分布式事务之Saga模式
附录:(如果你觉得对你有用,请给个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"表示该项目用于代码编译器分析。
"..\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。和我们在静态页面上调接口是一个模式。