架构师成长之路:如何进行服务模块拆分(架构师方法经验干货)

前面已经讲到了系统高层架构设计落地的第一步,确定系统边界。

接下来具体地看看系统高层架构设计落地的第二步:如何进行服务拆分,这也是很多新手架构师犯怵的地方,一起来看看吧。

一:服务是什么

这里说的服务,可以看作是一定功能集的聚合封装体,并不一定特指微服务,也可以类比为子系统。

从系统设计的角度,或者是设计思维上,服务的本质就是一些功能集合的这么一个封装体。

因此从设计上来说,系统、子系统、模块、组件等,本质都是一样的,都是一定功能的封装体,只不过功能集的范围大小不一样。

一般我们认为,系统比子系统大,子系统比模块大,模块比组件大,但是从设计层面来看,它们本质都是一样的。

前面讲的确定系统边界,是站在系统外部来看待整个系统,去理解系统要做什么和不做什么,以及系统和相关系统的交互关系等。

当视角从系统外转向系统内部时,首先要做的,就是内部子系统、模块、组件等的划分,其实本质都是对功能进行聚集,然后把这些相关的功能集进行聚合封装,也就是我们这里说的服务。

二:服务的基本要求

1:服务功能是自包含的

自包含的意思就是:一个服务需要的功能,应该尽量都包含在服务之内。

当然,这个做不到绝对,虽然每个服务都是一个封装体,但有些功能,它也需要跟其它服务或外部系统去交互。

因此,只能是尽可能的自包含,就跟我们做设计,耳熟能详的那句话:“加强内聚,松散耦合”一样,对服务来讲,功能的自包含,其实就是加强内聚的体现。

2:服务具备独立性和专业性

所谓独立性,指的是一个服务应该加强内聚,功能上独立;另外一个就是服务能够独立部署、独立运行,这是服务独立性的两层含义。

所谓专业性,指的是按照垂直、专业的方式来聚合功能,比如搜索服务,就是把搜索相关的功能划分到一个服务;又比如支付服务,就是把跟支付相关的功能包装成一个服务,等等的。

3:服务之间应该松耦合

这个大家好理解,简单来说,就是一个服务内部的变化,不能影响调用服务的客户端。也就是服务之间,应该是松散耦合的,可以随时对服务升级,或者是切换不同的服务实现。

4:服务通常是无状态的

这个是目前大家设计上的一个共识,就是在服务端这边,不会去保留客户端的状态(就是指数据),也就是服务是无状态的,不管哪个客户端来,都是一样的执行功能。

5:服务间采用轻量级的通讯机制

目前来说,主要是两大派,一派是htt加p/s协议 + Restful 的形式,比如Spring Cloud;另一派主要是RPC,比如Dubbo、Thrift等。

三:服务拆分的基本方法

1:按AKF进行服务拆分

对于AKF不了解不熟悉的朋友,我们在下一篇来讲述一下AKF扩展立方体。

2:按业务功能进行横向和纵向拆分

所谓横向拆分,就是按照不同的业务领域、或者是专业性 来进行拆分,比如按业务领域把系统分为:用户服务、商品服务、订单服务 等;从专业的角度,分出:搜索服务、支付服务等。

所谓纵向服务,就是在横向拆分的基础上,对每个服务进行更细粒度的划分。比如把商品服务继续细化,拆分成为:实物商品服务、虚拟商品服务、福利商品服务、O2O商品服务等等的。

3:服务分层拆分

比如大家熟知的,前后端服务分离,这本身就是一种分层的拆分形式。

就从后端来讲,可能会有一个层次,是专门来为前端服务的,通常称为聚合服务。

比如给系统平台管理人员使用的一些功能,从服务实现上分散到很多服务里面,但为了跟前端配合,我们通常会专门聚合出一个服务,把所有跟系统平台管理人员相关的功能,都聚合到一起。

聚合服务这一层会向下去调用真正的业务服务实现,业务服务下面又有公共的基础服务做支撑,你看,这样是不是就自然的形成服务的分层拆分。

4:为性能进行服务拆分

如果拆分了服务过后,感觉性能达不到要求,我们可能会进一步拆分服务,以满足性能的需求。

比如秒杀系统,它本来应该是促销服务里面的一部分,但是呢,由于秒杀系统对系统性能要求比较高,会涉及到高并发、高可用等的处理。

所以我们通常会把秒杀系统单独拆分出来,成为一个独立的服务,但对对它进行处理和优化,也把它和业务系统分开,避免因为做活动而把业务系统拖垮。

5:为安全进行服务拆分

这个也比较常见,比如我们考虑到,需要一些公共的授权和鉴权的功能,我们会把账号体系、认证体系独立出来,把它放到网关去进行统一的处理。

又比如跟业务相关的一些安全处理,比如统一的安全管控,控制同一个IP调用的次数、调用的频率、试错的次数 等等的,也会把它们拆分出来,做成一个单独的服务。

进一步,就是对业务的一些风险管控,比如风控系统,也会拆分出来形成单独的服务。

这些都是为了安全进行的服务拆分。

6:为重用进行服务拆分

当我们进行细节实现思考的时候,可能会发现,出现了多个服务都需要的功能,我们就需要把这些功能拆分出来,形成独立的、公共的服务,供这多个服务使用。

这就跟我们发现多个类里面有相同或者类似的功能实现的时候,会把它们提炼出来,做到公共的模块里面去,一样的道理。

如果这些功能跟业务不相关的话,会进一步把它们封装到基础服务里面去。这都是为了重用而进行服务拆分的方式。

到这里,如何进行服务拆分就讲得差不多了。

有问题或者意见、建议,请评论留言或者私信,大家一起探讨,一起进步!

当然,如果你觉得本系列文章还不错,能够给你一些启发和思考的话,请关注、点赞、收藏加转发,让更多的朋友加入到我们的行列,谢谢啦!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值