关于服务化,以及软件系统的服务化,是一个大的概念。我经过一些以服务化为主题的文章输出,总结下来服务化是一种思想,是一种软件过程,并无严格的非此及彼的标准化定义,可是有必定的量化指标能够参考。前端
话又说回来,软件开发是一项工程行为,按照软件开发的定义,是有一套理论基础做为支撑的,在大学教育里有专门的软件工程专业。服务器
本文试图在软件开发理论与中小型软件项目的最佳实践的基础之上,探寻最大程度的软件系统服务化。网络
服务化系统首先应该是分布式的系统。
分布式系统是由一组经过网络进行通讯、为了完成共同的任务而协调工做的计算机节点组成的系统。分布式系统有如下几个特征:分布式
副本(Replica)是分布式系统最多见的概念之一,指分布式系统对数据和服务提供的一种冗余方式。在常见的分布式系统中,为了对外提供高可用的服务,咱们每每会对数据和服务进行副本处理。有副本的概念,就会关联到副本数据一致性问题。spa
不要担忧故障,故障在分布式系统中总会发生,咱们要作的是预防故障,处理故障。设计
分布式系统的核心就是处理各类各样的异常状况。
服务交互的三种状态,能够理解为网络请求的三种状态,“成功”、“失败”、“超时”,blog
尤为注意失败和超时是不同的,失败表明着明确的处理结果,而超时是一种不肯定的状态。事务
这三种状态的区分对于跨系统之间定义通信协议时很重要。开发
分布式系统须要区别对待 RPC 的“成功”、“失败”、“超时”三种状态。当出现“超时”时,能够经过发起读取数据的操做以验证 RPC 是否成功(例如银行系统的作法)。rem
或者设计分布式协议时将执行步骤设计为可重试的,即具备所谓的“幂等性”。
失败的操做在必定场景下能够重试至成功。
【有些执行步骤是可重试的,而有些是不能重试的。幂等性的重点是其任意屡次执行所产生的影响均与一次执行的影响相同,在事务型设计中 保持幂等性是尤其重要的】
本文对幂等性不作过多介绍。
这里回顾下,网络通信中两种通信模式 C/S模式和P2P模式,C/S模式强调的是客户端发起和服务器端之间的角色定位,P2P模式认为没有严格的客户端和服务端。
P2P模式下,在一组服务化的系统中,每个节点都是调用链中的一环,除了用户最前端和数据持久化的最末端,几乎每个节点都在向上游获取服务,向下游提供服务。
显然分布式系统中,使用的通信模式都是P2P模式。
基于以上内容的理解,本文对服务化作一个简单的定义
服务化是软件服务的一个过程,是不断更迭和完善的。有以下几个可量化的属性
共享性
1 服务化的系统最终功能交付物被多个下游系统依赖调用,调用方>=2。也就是一个服务是能够被多个服务消费方共享使用的。服务须要独立部署,不须要与其余项目深度耦合。
有功能边界
2 服务化的系统具备必定的抽象功能,抓大放小,解决系统核心功能及主要矛盾。
咱们须要定义系统的核心模块及数量,也就是服务化的粒度
稳定性
3 服务化的系统要稳定,可靠,可控
健壮性
4 服务化的系统具备必定的健壮性,弹性。对于异常能够进行平行过分,拥有降级等容错机制。
弹性是服务化系统的一个特色,要求系统在遇到异常和外部破外时,可以保持原有最小化的功能输出,不至于被压倒。设计者在设计服务系统时,须要创建弹性思惟。
本文从分布式的特色,服务交互状态,以及网络通信模型几部分着手,基于理论,实践,可复制性,复盘开发经验和理解的原则,对软件服务化进行了4个纬度的定义。以后我会梳理一些开发案例进行分解。