微服务是SOA,微服务也不是SOA

文章目录

      • 一、什么是SOA?
    • 什么是微服务?
      • SOA 和微服务的区别

公众号: MCNU云原生,文章首发地,欢迎微信搜索关注,更多干货,第一时间掌握!

本文源自一次面试官的提问:你觉得微服务和SOA架构有什么联系和区别?回想起来,在我一开始接触到微服务的概念的时候,我也萌生过这个疑惑。于是借着这个机会我认真思考了这个问题,有点自己的想法写下来,未必是合适的, 也希望不对之处大家给指出来。

一、什么是SOA?

SOA 出现于 20 世纪 90 年代后期,1994年,Gartner最早提出SOA。它代表了应用程序开发和集成发展的一个重要阶段。在 SOA 成为一种选择之前,将单体应用程序连接到另一个系统中的数据或功能需要复杂的点对点集成,开发人员必须为每个新的开发项目重新创建。通过 SOA 公开这些功能消除了每次都重新创建深度集成的需要。

维基百科上对于SOA的定义是这样子的:“面向服务的体系结构(英语:service-oriented architecture)并不特指一种技术,而是一种分布式运算的软件设计方法。软件的部分组件(调用者),可以透过网络上的通用协议调用另一个应用软件组件执行、运作,让调用者获得服务。”

在 SOA 软件架构中,每项服务都包含执行特定业务功能所需的代码和数据集成,这些服务模块之间相互独立,服务接口提供松散耦合,服务可以轻松被调用,由于这种松耦合和发布服务的方式,开发团队可以通过在整个企业的其他应用程序中重用组件来节省时间。

在SOA架构中一般使用企业服务总线ESB来提供模块之间的共享访问, 它是SOA架构常规实现方法中一个非常重要的组件。ESB通过使用标准网络协议(如 SOAP、XML、JSON、MQ )来开放服务以发送请求或访问数据,实现与各种系统间的协议转换、数据转换、透明的动态路由等功能,ESB的特性有:

  • 面向服务架构实现
  • 一般使用XML作为标准通信语言
  • 包含标准安全模型,用于认证、审计等功能
  • 支持服务编排
  • 包含基于标准的适配器(如J2C/JCA),用于集成传统系统
  • 包含转换服务(通常是使用XSLT),在发送应用和接收应用之间转换格式,简化数据格式和值的转换

SOA提供业务服务、企业服务、应用程序服务和基础设施服务等多种不同的服务类型,用于实现业务功能、基础功能等不同场景。每个服务由三个部分组成:

  1. 接口,它定义了服务提供者将如何执行来自服务消费者的请求。
  2. 合同,它定义了服务提供者和服务消费者应该如何交互。
  3. 实现,即服务代码。

只要以标准的规范提供的服务就能接入总线,以松耦合的方式对外提供。开发者可以通过组合 SOA 服务来创建更高级别的服务和应用程序。

从以上我们可以看出SOA作为一种架构方法,主要强调的特点有:

  • 服务之间松耦合
  • 服务编排和治理
  • 服务注册和发现
  • 服务需要可重用
  • 通过多个服务可以聚合成一个新的服务
  • 使用ESB作为消息管理实现服务之间的调用

什么是微服务?

与 SOA 一样, 微服务架构由松散耦合的、可重用的和专门的组件组成,这些组件通常彼此独立工作。微服务架构是一种面向服务的架构模式,将应用程序拆分为多个小型服务,软件由通过明确定义的API 进行通信,这些服务由各个小型独立团队负责,使应用程序更易于扩展和更快地开发、部署。

通常,Java 是开发微服务的首选编程语言,也可以使用其他编程语言,例如 Golang和Python。

"微服务"这个词是在2005年被首次提出的,当时指的是专注于单一职责的与语言无关的细粒度web服务,维基百科上对于微服务的定义是:微服务是一种软件开发技术,是SOA的一种变体。

微服务的发展很快,早就跳出一开始的狭窄的定义。它是一种真正的云原生架构方法,微服务通常在容器中运行,这使得它们在创建独立服务时更具可扩展性和可移植性。团队可以使用微服务更轻松地更新代码,为不同的组件使用不同的堆栈并独立地扩展组件,从而减少因单个功能可能面临过多负载而必须扩展整个应用程序相关的成本浪费。由于微服务之间的独立性,它的容错性更好。

总结一下,微服务强调的主要特性有:

  • 单一职责原则
  • 服务编排和治理
  • 服务注册和发现
  • 去中心化
  • 容错性设计
  • 演进式设计
  • 基础设施自动化
  • 分散治理

很明显可以看出,微服务和SOA架构强调的一些主要能力是相似的,微服务在SOA之上发展出了一些新的关注特性。

SOA 和微服务的区别

1、标准化与自由

我想这应该是这两种架构方法最大的区别。SOA架构的方法论即便从现在来看也是非常先进的,只是当初实现SOA的规范定义过于严格,导致整体架构实现过于复杂,例如构建于SOAP之上的ESB、SDO等,都让SOA的门槛变得更高,大公司还可以撑得住,小公司基本上很难驾驭。

它有点像EJB,虽然设想非常美好,但是脱离了人民群众,一旦不能被普遍应用,那么最终只能成为少数人的实验室用品。

微服务和SOA架构最大的区别在于,微服务是更加自由的架构风格,而SOA则为了实现大一统的架构定义出了更多的标准和约束,所以微服务有各种各样的实现形式,例如springcloud、dubbo、service mesh等,即便一个RPC也可以有gRPC、dubbo等各种各样的框架实现。

微服务要发展就必须脱离SOA强约束的标准,但是微服务的很多思想又脱胎于SOA,所以我觉得说微服务是SOA的一个变种,但是新时期的微服务不是SOA(不要贴上SOA)的标签也许是更合适的。

2、数据和存储

在SOA中,多个应用程序涉及到的数据,其要求是直接在其主要数据来源进行数据获取和更改,且通常抽象出所有服务共享的单个数据存储层,减少数据维护和重复。

而微服务则一般要求每个微服务都可以独立访问它所需要的数据,甚至有独立的数据库集群,复杂性变高了,但是耦合性、弹性、扩展性变得更好了。

3、通信

在微服务架构中,每个服务都是独立开发的,有自己的通信协议,可以是同步亦可以是异步;而对于 SOA,每个服务都必须共享一个称为企业服务总线 (ESB) 的通用通信机制,通常服务间的调用是同步的,SOA 管理和协调它通过 ESB 交付的服务。然而,ESB 可能成为整个企业的单点故障,如果单个服务变慢,整个系统都会受到影响。

4、重用

在 SOA 中,服务的可重用性是架构追求的主要目标,可以基于可重用模块快速构建应用;而在微服务中,则更加强调敏捷和弹性,更倾向于通过复制和接受数据重复来重用代码,实现解耦。

5、应用场景

SOA适合庞大、复杂、异构的企业级系统;而微服务更适合快速、轻量的互联网服务,微服务也常常和Devops结合起来。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/18576.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SwinIR Transformer训练教程(使用自己的数据集)

使用自己的数据集训练SwinIR Transformer SwinIR Transformer图像超分辨率重建训练教程 目录 使用自己的数据集训练SwinIR Transformer一、使用MATLAB对数据集进行BICUBIC插值下采样二、使用MATLAB对数据集进行BICUBIC插值下采样三、训练3.1 下载训练源代码3.2 修改json文件3.…

linux开发工具:git

文章目录 1:Git简介2:Git简明指南2.1:创建新仓库2.2:检出仓库2.3:工作流2.4:添加和提交2.5:推送改动2.6:分支2.7:更新与合并2.8:标签2.9:替换本地…

【数据结构】非线性结构之树结构(含堆)

前言 前面的三篇文章已经将线性结构讲述完毕了,下面的文章将会为大家将讲点新东西:非线性结构中的树结构。萌新对这里的知识点相对陌生,建议反复观看!! 关于线性结构的三篇文章放在下面: 线性表之顺序表 线…

Kafka传输数据到Spark Streaming通过编写程序java、scala程序实现操作

一、案例说明 现有一电商网站数据文件,名为buyer_favorite1,记录了用户对商品的收藏数据,数据以“\t”键分割,数据内容及数据格式如下: 二、前置准备工作 项目环境说明 Linux Ubuntu 16.04jdk-7u75-linux-x64scal…

Hadoop知识点

1.HDFS写数据流程 客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在。NameNode返回是否可以上传。客户端请求第一个 Block上传到哪几个DataNode服务器上。NameNode返回3个DataNode节点&#…

车载以太网 - SomeIP - 协议用例 - RPC

目录 RPC Protocol specification 1、Cleint和Server端应该为一个服务实例的所有的Methodsevents使用一个TCP连接

Android Java代码与JNI交互字符串转换(四)

🔥 Android Studio 版本 🔥 🔥 创建JNIString.java 🔥 package com.cmake.ndk1.jni;public class JNIString {static{System.loadLibrary("string-lib");}public native String callNativeString(String str);public native void stringMethod(String str)…

pd虚拟机 Parallels Desktop ,让你能够在Mac电脑上同时运行Windows和macOS,简直太棒了!

最近我发现了一款软件——Parallels Desktop,它让我能够在Mac电脑上同时运行Windows和macOS,简直太棒了!我想向大家推荐这款软件,因为它为我的工作和生活带来了巨大的便利和乐趣。 永久访问 https://www.hereitis.cn/soft/Paralle…

6.2.3 网络基本服务---文件传输协议(FTP)

6.2.3 网络基本服务—文件传输协议(FTP) FTP(File Transfer Protocol)是Internet上使用最为广泛的文件传送协议,FTP提供交互式的访问,允许客户上传文件到服务器或者从服务器下载文件,FTP屏蔽了…

《黑马头条》 ElectricSearch 分词器 联想词 MangoDB day08-平台管理[实战]作业

07 app端文章搜索 1) 今日内容介绍 1.1)App端搜索-效果图 1.2)今日内容 2) 搭建ElasticSearch环境 2.1) 拉取镜像 docker pull elasticsearch:7.4.0 2.2) 创建容器 docker run -id --name elasticsearch -d --restartalways -p 9200:9200 -p 9300:9300 -v /usr/share/elasticse…

关于Vue 、vue2、vue3

vue优点?vue2、vue3响应式比较? (1) 响应式编程 Vue 会自动对页面中某些数据的变化做出响应。通过 MVVM 思想实现数据的双向绑定,让开发者不用再操作 DOM 对象,有更多的时间去思考业务逻辑。 组件化开发…

springboot服务端接口公网远程调试,并实现HTTP服务监听

文章目录 前言1. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 2. 内网穿透2.1 安装配置cpolar内网穿透2.1.1 windows系统2.1.2 linux系统 2.2 创建隧道映射本地端口2.3 测试公网地址 3. 固定公网地址3.1 保留一个二级子域名3.2 配置二级子域名3.2 测试使用固定公网地址…