DevStore - 基于ASP.NET 6构建的微服务电子商务参考应用
由desenvolvedor.io提供支持的真实世界参考应用 ,实现了最常见和最常用的技术,旨在与技术社区分享使用.NET开发完整复杂应用程序的最佳方式
本项目受EShopOnContainers启发,但真正的动机是以"我们的方式"构建它。
EShopOnContainers是一个很棒的项目,但代码中存在一些"坏味道"。与DevStore相比,我们发现开始学习/使用EShopOnContainers比较困难。我们喜欢将DevStore视为一个简化(但并不简单)的版本,并在代码和小细节方面更加用心。我们还只专注于使用ASP.NET的Web架构。
给个星星! :star:
如果你喜欢这个项目或者DevStore对你有帮助,请给我们一个星星 ;)
想学习构建这样的应用所需的一切吗? :mortar_board:
查看desenvolvedor.io的在线课程(仅提供葡萄牙语)
实现的技术/组件
-
.NET 6
- ASP.NET MVC Core
- ASP.NET WebApi
- ASP.NET Minimal API
- ASP.NET Identity Core
- 刷新令牌
- 带旋转公钥/私钥的JWT
- GRPC
- 后台服务
- Entity Framework Core 6
-
组件/服务
- RabbitMQ
- EasyNetQ
- Refit
- Polly
- Bogus
- Dapper
- FluentValidator
- MediatR
- 支持JWT的Swagger UI
- NetDevPack
- NetDevPack.Identity
- NetDevPack.Security.JWT
-
托管
- IIS
- NGINX
- Docker(带compose)
架构:
完整的架构实现了最重要和常用的关注点,如:
- 六边形架构
- 整洁代码
- 整洁架构
- DDD - 领域驱动设计(层和领域模型模式)
- 领域事件
- 领域通知
- 领域验证
- CQRS(即时一致性)
- 重试模式
- 断路器
- 工作单元
- 仓储
- 规约模式
- API网关 / BFF
架构概览
整个应用程序基于一个包含7个API和一个Web应用程序(MVC)的唯一解决方案
这是一个参考应用程序,每个微服务都有自己的数据库,代表一个有界上下文(DDD概念)。 有一个BFF / API网关来管理购物篮/订单/支付请求和响应的数据结构。
入门
你可以在任何操作系统上运行DevStore项目。确保你的环境中已安装Docker。(获取Docker安装)
克隆DevStore仓库并导航到**/Docker**文件夹,然后:
如果你只想在Docker环境中运行DevStore应用程序:
docker-compose up
如果你想构建本地镜像并在Docker环境中运行DevStore应用程序:
这个compose将为每个API服务提供一个数据库容器。
docker-compose -f docker-compose-local.yml up --build
如果你更喜欢节省机器资源,请使用轻量级本地compose:
这个compose将为所有API服务提供一个数据库容器。
docker-compose -f docker-compose-local-light.yml up --build
如果你想在VS/VS Code中本地运行:
你需要:
- Docker
- SQL实例(或容器)
- RabbitMQ
这样你就可以编辑Docker compose来只运行数据库和队列依赖,节省时间。
如果你想要Visual Studio的F5和调试体验:
- 你至少需要Visual Studio 2022和.NET 6。
- 可以从https://dot.net/core下载最新的SDK和工具
- 设置解决方案以启动多个项目并按F5
如果你想要Visual Studio Code体验:
- 在根目录(解决方案文件)打开VS Code
- 在VS Code调试部分创建一个新的launch.json,并使用以下配置来设置"启动所有项目"选项
{
"version": "0.2.0",
"configurations": [
{
"name": "DevStore MVC WebApp",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
"program": "${workspaceFolder}/src/web/DevStore.WebApp.MVC/bin/Debug/net6.0/DevStore.WebApp.MVC.dll",
"args": [],
"cwd": "${workspaceFolder}/src/web/DevStore.WebApp.MVC",
"console": "internalConsole",
"stopAtEntry": false
},
{
"name": "DevStore Billing API",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
"program": "${workspaceFolder}/src/services/DevStore.Billing.API/bin/Debug/net6.0/DevStore.Billing.API.dll",
"args": [],
"cwd": "${workspaceFolder}/src/services/DevStore.Billing.API",
"console": "internalConsole",
"stopAtEntry": false
},
{
"name": "DevStore Catalog API",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
"program": "${workspaceFolder}/src/services/DevStore.Catalog.API/bin/Debug/net6.0/DevStore.Catalog.API.dll",
"args": [],
"cwd": "${workspaceFolder}/src/services/DevStore.Catalog.API",
"console": "internalConsole",
"stopAtEntry": false
},
{
"name": "DevStore Customers API",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
"program": "${workspaceFolder}/src/services/DevStore.Customers.API/bin/Debug/net6.0/DevStore.Customers.API.dll",
"args": [],
"cwd": "${workspaceFolder}/src/services/DevStore.Customers.API",
"console": "internalConsole",
"stopAtEntry": false
},
{
"name": "DevStore Identity API",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
"program": "${workspaceFolder}/src/services/DevStore.Identity.API/bin/Debug/net6.0/DevStore.Identity.API.dll",
"args": [],
"cwd": "${workspaceFolder}/src/services/DevStore.Identity.API",
"console": "internalConsole",
"stopAtEntry": false
},
{
"name": "DevStore Orders API",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
"program": "${workspaceFolder}/src/services/DevStore.Orders.API/bin/Debug/net6.0/DevStore.Orders.API.dll",
"args": [],
"cwd": "${workspaceFolder}/src/services/DevStore.Orders.API",
"console": "internalConsole",
"stopAtEntry": false
},
{
"name": "DevStore ShoppingCart API",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
"program": "${workspaceFolder}/src/services/DevStore.ShoppingCart.API/bin/Debug/net6.0/DevStore.ShoppingCart.API.dll",
"args": [],
"cwd": "${workspaceFolder}/src/services/DevStore.ShoppingCart.API",
"console": "internalConsole",
"stopAtEntry": false
},
{
"name": "DevStore BFF Checkout",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
"program": "${workspaceFolder}/src/api-gateways/DevStore.Bff.Checkout/bin/Debug/net6.0/DevStore.Bff.Checkout.dll",
"args": [],
"cwd": "${workspaceFolder}/src/api-gateways/DevStore.Bff.Checkout",
"console": "internalConsole",
"stopAtEntry": false
}
],
"compounds": [
{
"name": "启动所有项目",
"configurations": [
"DevStore MVC WebApp",
"DevStore Billing API",
"DevStore Catalog API",
"DevStore Customers API",
"DevStore Identity API",
"DevStore Orders API",
"DevStore ShoppingCart API",
"DevStore BFF Checkout"
],
"stopAll": true
}
]
}
免责声明
- 这不是新应用程序的架构模板或引导模型
- 所有实现都是为了真实世界而制作的,但目标是分享知识
- 你可能不需要许多包含的实现,尽量避免过度工程
拉取请求
提出一个问题,让我们讨论!不要提交未讨论或未批准功能的PR。
如果你想帮助我们,选择一个已批准的问题并实现它。
我们在线上
查看在DevStore官方实例上运行的项目
关于
DevStore由desenvolvedor.io❤团队自豪地开发,采用MIT许可证。