2年前很多人问我分布式和微服务的区别。首先分布式是一个大集合,微服务是其中的一块交集,交集的部分都满足分布式架构的特征,比如开箱即用,服务自治,业务单一等等 ,分布式设计其实都可以满足这些条件。没有交集的那部分就是微服务的设计思想,在这里推荐一本精华书籍 <<领域驱动设计>>。有了不同的设计思想之后,催生出了不一样的特征。
微服务领域驱动设计是一个法门,指引程序员向架构师前进的箴言。
一、微服务之领域模型
程序员都知道,当我们拿到一个业务的时候最先开始的是建表,而不是撸代码。但是大多数都忽略了这个环节,而领域模型恰恰就是最重视这个环节,底层设计决定了上层建筑,数据库的设计决定了程序的设计,也决定了业务实现的复杂度,更加能影响系统对业务的处理能力。
1、什么是领域?
领域好比一个县长,他管着自己疆土的风吹草动,生杀大权都在他手上。
2、如何找到业务中的领域呢?
寻找业务线中状态改变能够影响整体业务线改变的因子,然后再找出什么因子穿插在业务线中最多,往往这个交集就是县长,这不是一个法则,不是绝对的,只是经验之谈。因为有些复杂业务会在一个业务线中出现的交集包含多个对象,稍后再讲这个情况。
举个商城下单的例子:
订单表状态改变会影响整个订单业务线流程、订单业务在处理的时候必须以订单编号为维度的,以上便能确定领域。
3、复杂业务如何找到领域?
对于复杂的业务,按领域的方式寻找出现多个入围的选项之后变得不再适用,那就需要考虑业务偏移量,liunx系统中有一个经典的测算方法,如果a和b中间你不知道选谁的时候,假设它们中间有一根指针,你从业务线角度出发,权衡这根指针向哪边偏移的多,如果实在无法取舍,就从系统吞吐、扩展上权衡。
当你选择出一个对象当做领域的时候需要关注如何在微服务上实现这个复杂业务的领域所具备的权利,要既不违反微服务设计原则,又不侵犯业务领域权限,于是出现新的概念,聚合根。
怎么理解聚合根,即特殊场景特殊对待,这个特殊并不是一个随意的过程,而是为了避免违反设计原则的情况下将一些特殊的部分单独抽离出来处理,心态就是要坏就坏一个地方吧,别传染给其他人。
同样还是商城下单的例子:
下单业务中,需要计算优惠券、满减优惠券等基本的营销工具,又要满足运营弄出来的暂时性营销方案,比如砍价拼团等等、不能一直去改下单代码,那么这些业务就不能全部写在下单中,营销类的数据在这里需要做非常强的一致性措施,下单业务计算金额也是需要非常强的一致性,这里会单独抽出这块业务做成一个聚合服务,这个聚合服务相当于一个多口插座,可以接入多种业务领域进来共同完成一件事情,之后返回各自领域需要的结果。只需要程序员提前约定,提前考虑到场景即可完成扩展,改动也不会牵扯到其他稳定的业务,还可以按需求扩展改造功能。
4、对于数据处理如何考虑?
在一个领域中,数据分为2种,一种叫领域,另一种叫值对象。前面介绍了领域,现在讲讲什么是值对象。
值对象就是具有数据存储能力的对象,表现为值的结构。本身不影响业务线的流转,而且基本不会发生改变,即便改变了也不会影响业务线。这句有点绕了,如何理解?程序是将业务抽离成可量化的实体属性,用于逻辑处理,值对象就是存储这些量化的抽象维度的值。
依旧是商城下单的例子:
下单系统收到一个下单请求,创建了一个领域(订单表),需要记录下单的商品、所使用的优惠、所付的金额、下单人信息、收货地址等等,这些都是一个个值对象,不同维度的值对象对应不同的表,值对象可以有状态,但是值对象的存在只会改变业务代表的信息,好比订单总金额是10块 和订单总金额是1000块,程序本身并不会有什么不同的处理,用了优惠券就在聚合服务调用优惠券消费,没有用优惠券就不调用罢了,不会对订单业务线造成退单、完成等等操作。
二、如何实现一个微服务
1、通常情况下一个微服务只关注一个领域的业务,这样程序员只需要专注理解一个业务,设计起来也能更加顺畅,不必考虑太多的因素。
2、一般来说 同一个微服务对应一个数据库,当然根据业务线的侧重,可以做一些变通,避免过度设计和资源浪费。数据库独立的原因在于独享数据库IO有利于微服务的业务处理能力,也便于微服务独立部署。
3、微服务之间尽量使用消息事件驱动,需要构建一条消息总线来做支撑,在系统吞吐上还能使用流式计算增加处理能力。
4、微服务之间是独立的,每个都可以单独启动对外提供服务,不依赖其他服务(聚合服务除外,聚合服务本身已经是特殊的微服务处理,已不具备微服务的一些设计原则)
5、微服务之间不共享数据,而是约定交互方式进行数据交互,约定大于配置原则,内部服务之间可以不使用权限认证。
6、微服务内部分为很多层,最基本的有数据层,数据交互处理层,数据校验层,业务层,业务校验层,对外接口层,业务熔断层。分层次的原因在于可以快速更改其中一层而不对其他任何层造成影响,同时规范了每一层的职责做到单一,使得每一层代码都能分离,不像某些业务一个方法上百行代码。
欢迎关注我的个人公众号
评论区