65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP.NET Core 微服务结合 Angular 11 前端

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.33/5 (2投票s)

2021 年 8 月 3 日

CPOL

5分钟阅读

viewsIcon

13381

ASP.NET Core 微服务结合 Angular 11 前端、API 网关、Redis 和 SQL Server

让我们开始

如引言中所述,我们有以下四个 API

  • 用户微服务:此微服务提供用户 CRUD 操作,即加载添加更新删除用户。在我之前发表在 Code Project 等平台上的其他博客中,我详细描述了如何使用 CQRS、Mediator、Repository 和 Unit of Work 设计模式来实现用户管理解决方案。底层数据库是 SQL Server,我们使用 Dapper 微型 ORM 进行数据库操作。
  • 课程微服务:此微服务具有课程管理 CRUD 操作,并遵循与用户 API 解决方案相同的架构,除了我们可以添加、更新、删除和加载用户可以购买的课程信息。
  • 课程购物车微服务:此微服务将用户添加到其购物车并打算购买的课程暂时存储在 Redis 数据库中。
  • 学生课程微服务:一旦用户执行购买课程操作,用户的课程将从 Redis 移至 RabbitMQ 队列。此微服务订阅 RabbitMQ 队列,接收用户购买的课程并将其保存在数据库中。

服务间的通信

由于学生课程微服务需要与用户和课程微服务通信,一种方法是手动调用这些服务,但这肯定会造成服务之间的耦合。另一种解决方案是发布者-订阅者模式,其中一个服务将数据发布到某个队列,并且订阅了该队列的所有服务都会收到数据到达的通知,以便按照配置的方式进行消耗。 RabbitMQ 包是一个著名的消息代理,我们在此解决方案中使用它。

API 网关

API 网关为所有微服务提供了一个一站式商店。我们可以通过配置文件配置下游和上游 API,而不是直接调用微服务,例如,使用 Ocelot API 网关 包。API 网关有很多好处,例如,保持微服务的私有性,只暴露 API 网关,仅在 API 网关实现身份验证逻辑而不是在每个微服务中复制它,缓存,处理限流等。

内存数据存储

对于课程管理解决方案,我们使用 Redis 包将已签出的课程存储在内存数据源中,这是一个快速、可靠且可扩展的临时数据存储解决方案。

前端应用程序

对于课程管理应用程序,前端是用 Angular 11 实现的,我们通过 API 网关调用所有 API。有用户和课程管理页面,以及课程结账和购买课程页面。由于这不是 Angular 课程,您不会看到很多出色的架构或设计实现。在此处 阅读 Angular 相关文章

所有项目都位于 Docker 容器中,使用它们各自的 Docker 镜像,例如,ASP.NET Core Runtime,Node,Redis 和 RabbitMQ。

让我们来了解课程管理解决方案

现在我们了解了解决方案的高层架构和业务级别,让我们简要了解一下解决方案中的项目。从 Github 克隆 StudentCourseManagement 解决方案。

用户与课程管理

用户和课程项目是用于添加、更新、删除和加载用户和课程的简单项目。有两个项目文件夹,dbsrc,其中 db 包含数据库创建脚本和 Docker 文件。src 文件夹包含四个项目

  1. 用户与课程 API:包含通过 Mediator 与应用程序项目交互的 API,应用程序项目包含业务逻辑。
  2. 应用程序:应用程序项目实现 CQRS 原则,即查询用于加载数据,命令用于其余操作。
  3. 领域:包含实体类、存储库和工作单元接口。
  4. 持久化:包含用于执行数据库操作的存储库和工作单元实现。

我撰写了非常详细的文章来解释在用户和课程管理项目中实现的干净架构。克隆 仓库 并在此处 查找学习路径

编译并运行解决方案后,请访问 https:///swagger 来测试用户 API。

编译并运行解决方案后,请访问 https://:90/swagger 来测试课程 API。

课程购物车

课程购物车将选定的用户及其选定的课程暂时存储在 Redis 中。

注册队列

注册队列是一个类库项目,它使用 RabbitMQ 包实现消息队列逻辑。正如我们之前所学,为了保持微服务松耦合,使用发布者-订阅者模式是一个好主意,其中一个微服务可以订阅另一个微服务发布数据的队列。课程购物车项目使用这个类库来发布用户及其选定的课程。接下来我们将要查看的学生课程项目订阅该队列并将其信息保存在数据库中。

学生课程

这是课程管理层级中的最后一个项目,它会持续监控 RabbitMQ 队列中的数据,并在收到任何数据时触发“保存用户课程”API。您可以在StudentCourse.Application项目中的EventBusRabbitMQConsumer类中查看数据接收事件如何触发并调用AddStudentCourseCommand来保存信息。

编译并运行解决方案后,请访问 https://:100/swagger 来测试学生课程 API。

API 网关

API 网关项目使用 Ocelot 包为所有微服务提供统一入口。检查 ocelot.json 文件,其中我们定义了上游和下游 API。SCM.Web 与上游 API 交互,而不是直接与微服务交互。API 网关的基础 URL 是 https://:130,因此所有微服务都通过 https://:130 访问,例如,https://:130/Coursehttps://:130/Userhttps://:130/CoursesBasket 等。

SCM(学生课程管理)Web

这是一个在 Angular 11 中开发的**前端**应用程序,用户可以在其中对用户和课程执行 CRUD 操作,将用户选择的课程添加到购物车(篮子)中,并在购物车中购买课程。请记住,这不是最好的 Angular 架构,也不是生产就绪的应用程序,您可以查看干净架构解决方案,它确实有一个干净的 Angular 项目,还通过 Swagger 生成的 HTTP 客户端和针对 API(控制器操作)的服务支持快速开发。

编译并运行解决方案后,请访问 https://:150 来浏览前端应用程序。

历史

  • 2021 年 8 月 3 日:初始版本
ASP.NET Core 微服务结合 Angular 11 前端 - CodeProject - 代码之家
© . All rights reserved.