华企号 后端开发 微服务架构

微服务架构

前面我们一起探讨了一个微服务的概念了解,微服务,也称为微服务架构,是一种架构风格,它将应用程序构建为服务的集合。

那么,假如你所负责的应用变得庞大,需要进行重构,我们采用微服务架构,对你现在的需求进行拆分设计,你会怎么拆分呢?

微服务架构

/ 

务拆分策略

首先,我们需要考虑的是共享类库的角色,也就是我们在开发过程中,习惯把一些通用的功能(帮助类)打包成一个公共类库或者包中。其他服务需要使用直接引用调用即可,增加代码的复用性。但是很可能存在隐患,这个公共类库不断地叠加导致出错或者版本问题会影响到其他服务。

更好的做法就是努力使。或者是

其次,在拆分服务时,我们需要精心设计的服务将适合由一个小团队开发的服务,并且交付时间最短,与其他团队的协作最少。同时,将一些小的、松耦合的服务组织到一起,以便提升开发阶段效率,特别是可维护性、可测试性和可部署性,这样能够让组织的软件开发速度更快。

接下来,我们需要对一个应用程序来定义微服务架构,进行拆分了。

第一步通常在开始之前,我们需要收集这个应用有关的信息,比如说需求文档,领域专家的信息(具有这个领域的丰富知识和技能)等。之后,我们便需要从这些信息中提炼出各种关键信息,使用抽象的系统操作来描述服务之间协作方式的架构场景,这是一种抽象化的,而不是具体的,它既可以是更新数据的命令,也可以是检索数据的查询。每个命令的行为都是根据抽象的领域模型定义的,抽象领域模型也是从需求派生出来的。

第二步,就是如何分解服务。这里有两种广为熟知的策略,这两种方式最终都是围绕业务概念而非技术概念分解和设计的服务,所以最后的设计结果往往会有些相像。

第三步,即是确定每个服务的API。这一步设计过程中需要采用哪种进程间通讯机制来实现每个服务API的通讯。同时,需要考虑几个困难,第一个就是,如果服务之间往返太多,导致网络延迟,那么你需要重新审视你拆分的服务是否合理。第二个就是。第三个就是需要维护跨服务的数据一致性,例如使用Saga,共享数据库,领域事件来解决,当然这些将会在后续探讨。第四个,就是,上帝类即是整个应用中的全局类,可以通过驱动领域的概念来消除这个上帝类。

细心的伙伴会发现,在采用微服务架构时,很多难啃的骨头都可以通过DDD(驱动领域)来化解,这也是广为使用的原因之一,能够很好的配合微服务架构。

这里我们展开讲解第二步,如何分解服务。第三步将会涉及更多内容,将在后续逐一探讨。

使用业务能力进行服务拆分,是微服务架构的策略之一。或许不用讲也知道,业务能力是指一些能够为公司(或组织)产生价值的商业活动。每个企业也有自己的特定的业务类型。例如,在线商店所包含的业务能力包括:订单管理、库存管理和发货。保险公司业务能力包含承保、理赔管理、账务和合规等。

公司的业务能力通常是指这个组织的业务是,它们通常是稳定的。与之相反公司采用何种方式来实现它的业务能力,是随着时间不断变化的。例如以往的支付方式,除了线下支付,还支持财付通支付,现如今还支持支付宝,微信支付。但是始终属于支付业务,稳定不变的,仅仅只是实现方式发生了变坏。

微服务架构

/ 

业务能力的拆解,我们可以举一个例子:例如一个餐厅管理系统,其业务能力包含:

  1. 供应商管理。送餐员相关信息,餐馆菜单和其他信息管理,例如营业时间和地址。

     

  2. 消费者管理:消费者相关信息的管理。

     

  3. 订单获取和履行(直接运送、第三方派送,自己运送等)。具备消费者创建和管理订单,餐馆管理订单生产过程,送餐,跟踪外卖员的实时状态,订单送到用户手中。

     

  4. 会计记账。管理跟消费者相关的会计记账,管理跟餐馆相关的会计记账,管理外卖员相关的会计记账。

     

  5. 其他。

     

通过上面的业务梳理,我们可以对应到API服务。

微服务架构

Eric Evans 于 2003 提出的领域驱动设计构建复杂软件的方法论,这些软件通常都以。领域模型以解决具体问题的方式包含了一个领域内的知识。它定义了当前领域相关团队的词汇表,DDD也称之为通用语言。领域模型会被紧密地映射到应用的设计和实现环节。在微服务架构的设计层面,DDD有两个特别重要的概念,子域和限定上下文。

DDD例如上例某餐馆服务的子域包括:订单获取、订单管理、餐馆管理、送餐和会计。能够看出和上面业务能力拆分服务非常相近。

DDD限界上下文包括实现这个模型的代码集合。当使用微服务架构时,每一个限定上下文对应一个或者一组服务。换一种说法,我们可以通过DDD的方式来定义子域,并把子域对应为每一个服务,这样就完成了微服务的设计工作。

或许这些内容需要多读多理解,下面我们使用一个小案例来助解。

假如我们要为一个小卖部设计一套进销存系统,她为我们提供的业务描述是这样的:每天凌晨从布吉农批市场买苹果、梨、葡萄、橘子、香蕉、荔枝、核桃等等,反正哪些好卖她就买回来卖。葡萄、荔枝不能长久保留,一般要当天卖出去…。

针对上面这段业务描述,我们怎么进行领域模型设计?将给出以下几个步骤来完成领域模型设计。

总结业务描述中的名词。首先建一个名词表,把涉及到的名词列出来:

1. 布吉农批市场

2. 买东西的人是一个隐含的名词,每天凌晨从农批市场拿货

3. 苹果

4. 梨

5. 葡萄

6. 橘子

7. 香蕉

8. 荔枝

9. 核桃

10. 顾客是一个隐含的名词,买回来卖的对象

11. 凌晨、当天时间名词,与实体及角色无关

 

确定业务实体,用序号名词描述;

1. 布吉农批市场不是本业务的一个实体

2. 买东西的人是本业务的一个角色

3. 苹果是一个实体

4. 梨是一个实体

5. 葡萄是一个实体

6.橘子是一个实体

7. 香蕉是一个实体

8. 荔枝是一个实体

9. 核桃是一个实体

10. 顾客是本业务的一个角色

11. 凌晨、当天时间名词,与实体及角色无关

?苹果、梨、葡萄、橘子、香蕉、荔枝属于水果,核桃属于干果,它们都是果品的一个具体实例。而在水果中葡萄和荔枝属于不宜保存水果,通过这样进一步的分析得出如下的领域模型:

微服务架构

果品进销存领域模型

这个领域模型不但能反映当前的经营实体,同时给我们需求分析人员和系统功能提供了一定的扩展视野:将来会不会经营食品,短期保持水果采取什么利润空间来促销,长期保存的水果会不会因为保存成本而导致利润下降。

那么,我们根据领域模型对业务能力拆分的某餐馆系统进行设计如下:

微服务架构

DDDDDD

👍

作者: 华企网通王鹏程序员

我是程序员王鹏,热爱互联网软件开发和设计,专注于大数据、数据分析、数据库、php、java、python、scala、k8s、docker等知识总结。 我的座右铭:"业精于勤荒于嬉,行成于思毁于随"
上一篇
下一篇

发表回复

联系我们

联系我们

028-84868647

在线咨询: QQ交谈

邮箱: tech@68v8.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部