引言

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. 在进行种子数据的预置时,使用了 Polly开启了Retry机制。

  1. private Policy CreatePolicy( ILogger<CatalogContextSeed> logger, string prefix,int retries = 3)

  2. {

  3.    return Policy.Handle<SqlException>().

  4.        WaitAndRetryAsync(

  5.            retryCount: retries,

  6.            sleepDurationProvider: retry => TimeSpan.FromSeconds(5),

  7.            onRetry: (exception, timeSpan, retry, ctx) =>

  8.            {

  9.                logger.LogTrace($"[{prefix}] Exception {exception.GetType().Name} with message ${exception.Message} detected on attempt {retry} of {retries}");

  10.            }

  11.        );

  12. }

  13. public async Task SeedAsync(CatalogContext context,IHostingEnvironment env,IOptions<CatalogSettings> settings,ILogger<CatalogContextSeed> logger)

  14. {

  15.    var policy = CreatePolicy(logger, nameof(CatalogContextSeed));

  16.    await policy.ExecuteAsync(async () =>

  17.    {

  18.        //...

  19.    });      

  20. }

3. 使用NoTracking提升查询速度 在 CatalogController的构造方法中,明确指定以下代码来进行查询优化,这一点也是我们值得学习的地方。

  1. ((DbContext)context).ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;

数据库表结构

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

最后

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

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

  1. 修改产品价格时,需要同步更新购物车中保存的产品信息的价格。

  2. 下订单时,需要验证当前商品库存是否充足,进行锁库抢占,以避免库存不足导致的订单无效。

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

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

eShopOnContainers 知多少[4]:Catalog microservice相关推荐

  1. eShopOnContainers 知多少[7]:Basket microservice

    引言 Basket microservice(购物车微服务)主要用于处理购物车的业务逻辑,包括: 购物车商品的CRUD 订阅商品价格更新事件,进行购物车商品同步处理 购物车结算事件发布 订阅订单成功创 ...

  2. eShopOnContainers 知多少[2]:Run起来

    环境准备 Win10(开启Hyper-V) .NET Core SDK Docker for Windows VS2017 or VS Code Git SQL Server Management S ...

  3. eShopOnContainers 知多少[8]:Ordering microservice

    1. 引言 Ordering microservice(订单微服务)就是处理订单的了,它与前面讲到的几个微服务相比要复杂的多.主要涉及以下业务逻辑: 订单的创建.取消.支付.发货 库存的扣减 2. 架 ...

  4. eShopOnContainers 知多少[3]:Identity microservice

    首先感谢晓晨Master和EdisonChou的审稿!也感谢正在阅读的您! 引言 通常,服务所公开的资源和 API 必须仅限受信任的特定用户和客户端访问.那进行 API 级别信任决策的第一步就是身份认 ...

  5. eShopOnContainers 知多少[12]:Envoy gateways

    1. 引言 在最新的eShopOnContainers  3.0 中Ocelot 网关被Envoy Proxy 替换.下面就来简要带大家了解下Envoy,并尝试梳理下为什么要使用Envoy替代Ocel ...

  6. eShopOnContainers 知多少[11]:服务间通信之gRPC

    1. 引言 最近翻看最新3.0 eShopOncontainers源码,发现其在架构选型中补充了 gRPC 进行服务间通信.那就索性也写一篇,作为系列的补充. 2. gRPC 老规矩,先来理一下gRP ...

  7. eShopOnContainers 知多少[5]:EventBus With RabbitMQ

    1. 引言 事件总线这个概念对你来说可能很陌生,但提到观察者(发布-订阅)模式,你也许就很熟悉.事件总线是对发布-订阅模式的一种实现.它是一种集中式事件处理机制,允许不同的组件之间进行彼此通信而又不需 ...

  8. eShopOnContainers 知多少[10]:部署到 K8S | AKS

    1. 引言 断断续续,感觉这个系列又要半途而废了.趁着假期,赶紧再更一篇,介绍下如何将eShopOnContainers部署到K8S上,进而实现大家常说的微服务上云. 2. 先了解下 Helm 读过我 ...

  9. eShopOnContainers 知多少[9]:Ocelot gateways

    引言 客户端与微服务的通信问题永远是一个绕不开的问题,对于小型微服务应用,客户端与微服务可以使用直连的方式进行通信,但对于对于大型的微服务应用我们将不得不面对以下问题: 如何降低客户端到后台的请求数量 ...

最新文章

  1. Oracle删除指定用户下所有对象
  2. php 删除一周前,linux下删除7天前日志的代码(php+shell)
  3. 什么地方容易刷出ak_CSGO皮肤推荐——AK燃料喷射器
  4. SQLSever触发器建立
  5. 海量特征按照缺失值null/NAN数量异同进行分组归类
  6. 原型设计工具的对比评测记录(一)
  7. python启动http服务_Python通过命令开启http.server服务器的方法
  8. 【移入移出事件练习】【菜单】【选项卡】 -------this使用
  9. 根据银行卡账号获取所属银行php代码
  10. 空号检测/空号检测接口/号码状态查询/号码状态查询接口/号码状态查询api/精准实时版/免费试用
  11. eclipse中的英文与汉语对照表
  12. python汉语叫什么意思_Python是什么-百度经验
  13. 如何在liunx上搭建服务器资源监控平台
  14. 浩辰cad电气2021 安装教程
  15. mysql远程主机强迫关闭了_channal经常关闭
  16. input标签只能输入数字
  17. CFGym - 101086M. ACPC Headquarters : AASTMT (Stairway to Heaven) - 字符串处理
  18. Matlab显示图像三维信息
  19. 手机百度打不开html网页,手机百度为什么打不开网页 网页打不开解决方法
  20. LDAP认证的两种方式

热门文章

  1. Java8基础之super关键字
  2. pandas所占内存释放
  3. 关于CTeX的几个大坑
  4. JS时间戳和时间互转
  5. jenkins代理设置
  6. [reship]某类领导
  7. 在Ajax程序中实现无刷新换肤功能(asp.net2.0)
  8. 字节前端终于开源!吹爆!
  9. WTMPlus 1.1 发布
  10. 那些35岁的程序员都去哪了