架构师成长之路:如何进行服务模块拆分(架构师方法经验干货)
前面已经讲到了系统高层架构设计落地的第一步,确定系统边界。
接下来具体地看看系统高层架构设计落地的第二步:如何进行服务拆分,这也是很多新手架构师犯怵的地方,一起来看看吧。
一:服务是什么
这里说的服务,可以看作是一定功能集的聚合封装体,并不一定特指微服务,也可以类比为子系统。
从系统设计的角度,或者是设计思维上,服务的本质就是一些功能集合的这么一个封装体。
因此从设计上来说,系统、子系统、模块、组件等,本质都是一样的,都是一定功能的封装体,只不过功能集的范围大小不一样。
一般我们认为,系统比子系统大,子系统比模块大,模块比组件大,但是从设计层面来看,它们本质都是一样的。
前面讲的确定系统边界,是站在系统外部来看待整个系统,去理解系统要做什么和不做什么,以及系统和相关系统的交互关系等。
当视角从系统外转向系统内部时,首先要做的,就是内部子系统、模块、组件等的划分,其实本质都是对功能进行聚集,然后把这些相关的功能集进行聚合封装,也就是我们这里说的服务。
二:服务的基本要求
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:为重用进行服务拆分
当我们进行细节实现思考的时候,可能会发现,出现了多个服务都需要的功能,我们就需要把这些功能拆分出来,形成独立的、公共的服务,供这多个服务使用。
这就跟我们发现多个类里面有相同或者类似的功能实现的时候,会把它们提炼出来,做到公共的模块里面去,一样的道理。
如果这些功能跟业务不相关的话,会进一步把它们封装到基础服务里面去。这都是为了重用而进行服务拆分的方式。
到这里,如何进行服务拆分就讲得差不多了。
有问题或者意见、建议,请评论留言或者私信,大家一起探讨,一起进步!
当然,如果你觉得本系列文章还不错,能够给你一些启发和思考的话,请关注、点赞、收藏加转发,让更多的朋友加入到我们的行列,谢谢啦!
架构师成长之路:如何进行服务模块拆分(架构师方法经验干货)相关推荐
- 架构师成长之路(4)--高可用高并发架构(图谱)
- 路上有你:《架构师成长之路》终结篇 (附新年礼物)
<架构师成长之路>第 0 期 <架构师成长之路>第 1 期 <架构师成长之路>第 2 期 <架构师成长之路>第 3 期 <架构师成长之路>第 ...
- 架构师成长之路:如何提升技术掌控力?
架构师成长之路:如何提升技术掌控力? 简介: 在很多人眼里,架构师就犹如古代的将军一般,既能运筹帷幄决胜千里,又能独闯敌营取人首级,是所有士兵们崇拜的偶像...好了,其实我只是想说:能成为一名优秀的架 ...
- 如何成为一名架构师,架构师成长之路(转)
转自http://blog.csdn.net/fei33423/article/details/61934514 如何成为一名架构师,架构师成长之路 原创 2017年03月13日 22:50:34 3 ...
- 开启运维自动化架构师成长之路
技术的提升仅是量的积累,思想的提升才是质的飞跃! 这句话是我在网上看到认为最有道理的励志语录了,当然互联网IT行业的工作者相对理解的会更加深刻. 以这句话开头引出我将要写的这篇文章.首先,请允许我做一 ...
- Java架构师成长之路
目录导航 前言 一.源码分析专题 1.1 设计模式详解 1.2 Mybatis源码分析 1.3 Spring5源码分析 二.分布式架构专题 2.1 漫谈分布式架构 2.2 分布式架构的基础 2.3 分 ...
- Web架构师成长之路
Web架构师成长之路 本人也是coding很多年,虽然很失败,但也总算有点失败的心得,不过我在中国,大多数程序员都是像我一样,在一直走着弯路.如果想成为一个架构师,就必须走正确的路,否则离目标越来越远 ...
- WEB架构师成长之路-摘录
一 .学习面向对象的基础知识,那你的编程之路注定是在做原始初级的重复! 很多程序员都知道类.方法.抽象类.接口等概念,但是为什么要面向对象,好处在哪里,要解决什么问题 降低软件开发的复杂度 提高软件开 ...
- 架构师成长之路(5)--如何获取知识(学习境界)(方法)
原文地址为: 架构师成长之路(5)--如何获取知识(学习境界)(方法) 哲学家常思考的问题:" 我是谁?"" 我从哪里来?"" 要到哪里去?不只是哲学 ...
- javaweb k8s_K8S微服务核心架构学习指南 ASP.NET Core微服务基于K8S 架构师必备Kubernetes教程...
K8S微服务核心架构学习指南 ASP.NET Core微服务基于K8S 架构师必备Kubernetes教程 课程内容是关于Kubernetes微服务架构学习课程,基于K8S开展ASP.NET核心进行微 ...
最新文章
- 3月到9月之9月到12月
- cygwin中 unable get setup.ini from... 的错误问题
- 知识点讲解四:栈溢出(stack overflow)问题解决方案
- Android防盗系统推荐
- svg笔记----------path篇
- springboot+jsp+mybatis项目实例(后台成功,但是无法跳转jsp页面,没有实体类的注解,看springboot+jsp第二弹相关配置,即可成功配置jsp)...
- 不能使用 float 和 double 来表示金额等精确的值
- 三维空间下的交互设计
- Android 快速修复功能,用于解决Android系统问题的四大Android修复软件
- php 银行支付通道_基于PHP框架的聚合四方支付系统
- 历年计算机信息系统管理师真题,历年计算机软考信息系统项目管理师真题
- 【栈】实现逆波兰计算器
- C语言函数之可变参数原理:va_start、va_arg及va_end
- react中引入swiper详细教程 亲测没测出来
- 全面的IE兼容性调试问题
- java合肥工业大学考试题库_合肥工业大学java程序设计实验二
- 来把狠的——传一个肖邦的《Black Key Exercise(黑键练习曲)》
- oracle数据库注入实战,教你oracle注入
- 阿里云ecs 发邮件
- 微信小程序-评论业务的实现
热门文章
- 易飞9审核员调用API
- 乐pro3刷LineageOS 出现错误07
- poj2983poj1364
- OpenGL.ES在Android上的简单实践:23-水印录制(FBO离屏渲染,解决透明冲突,画中画)
- 产品经理/互联网非技术岗如何写一份好的简历?
- 易康_最佳分割尺度的选择——ESP2工具的使用
- ubuntu W: GPG 错误:http://ppa.launchpad.net/fossfreedom/indicator-sysmonitor/ubuntu xenial InRelease:
- Theano权重子集更新
- java读取qq邮箱_java获取qq邮箱中的好友列表
- android build.prop文件