2016年7月初,跟同事一起到广州分公司参加公司举办的为期三天的架构师培训。最近翻看关于架构优化的篇幅,整理一些内容出来供大家鉴读,欢迎大家提供宝贵意见,不吝赐教。
对于架构而言,可以从横向和纵向的维度进行分解。
横向的分解就是一种分层,更多的是从应用的角度考虑,寻找一些公共的“关注点”,并将这些关注点往下压,使其成为诸多业务均可以重用的平台或者组件库,例如消息服务、安全服务、监控平台、日志平台、短信平台等。
纵向的分解则是模块化分,采用的是业务的视角,例如区分业务为核心业务和非核心业务,核心业务相对更加稳定。例如核心业务包括支付系统、交易系统、订单系统等。
参考华为架构师李林锋的《分布式服务框架原理与实践》2.1.1所述。
横向拆分:将核心的、公共的业务拆分出来,通过分布式服务框架对业务进行服务化,消费者通过标准的契约来消费这些服务。服务可以独立打包部署和演进,与消费者解耦。
纵向拆分:通过对业务进行梳理,根据业务的特性把应用拆开,不同的业务模块独立部署,例如一个CRM系统就可以按照客户域、产品域、资源域、营销管理域等拆分,将复杂的业务线拆分成相对独立的、灵活的具体能力域,有大变小,分而治之。
综上所述,一个系统的横向分解其实就是提取出公共的、可复用的关注点出来服务化,我称之为“横向提取”。而系统的纵向拆分更多的是从业务领域的角度纵向的划分为各个模块,我称之为“纵向切割”。
从一开始传统的MVC单体垂直架构,到后来的RPC分布式调用(垂直拆分为各个模块化的实例),再到SOA面向服务架构(垂直拆分+单体内服务化),对服务的粒度划分的更加细致,更加灵活,可用性更高,同时开发和维护及测试也变得更加复杂。服务的治理变得越来越重要,于是微服务MSA风格的style流行起来。dubbo+zk、spring cloud成了当下赤手可热且对于企业来说必备的技能。