eShopOnContainers 知多少[4]:Catalog microservice

引言

Catalog microservice(目录微服务)维护着所有产品信息,包括库存、价格。所以该微服务的核心业务为:

  1. 产品信息的维护
  2. 库存的更新
  3. 价格的维护

架构模式

如上图所示,本微服务采用简单的数据驱动的CRUD微服务架构,来执行产品信息的创建、读取、更新和删除(CRUD)操作。 这种类型的服务在单个 ASP.NET Core Web API 项目中即可实现所有功能,该项目包括数据模型类、业务逻辑类及其数据访问类。其项目结构如下:

核心技术选型:

  1. ASP.NET Core Web API
  2. Entity Framework Core
  3. SQL Server
  4. Swashbuckle(可选)
  5. Autofac
  6. Eventbus
  7. Polly 实体建模 该微服务的核心领域实体是商品,其类图如下:

对于实体这一块,有两个小知识点需要说明一下:

  1. 进行数据库字段映射时,主键都使用了ForSqlServerUseSequenceHiLo指定使用HI-LO高低位序列进行主键生成。
  2. 使用NoTracking提升查询速度 在CatalogController的构造方法中,明确指定以下代码来进行查询优化,这一点也是我们值得学习的地方。((DbContext)context).ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
  3. 在进行种子数据的预置时,使用了Polly开启了Retry机制。
private Policy CreatePolicy( ILogger<CatalogContextSeed> logger, string prefix,int retries = 3)
{
    return Policy.Handle<SqlException>().
        WaitAndRetryAsync(
            retryCount: retries,
            sleepDurationProvider: retry => TimeSpan.FromSeconds(5),
            onRetry: (exception, timeSpan, retry, ctx) =>
            {
                logger.LogTrace($"[{prefix}] Exception {exception.GetType().Name} with message ${exception.Message} detected on attempt {retry} of {retries}");
            }
        );
}
public async Task SeedAsync(CatalogContext context,IHostingEnvironment env,IOptions<CatalogSettings> settings,ILogger<CatalogContextSeed> logger)
{
    var policy = CreatePolicy(logger, nameof(CatalogContextSeed));

    await policy.ExecuteAsync(async () =>
    {
        //...
    });       
}

数据库表结构

你肯定会好奇为什么会多了一张IntegrationEventLog表,这里先按住不表。

最后

如果eShopOnContainers采用的是单体式应用架构而非微服务架构,那么以上业务逻辑的实现并不复杂,使用简单的CRUD再辅以ACID事务就能很好的完成业务需求。本文的介绍也就可以到此为止了。

然而将其抽取出来成为独立的基础微服务,那么我们要考虑的问题就多了。比如:

  1. 修改产品价格时,需要同步更新购物车中保存的产品信息的价格。
  2. 下订单时,需要验证当前商品库存是否充足,进行锁库抢占,以避免库存不足导致的订单无效。

而这一切我们都不能再享受单体应用中直接使用ACID事务的便利了。因为在微服务应用里,产品表和购物篮表被各自的微服务所占有。任何微服务不应该在自己的事务中包含其他微服务的表或存储,即使是直接查询也是不可以的。目录微服务不能直接更新购物篮表,因为购物篮表被购物篮微服务占有。要更新购物篮微服务,产品微服务应该使用基于异步通信,如集成事件(消息和基于事件的通信)来实现最终一致性。

那下一节我们就来详细阐述eShopOnContainers是如何通过事件机制完成最终一致性的。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

关于Fuzz工具的那些事儿

前段时间一直在研究fuzz工具,这里就写篇文章总结一下下。 在安全测试中,模糊测试(fuzz testing)是一种介于完全的手工渗透测试与完全的自动化测试之间...

2K50
来自专栏ThoughtWorks

2015.5 技术雷达 | 工具篇

(点击图片可以查看大图) 尽管依赖管理的概念并不新奇,在很多技术栈下它甚至已经被作为一种基础开发实践,但在PHP 社区却并非如此。Composer(getcom...

38850
来自专栏iOSDevLog

cmd

在 PC 行业的早期,大多数计算机完全是通过在命令行输入命令来操作的。 基于 Unix、CP / M、DR-DOS 等机器争夺地位和市场份额。 最终,MS-DO...

12430
来自专栏腾讯Bugly的专栏

三步走起 提升 iOS 审核通过率 上篇

image.png 2016年的第一天,各位小伙伴儿们,新年快乐~~~在过去一年里,负责 iOS 应用开发的同学们,想必已被 APP Store 的审核机制折磨...

47990
来自专栏北京马哥教育

15个NoSql数据库

随着互联网web2.0网站的兴起,非关系型的数据库现在成了一个极其热门的新领域,非关系数据库产品的发展非常迅速。而传统的关系数据库在应付web2.0网站,特别是...

43180
来自专栏程序你好

微服务架构入门(Micro-Architecture)

14550
来自专栏玉树芝兰

如何用Python做Web开发?——Django环境配置

用Python做Web开发,Django框架是个非常好的起点。如何从零开始,配置好Django开发环境呢?本文带你一步步无痛上手。

15120
来自专栏北京马哥教育

从苦逼到牛逼,详解Linux运维工程师的打怪升级之路

做运维也快四年多了,就像游戏打怪升级,升级后知识体系和运维体系也相对变化挺大,学习了很多新的知识点。 运维工程师是从一个呆逼进化为苦逼再成长为牛逼的过程,前提在...

75050
来自专栏蘑菇先生的技术笔记

给公司部门设计的SOA架构

23060
来自专栏jessetalks

前后端分离开发模式下后端质量的保证 —— 单元测试

概述   在今天, 前后端分离已经是首选的一个开发模式。这对于后端团队来说其实是一个好消息,减轻任务并且更专注。在测试方面,就更加依赖于单元测试对于API以及后...

387100

扫码关注云+社区

领取腾讯云代金券