「萌新指南」SOA vs. 微服务:What’s the Difference?
实话实说,在我还没有实习之前,我是连 SOA 是啥都不知道的,只听说过微服务,毕竟微服务实在太火了,想不知道都难,我觉得实习的时候肯定也是微服务,进组之后发现是 SOA 架构,当时都懵了,看了很多文档做了很多笔记都还是不太明白 SOA 是啥,后来又困惑于 SOA 和微服务的区别是啥,我还去翻了一下《凤凰架构》这本书,遗憾的是,由于我刚刚接触 SOA,微服务也没有实际上手过,所以尽管周志明老师的文字已经非常小白向,但是我还是没能懂 SOA 和微服务到底有啥实质上的区别。
这俩天看见了 IBM 的一篇文章,真的醍醐灌顶,本文对这篇文章的部分段落进行翻译,然后结合之前看过的资料加入一些自己的理解,原文地址在这里,感兴趣的小伙伴可自行去阅读英文原文哈:https://www.ibm.com/cloud/blog/soa-vs-microservices
什么是 SOA
SOA 的全称是 Service-Oriented Architecture,面向服务的架构。注意这是一种架构哈,我刚开始还以为是跟 Dubbo 一样的这种框架,hhh,这里为我的无知道歉。

SOA 是一种全企业范围(enterprise-wide)的应用软件开发方法,其核心在于利用可重复使用的软件组件(software components)或服务(services)。在 SOA 软件架构中,每项服务都由执行特定业务功能所需的代码(code)和数据集(data integrations)组成 。
In SOA software architecture, each service is comprised of the code and data integrations required to execute a specific business function
更通俗点来说,SOA 就是把系统按照实际业务拆分成刚刚好大小的、合适的、独立部署的模块,各个模块包含各自所需的代码和数据集,并且每个模块之间相互独立。
举个例子,一个银行网站可能会包含以下几种服务:检查客户的信用、登录网站或处理抵押贷款申请。这三种服务分别包含与各自业务相关的代码和数据集。
从代码层面直观来说,每个服务由以下三个部分组成:
- interface 接口:暴露给消费者使用的接口
- contract 契约:规定了服务提供者和服务消费者应该如何互动
- implementation 接口实现:接口的具体实现
SOA 于 20 世纪 90 年代末出现,是应用开发和集成发展的重要阶段。在 SOA 架构火起来之前,将单体应用程序(monolithic application)与另一个系统中的数据或功能连接起来需要复杂的点对点集成(point-to-point integration),并且一旦出现一个新项目,开发人员又得为这个新开发项目重新创建这些集成。而通过 SOA 将这些通用功能暴露出来(或者说共享出来),开发人员就无需每次都要重新写一遍重复代码了。
当然,这种方式既是一种好处,也是一种风险。由于很多应用程序都共享访问了某个服务,那如果这个服务出现问题了,这些应用程序也会受到级联影响。
举个通俗点的例子:(来自知乎高赞,稍作修改:光太狼 - https://www.zhihu.com/question/42061683)
比如现我有一个数据库,一个 JavaWeb 的网站客户端,一个安卓 App 客户端,一个 IOS 客户端。
现在我要从这个数据库中获取注册用户列表,如果按照单体应用程序的设计思想,那么就是这样的思路:JavaWeb里面写一个查询方法从数据库里面查数据然后在网页显示,安卓 App 里面写一个查询方法查询后在 App 上显示,IOS 同样如此。这样,同样的一套查询方法出现了三次,代码非常冗余,三个地方都有相同的业务代码,如果需要改动的话三个地方都要改,而且要改的一模一样。当然问题不止这一个。
于是乎出现了这样的设计思想,比如用 Java(或者是其他语言皆可)单独创建一个工程部署在一台服务器上,并且写一个方法(或称函数)执行上述查询操作,然后使其他人可以通过某种途径(可以是 HTTP 链接,或者是基于 Socket 的 RPC 调用)访问这个方法得到返回数据,返回的数据类型是通用的 JSON 或者 Xml 数据,就是说把这个查询操作封装到一个工程中去,然后暴露访问该操作的方式,形成 “服务”(服务接口)。
这样一来,JavaWeb 这边可以访问这个服务然后得到数据使用,安卓和 IOS 这里也可以通过这个服务得到数据。而且最重要的是,要修改关于注册用户的业务方法只要改这个服务就好了,很好的解耦。同理,其他业务比如商品、广告等业务都可以单独形成服务部署在单独服务器上。
还有一种情况就是一旦哪天突然有一堆人要注册,假设这堆人仅仅只是注册而不做其他事情,其他业务比如商品、广告服务等都不忙,唯独注册这个服务压力很大,而原有的一台部署了注册服务的服务器已经承受不了这么高的并发,这时候就可以单独集群部署这个注册服务,提供多几台服务器提供注册服务,而其他服务不用动,维持原样就好了。
当然,以上举的例子其实并不能完全称为 SOA,还不够完整,因为它少了 服务治理 这一环节。
什么是服务治理,就是当服务越来越多,调用方也越来越多的时候,它们之间的关系就变得非常混乱,需要对这些关系进行管理。
还是上面的例子,假如我有一个用户服务,一开始有调用方 1 和调用方 2 来使用这个服务,后来越来越多,将近上百个调用方,这个时候作为服务方,它只知道提供服务,却不知道具体为谁提供了服务。而对于开发者来说,知道这 N 个调用方和 N 个服务方之间的关系是非常重要的。
所以这个时候就需要能进行服务治理的框架,比如 Dubbo + Zookeeper、Spring Cloud 等,有了服务治理功能,我们就能清晰地看到服务被谁谁谁调用,谁谁谁调用了哪些服务,哪些服务是热点服务需要配置服务器集群,而对这个服务集群的负载均衡也是服务治理可以完成的重要功能之一。
这个时候就是更加完善一点的 SOA 了。当然,还可以更进一步,加上 服务监控跟踪 等等之类的。
什么是微服务
直接举例:一个在线购物网站会有一些不同的功能,比如产品目录、购物车和下单等等。
使用 SOA 的开发公司一般会将购物网站拆分成主要的业务逻辑组,并将每个部分作为独立应用分别开发,最后集成到一起。具体开发流程包括事先定义好需要暴露给外部调用的服务接口,比如添加购物车操作和下单操作,然后围绕服务接口进行开发。
这样,如果其他应用比如火车票模块也需要下单操作,那么直接调用这个服务接口就行了,不用重新添加
各位应该能看出 SOA 这里存在的一个问题,那就是由于围绕主要的业务逻辑来划分,所以 SOA 的粒度是比较大的。比如说,我们现在围绕添加购物车和下单这两个主要业务逻辑定义了两个服务接口,但是添加购物车和下单这两个服务中都存在显示商品名称这种粒度比较小的通用功能,这样,我们就不得不在这两个服务接口中写一套差不多的代码。
而使用微服务架构的开发公司会将购物车切分成较小的任务导向服务,不再是购物车应用了,而可能是显示商品名称服务、添加/移除商品服务、运费服务、汇率服务和订单撰写服务。购物车功能可能也会用到一些常用的服务——它们会用在这整个购物网站的很多地方,比如显示商品名称服务、显示产品图片服务、查看库存服务等。通用代码被封装成各种服务,待需要时用在各种功能中。
看下面这张网图,虽然有点不清晰,但是真的很通俗易懂了 :

SOA 和微服务的主要区别:范围
相信大家看完上面的例子也能够理解了。
这两种方法的主要区别归结于范围 scope。简单地说,服务型架构(SOA)粒度比较大,服务于企业范围,而微服务架构粒度比较小,服务于应用范围。

所以 If you accept the difference in scope, you may quickly realize that the two can potentially complement each other, rather than compete.
两者是相互补充,而不是竞争。
关注公众号 | 飞天小牛肉,即时获取更新
博主东南大学硕士在读,携程 Java 后台开发暑期实习生,利用课余时间运营一个公众号『 飞天小牛肉 』,2020/12/29 日开通,专注分享计算机基础(数据结构 + 算法 + 计算机网络 + 数据库 + 操作系统 + Linux)、Java 技术栈等相关原创技术好文。本公众号的目的就是让大家可以快速掌握重点知识,有的放矢。关注公众号第一时间获取文章更新,成长的路上我们一起进步
并推荐个人维护的开源教程类项目: CS-Wiki(Gitee 推荐项目,现已累计 1.8k+ star), 致力打造完善的后端知识体系,在技术的路上少走弯路,欢迎各位小伙伴前来交流学习 ~
如果各位小伙伴春招秋招没有拿得出手的项目的话,可以参考我写的一个项目「开源社区系统 Echo」Gitee 官方推荐项目,目前已累计 900+ star,基于 SpringBoot + MyBatis + MySQL + Redis + Kafka + Elasticsearch + Spring Security + ... 并提供详细的开发文档和配套教程。公众号后台回复 Echo 可以获取配套教程,目前尚在更新中。
「萌新指南」SOA vs. 微服务:What’s the Difference?的更多相关文章
- 简单聊聊SOA和微服务
转自:https://juejin.im/post/592f87feb123db0064e5ef7c (2017-06) 简单聊聊SOA和微服务 架构设计中的朴素主义 前两天和一个朋友聊天,他向我咨 ...
- 「APIO2018新家」
「APIO2018新家」 题目描述 五福街是一条笔直的道路,这条道路可以看成一个数轴,街上每个建筑物的坐标都可以用一个整数来表示.小明是一位时光旅行者,他知道在这条街上,在过去现在和未来共有 \(n\ ...
- SOA和微服务架构
微服务架构强调的第一个重点就是业务系统需要彻底的组件化和服务化,原有的单个业务系统会拆分为多个可以独立开发,设计,运行和运维的小应用.这些小应用之间通过服务完成交互和集成.每个小应用从前端web ui ...
- SOA和微服务架构的区别
微服务架构强调的第一个重点就是业务系统需要彻底的组件化和服务化,原有的单个业务系统会拆分为多个可以独立开发,设计,运行和运维的小应用.这些小应用之间通过服务完成交互和集成.每个小应用从前端web ui ...
- 我所理解的SOA和微服务
本文原创,原文地址为:http://www.cnblogs.com/fengzheng/p/5847441.html SOA和微服务到底是什么关系? 说实话,我确实不明白SOA和微服务到底有什么本质上 ...
- SOA和微服务
SOA和微服务 SOA和微服务到底是什么关系? 说实话,我确实不明白SOA和微服务到底有什么本质上的区别,两者说到底都是对外提供接口的一种架构设计方式.我倒觉得微服务其实就是随着互联网的发展,复杂的平 ...
- SOA和微服务到底是什么关系
本文原创,原文地址为:http://www.cnblogs.com/fengzheng/p/5847441.html SOA和微服务到底是什么关系? 说实话,我确实不明白SOA和微服务到底有什么本质上 ...
- SOA和微服务到底是什么关系?
SOA和微服务到底是什么关系? 说实话,我确实不明白SOA和微服务到底有什么本质上的区别,两者说到底都是对外提供接口的一种架构设计方式.我倒觉得微服务其实就是随着互联网的发展,复杂的平台.业务的出现, ...
- 面试官灵魂三问:什么是SOA?什么是微服务?SOA和微服务有什么区别?
SOA SOA(Service-Oriented Architecture,面向服务的架构)是一种高层级的架构设计理念,可通过在网络上使用基于通用通信语言的服务接口,让软件组件可重复使用. 那么什么是 ...
随机推荐
- 【LeetCode】111. 二叉树的最小深度
111. 二叉树的最小深度 知识点:二叉树,递归 题目描述 给定一个二叉树,找出其最小深度. 最小深度是从根节点到最近叶子节点的最短路径上的节点数量. 说明:叶子节点是指没有子节点的节点. 示例 输入 ...
- 一次搞懂JavaScript对象
索引 目录 索引 1. 对象与类 2.对象使用 2.1 语法 2.2 属性 3.对象特性 4.对象的创建 4.1 字面量 4.2 工厂函数 4.3 构造函数 4.4 class类 4.5 对象与单例模 ...
- 01.泛型Generic
1. 基本了解 1.1 什么是泛型? 字面意思:不确定的类型 泛型常用:泛型方法,泛型类,泛型接口,泛型委托 1.2 泛型 T(熟悉) T 的作用,其实就是一个通用的容器,制造它的人开始不指定它是用来 ...
- 【动画消消乐|CSS】调皮逃跑的小方块 077
前言 Hello!小伙伴! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出- 自我介绍 ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计 ...
- QGIS打印布局中绘制多个子图
QGIS如何绘制多图 数据准备 这是一份英国大曼彻斯特地区的数据,里面包含了教育.收入.人口密度.绿地比例.城市比例等数据,我们准备把这些数据在地图上呈现出来,为此,我们需要做在地图中绘制6幅子图,这 ...
- Android 自定义属性(attrs)、样式(Style)、主题(Theme)
Android 自定义属性(attrs).样式(Style).主题(Theme) https://www.cnblogs.com/dandre/p/4507024.html https://blog. ...
- [TensorFlow2.0]-手写神经网络实现鸢尾花分类
本人人工智能初学者,现在在学习TensorFlow2.0,对一些学习内容做一下笔记.笔记中,有些内容理解可能较为肤浅.有偏差等,各位在阅读时如有发现问题,请评论或者邮箱(右侧边栏有邮箱地址)提醒. 若 ...
- MyBatis学习05(多对一和一对多)
8.多对一的处理 多对一的理解: 多个学生对应一个老师 如果对于学生这边,就是一个多对一的现象,即从学生这边关联一个老师! 数据库设计 CREATE TABLE `teacher` ( `id` IN ...
- IDEA Maven快速创建JavaWeb项目
鉴于这是基本功,而且发现自己经常犯类似的错误,因此详细记录一下这个问题. 1.准备 以笔者的测试软件以及版本为准 IDEA 2020.3 Maven3.6.5 Tomcat 8.5 JDK1.8 2. ...
- 使用autopep8自动规范化python3代码
技术背景 编码规范是所有编程语言都有可能面临的问题,严格的按照编码规范来写代码,不仅能够提高代码的可读性,在后续程序的可维护性上面也有较大的帮助.尤其是在开源项目中,一个具备良好编程规范的项目往往能够 ...