eshoponcontainers知多少[4]:catalogmicroservice(代码片段)

sheng-jie sheng-jie     2023-01-27     636

关键词:

引言

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是如何通过事件机制完成最终一致性的。

eshoponcontainers知多少[8]:orderingmicroservice(代码片段)

1.引言Orderingmicroservice(订单微服务)就是处理订单的了,它与前面讲到的几个微服务相比要复杂的多。主要涉及以下业务逻辑:订单的创建、取消、支付、发货库存的扣减2.架构模式如上图所示,该服务基于CQRS和DDD来实现。从... 查看详情

eshoponcontainers知多少[10]:部署到k8s|aks(代码片段)

...要半途而废了。趁着假期,赶紧再更一篇,介绍下如何将eShopOnContainers部署到K8S上,进而实现大家常说的微服务上云。2.先了解下Helm读过我上篇文章ASP.NETCore借助K8S玩转容器编排的同学,想必对K8S有了个大致了解。K8S引入了Pod、Se... 查看详情

借书方案知多少

 源码:#include<iostream>usingnamespacestd;intmain()inta,b,c,count=0;for(a=1;a<=5;a++)for(b=1;b<=5;b++)for(c=1;c<=5;c++)if(a!=b&&a!=c&&b!=c)count++;cout<<count;return0;运行结果60 优化:#include<iostream>usingnamespacestd;intmain()inta,b,... 查看详情

产品开发知多少一

为什么要进行产品开发?1.市场需求使然,获取商业价值;2.公司战略需要,为公司的战略目标打基础;3.技术发展需求,做公司核心技术积累;开发产品依据?1.企业目标2.战略部署3.技术积累4.市场需求组织中谁来进行产品开发... 查看详情

性能测试之并发用户数知多少

参考技术A一、经典公式1:一般来说,利用以下经验公式进行估算系统的平均并发用户数和峰值数据1)平均并发用户数为C=nL/T2)并发用户数峰值C‘=C+3*根号CC是平均并发用户数,n是loginsession的数量,L是loginsession的平均长度,T是... 查看详情

第一讲测试知多少

1.1计算机基础1.1.1计算机相关定义◆软件和硬件:软件:当电脑启动时的应用程序,应用软件(腾讯,qq,有道云,有道翻译)、系统、网页、驱动(看得见、摸不着)硬件:计算机的硬件是计算机的各种设备的总称,分为五个... 查看详情

sql递归查询知多少

sql递归查询的方法:方法一:T-SQL递归查询withDepas(selectId,DeptCode,DeptNamefromDepartmentwhereId=1unionallselectd.Id,d.DeptCode,d.DeptNamefromDepinnerjoinDepartmentdondep.Id=d.ParentDeptId)select*fromDep方法二:PL/SQL递归查询selectId,DeptCode,DeptNamefromDepartmentstartwithI... 查看详情

问题:编译eshoponcontainers失败,提示error:invalidreferenceformat

环境:visualstudio2017v15.4.2,dockerceVersion17.06.0-ce-win19(12801)参考问题页:https://github.com/dotnet-architecture/eShopOnContainers/issues/107问题:F5运行是报错:error:Buildingwebstatuserror:invalidreferenceformat 查看详情

typeof知多少

昨天同事给我看了一道代码题,是关于typeof的,感觉挺有意思的,在这里分享给大家,顺便自己再对typeof总结总结。如有不对,请给予指出,共同进步。代码是这样的:<!DOCTYPEhtml><head><title>typeof</title><metahttp-... 查看详情

css知多少——float下篇(转)

  float内容比较多,咱们分上、下两篇来介绍,上篇已经写完,这是下篇。建议大家先把上篇看了,再来看下文,精彩内容不要掠过啊。1.清除float  《上篇》中我们提到,float具有“破坏性”,它会导致父元素“坍塌”,这... 查看详情

编码命名方式知多少(代码片段)

文章目录1.camelcase(驼峰式)2.snakecase(蛇形式)3.kebabcase(烤串式)4.匈牙利命名法5.小结参考文献编码时,命名无处不在。比如我们需要对文件命令,对目录命名,对变量命名,还有其他类... 查看详情

元素类型知多少

元素就是标签,布局中常用的有三种标签,块元素、内联元素、内联块元素,了解这三种元素的特性,才能熟练的进行页面布局。块元素也称为行元素,布局中常用的标签如:divp、ul、li、h1~h6、dl、dt、dd等等都是块元素,它在... 查看详情

借书方案知多少问题

...5本书借给A,B,C三名小朋友,每个人只能借一本,问有多少种借书的方案二、设计思路:直接利用三层循环暴力解除完事,条件判断联立两个等式三、程序流程图:  四、代码实现:#include<iostream>代码一:三层循环... 查看详情

哈希情史知多少

——日拱一卒,不期而至!简介hash是我们工作中经常听到的词,比如哈希表、哈希函数、hashCode、HashTable、HashMap等等,那么它们之间到底有怎样的爱恨情仇呢?来一起看一看吧~~数组讲哈希表之前,我们先来看看数据结构的鼻祖... 查看详情

事件总线知多少

ImplementinganeventbuswithRabbitMQforthedevelopmentortestenvironmentAbpEventBus  查看详情

事件总线知多少

ImplementinganeventbuswithRabbitMQforthedevelopmentortestenvironmentAbpEventBus  查看详情

网页制作知多少

网页制作知多少一、通用模板:<!DOCTYPEhtml><htmllang=”en”>  <head>      <meta charset=”UTF-8”/>    &nb 查看详情

获取openstreetmap数据方法知多少

方法1:网站直接下载1.可以通过该网站下载世界各地的OpenStreetMap地图矢量数据具体的进入过程为,打开OpenStreeetMap首页OpenStreetMap。然后单击下图右上角的导出,可以看到有许多数据来源的网站,选择Geofabrik下载就可以进入下载... 查看详情