大胡子抽雪茄 2019-06-30
从进程角度看, 两个程序分别运行在两台主机的进程上, 它们相互协作最终完成同一个服务, 那么理论上这两个程序所组成的系统, 可以称作"分布式系统".
当然, 这两个程序可以是不同的程序, 可以是相同的程序. 如果是相同的程序, 我们又可以称为 "集群". 所谓集群, 就是将相同的程序, 通过不断横向扩展, 以提高服务能力的方式.
上图的 web app 服务是单体化的, 所有组件耦合在一个开发项目中, 并且配置和运行在一个 JVM 进程中. 如果某个组件需要升级上线, 则会导致其他没有变更的组件同样上线.
而且无法满足高并发请求处理, 水平扩展能力也很有限的.
为了解决上述问题, SOA 出现了. SOA 代表面向服务的架构, 俗称服务化. SOA 将应用程序的模块化组件通过定义明确的接口和协议联系起来, 接口是采用中立的方式进行定义的, 独立于某种语言、硬件和操作系统, 通常通过网络通信来完成, 但是并不局限于某种网络协议, 可以是底层的 TCP/IP, 可以是应用层的 HTTP, 也可以是消息队列协议, 甚至可以是来约定的某种数据库存储信息.
这使得各种各样的系统中的模块化组件可以以一种统一和通用的方式进行交互.
SOA 将模块化组件从单一进程中进一步拆分, 通过某种网络协议形成独立的对外提供服务的网络化组件, 这种架构下的特点如下:
要彻底理解 SOA 时代地服务化发展情况, 我们必须理解 SOA 的两个主流实现方式: web service 和 ESB.
Web Service 技术是 SOA 服务化的一种实现方式. 运行在不同操作系统上的服务的互相发现和调用, 并且可以通过某种协议交换数据.
上图可以看到, 每个服务之间是对等的, 并且互相是解耦的, 通过 WSDL 定义的服务发现接口进行访问, 并通过 SOAP 协议进行通信. SOAP 协议通常是一种在 HTTP 或者 HTTPS 通道上传输 XML 数据来实现的协议, 但是每个服务都要依赖中心化 Web Service 目录来发现现存的服务.
Web Service 的工作原理如下.
通过这个过程, 要改造一个新的业务流程, 可以从 Web Service 目录中发现现有的服务, 并最大限度地重用现有的服务.
随着物联网企业的不断发展, 互联网产品需要服务的用户量逐渐增加, 海量用户发起的大规模、高并发请求是企业不得不面对的.
前面介绍的 SOA 服务化系统能够分解任务, 让每个服务更简单、职责单一、更易于扩展, 但无论是 Web Service 还是 ESB, 都有时代遗留问题.
Web Service 的问题如下:
微服务架构倡导将软件应用设计成多个可独立开发、可配置、可运行和可维护的子服务, 子服务之间通过良好的接口定义通信机制, 通常使用 RESTful 风格的 API 形式来通信, 因为 RESTful 风格的 API 通常是在 HTTP 或者 HTTPS 通道上传输 JSON 格式的数据来实现的, HTTP 协议有跨语言、跨异构系统的优点.
当然, 也可以通过底层的二进制协议、消息队列协议等进行交互.
这些服务不需要中心化的统一管理, 每个服务的功能可以自治, 并且可以由不同的语言、系统和平台实现.
上图我们可以得出如下结论:
通过对比微服务与传统单体架构, 我们得知传统单体架构具有如下特点:
微服务在 SOA 服务化的基础上进行演进和叠加, 形成了适合现代化应用场景的一个方法论.
1.目的不同
SOA 服务化涉及的范围更广一些, 强调不同的异构服务之间的协作和协议, 并强调有效集成、业务流程编排、历史应用集成等, 典型代表 Web Service 和 ESB.
微服务使用一系列的微小服务来实现整体的业务流程, 目的是有效的拆分应用, 实现敏捷开发和部署, 在每个微小服务的团队里, 减少了跨团的沟通, 让专业的人做专业的事, 缩小变更和迭代影响的范围, 并达到单一微服务更容易水平扩展的目的.
2.部署方式不同
微服务将完整的应用拆分成多个细小的服务, 通常使用敏捷扩容、缩容的 Docker 技术来实现自动化的容器管理, 每个微服务运行在单一的进程内, 微服务中的部署互相独立、互不影响.
SOA 服务化通常将多个业务服务通过组件化模块方式打包在一个 war 包里, 然后统一部署在一个应用服务器上.
3.服务粒度不同
微服务倡导将服务拆分成更细的粒度, 通过多个服务组合来实现业务流程的处理, 拆分到职责单一, 甚至小到不能再进行拆分.
SOA 对粒度没有要求, 在实战中服务通常是粗粒度的, 强调接口协议的规范化, 内部实现可以更粗颗粒.