在现代软件开发中,微服务架构已经成为构建可扩展、灵活和易于维护系统的一种流行方式。本文将介绍一个基于微服务架构的课程管理系统,该系统包括用户管理、课程管理、课程购物篮以及学生课程购买等功能。
用户微服务负责用户的增删改查(CRUD)操作。在之前的Code Project博客中,详细介绍了如何使用CQRS原则、中介者、仓储和工作单元设计模式实现用户管理解决方案。底层数据库使用的是SQL Server,并且采用了Dapper微型ORM进行数据库操作。
课程微服务同样提供课程管理的CRUD操作,并且遵循与用户API解决方案相同的架构,只是它允许添加、更新、删除和加载用户可以购买的课程信息。
课程购物篮微服务暂时将用户添加到购物篮中的课程存储在Redis数据库中,这些课程是用户打算购买的。
一旦用户执行购买课程的操作,用户课程就会从Redis移动到RabbitMQ队列中。学生课程微服务订阅了RabbitMQ队列,接收用户购买的课程,并将它们保存在数据库中。
由于学生课程微服务需要与用户和课程微服务通信,一种方法是手动调用这些服务,但这无疑会在服务之间创建耦合。另一种解决方案是发布-订阅模式,其中一个服务将数据发布到某个队列,所有订阅了该队列的服务在数据到达时会被通知,然后按照配置的方式消费数据。RabbitMQ是一个著名的消息代理,在本解决方案中使用了这个包。
API网关为所有微服务提供了一站式服务。不需要直接调用微服务,而是可以在配置文件中配置下游和上游API,例如,使用Ocelot API网关包。API网关有很多好处,例如,保持微服务的私有性,只暴露API网关,只在API网关上实现认证逻辑而不是在每个微服务中复制它,缓存,处理限流等。
对于课程管理解决方案,使用Redis包在内存中数据源存储结账课程,这是一个快速、可靠且可扩展的临时数据存储解决方案。
对于课程管理应用程序,前端使用Angular 11实现,通过API网关调用所有API。有一个用户和课程管理页面,以及课程结账和购买课程页面。由于这不是一个Angular课程,不会看到很多伟大的架构或设计实现。可以在这里阅读与Angular相关的文章。
现在已经了解了解决方案的高层架构和业务层面,让简要了解解决方案中的项目。从GitHub克隆StudentCourseManagement解决方案。
用户和课程项目是简单的项目,用于添加、更新、删除和加载用户和课程。有两个项目文件夹,db和src,其中db包含数据库创建脚本和Docker文件。src文件夹包含四个项目:
写了非常详细的文章来解释在用户和课程管理项目中实现的清晰架构。克隆仓库并在这里找到学习路径。
课程购物篮暂时存储选定的用户及其选定的课程在Redis中。
注册队列是一个类库项目,使用RabbitMQ包实现消息队列逻辑。正如之前学到的,为了保持微服务的松耦合,使用发布-订阅模式是一个好主意,其中一个微服务可以订阅队列,其他微服务发布数据。课程购物篮项目使用这个类库发布用户及其选定的课程。将在下一个项目中看到的Student Course项目订阅队列,并将该信息保存在数据库中。
这是课程管理层次结构中的最后一个项目,它不断在RabbitMQ队列中查找数据,并在收到任何数据时触发Save user courses API。可以查看StudentCourse.Application项目中的EventBusRabbitMQConsumer类,了解数据接收事件是如何触发并调用AddStudentCourseCommand来保存信息的。
API网关项目使用Ocelot包为所有微服务提供统一入口。查看ocelot.json文件,定义了上游和下游API。SCM.Web与上游API交互,而不是直接与微服务交互。API网关的基URL是http://localhost:130,因此所有微服务都通过http://localhost:130访问,例如,http://localhost:130/Course,http://localhost:130/User,http://localhost:130/CoursesBasket等。