为什么我会了SOA,你们还要逼我学微服务?

640?wx_fmt=gif

菜菜哥,我最近需要做一个项目,老大让我用微服务的方式来做

640?wx_fmt=png
640?wx_fmt=jpeg

那挺好呀,微服务现在的确很流行

640?wx_fmt=png
640?wx_fmt=jpeg

我以前在别的公司都是以SOA的方式,SOA也是面向服务的方式呀

640?wx_fmt=png
640?wx_fmt=jpeg

的确,微服务和SOA有相同之处

640?wx_fmt=png
640?wx_fmt=jpeg
640?wx_fmt=gif

面向服务的架构(SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)进行拆分,并通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种各样的系统中的服务可以以一种统一和通用的方式进行交互。它是一种设计方法,其中包含多个服务,服务之间通过相互依赖最终提供一系列的功能。

640?wx_fmt=gif

微服务架构:其实和 SOA 架构类似,微服务是在 SOA上做的升华,微服务架构强调的一个重点是“业务需要彻底的组件化和服务化”,原有的单个业务系统会拆分为多个可以独立开发、设计、运行的小应用。这些小应用之间通过服务完成交互和集成。

640?wx_fmt=gif

基于SOA架构的系统,模块在进行划分的时候,颗粒度比较粗,比如一个会员系统SOA,可能包含会员基本信息管理,会员关系管理,会员资产管理等模块,这些模块统一规划在会员管理服务,部署的时候也在相同的进程中。如果按照微服务的理念来做架构设计的话,会员关系管理可能会是一个独立部署的服务,其他模块类似。是否需要独立,架构师需要根据这个模块的业务来决定,需要考察这个模块是否有独立的必要性。

640?wx_fmt=png

有的时候,一个系统的领域边界划分在SOA和微服务中可能相同。SOA和微服务本质上有着相同的架构思想,但是微服务根据业务形态又引入了组件化和领域建模的架构理念,在多数的应用场景中比SOA有着更易维护,扩展方便的优点。

640?wx_fmt=png

没太听明白,SOA和微服务有什么相同和不同吗

640?wx_fmt=png
640?wx_fmt=jpeg

相同点和不同点都很多

640?wx_fmt=png
640?wx_fmt=jpeg
640?wx_fmt=gif

无论是SOA还是微服务架构,都是系统发展到一定程度衍生而出的一种解决方案,都是为了解决系统存在的弊端而产生的架构方案。当系统一开始采用集中化部署的时候,随着系统模块越来越多,自然而然就产生了拆分的方案。

无论是SOA还是微服务架构都是根据业务进行拆分的结果,但是他们又有着很多不同。

服务通信

640?wx_fmt=gif

在SOA系统架构中,服务之间的调用采用ESB(企业服务总线)来进行通信。ESB负责服务定义、服务路由、消息转换、消息传递,总体上是重量级的实现。简单来说ESB就是一根管道,用来连接各个服务节点。

640?wx_fmt=other

微服务强调使用统一的协议和格式,例如,RESTful 协议、RPC 协议,无须 ESB 这样的重量级实现。也有的系统为了统一管理微服务系统,会部署一个统一的网关系统,网关是系统的唯一入口。从面向对象设计的角度看,它与外观模式类似。网关封装了系统内部架构,为每个客户端提供一个定制的API。它可能还具有其它职责,如身份验证、监控、负载均衡、缓存、请求分片与管理、静态响应处理。网关方式的核心要点是,所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有的非业务功能,每个服务都需要去服务管理中心去主动注册,这样才能实现服务的自动发现。

640?wx_fmt=other

服务划分粒度

640?wx_fmt=gif

整体上来说,SOA 的服务粒度要粗一些,而微服务的服务粒度要细一些。例如,对一个大型企业来说,“员工管理系统”就是一个 SOA 架构中的服务;而如果采用微服务架构,则“员工管理系统”会被拆分为更多的服务,比如“员工信息管理”“员工考勤管理”“员工假期管理”和“员工福利管理”等更多服务。

至于微服务的粒度要到什么程度,仁者见仁,智者见智,有的小伙伴说直到服务不能拆分为止,其实我认为这种想法是错的,一个微服务的拆分粒度,还是要根据你的具体业务来划分,根据你的依赖模块关系来划分,不要盲目拆分成太多颗粒度小的服务,这样在治理上会给团队带来很多困扰。举一个简单例子:员工管理系统中,如果考勤管理和假期管理之间业务关系非常密切,而且有很多操作需要事务性原子操作,你可以考虑将这两个微服务合并。

640?wx_fmt=png

SOA鼓励组件的共享,而微服务尝试通过“上下文边界”来最小化共享。

640?wx_fmt=png

服务交付

640?wx_fmt=gif

无论是SOA还是微服务,每个独立的系统都可以采用不同的编程语言来开发,只要对外提供的接口协议符合标准就可以。在开发方面,由于微服务会采用划分粒度更小的策略,所以实际情况中服务的数量会比SOA架构方式要多很多,微服务的架构理念要求“快速交付”,相应地要求采取自动化测试、持续集成、自动化部署等敏捷开发相关的最佳实践。如果没有这些基础能力支撑,微服务规模一旦变大(例如:超过 20个微服务),整体就难以达到快速交付的要求,这也是很多企业在实行微服务时踩过的一个明显的坑,就是系统拆分为微服务后,部署的成本呈指数上升。

640?wx_fmt=png

如果企业内部快速交付的基础设施比较薄弱,采用微服务架构方式后期也许会遇到部署成本的问题。

640?wx_fmt=png

适用场景

640?wx_fmt=gif

微服务适合那些需要快速交付,比较轻量级的互联网应用。现代互联网变化迅速,每个系统都需要快速尝试,快速交付,这也是产生微服务架构的主要原因之一。由于每个服务都可以单独部署,所以在那些大并发的情况下,更容易横向扩展,就算是某个服务down掉,也不会影响其他的服务正常运行。而SOA由于ESB的存在,一旦ESB挂掉,会影响到所有系统正常运行。

SOA相比较微服务,更适合那些访问量较小,但是业务体系庞大,复杂的企业级系统。当一个企业级的系统发展到一定程度,SOA会应运而生,而且这个系统还会延续很长时间,期间还会采用不同的技术栈来开发不同的系统,这些系统会不断集成进来,如果想要推倒重来或者进行大规模的优化,人力物力上根本得不偿失,所以这样的系统只能以兼容的方式继续,而承担各个异构系统通信的重要组件就是ESB。

听你这么一讲,我好想明白了很多,下次出去面试就又多了一分把握

640?wx_fmt=png
640?wx_fmt=jpeg

每种技术都有它自己的适用场景,不要被微服务的吹嘘迷失了方向

640?wx_fmt=png
640?wx_fmt=jpeg
640?wx_fmt=png

SOA和微服务本质上是两种不同的架构设计理念,即使他们在服务这个概念和划分思想上有交集。由于是两种不同的架构模式,所以在应用上并不存在孰优孰劣,只有是否合适之分。具体采用哪种架构设计,最终还是要取决于你的应用场景和目的。SOA更适合需要与许多其他应用程序集成的大型复杂企业应用程序环境。这就是说,小型应用程序不适合SOA架构,因为它们不需要消息中间件组件。而微服务架构,在另一方面,是更适合于较小和良好的分割,基于Web的系统。如果你开发的是互联网应用,并且没有历史遗留问题,请优先考虑采用微服务架构。

640?wx_fmt=png

640?wx_fmt=png

功能SOA微服务
系统划分大块业务逻辑单独任务或小块业务逻辑
系统通信ESB统一的协议标准
服务交付手工交付自动化快速交付
适用场景企业内部互联网应用
管理着重中央管理着重分散管理
扩展难扩展单个服务很容易横向扩展


640?wx_fmt=gif

关注后回复:“大礼包”和“福利”,领取惊喜

长按识别二维码关注

640?wx_fmt=jpeg
640?wx_fmt=png
在看点一下

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

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

相关文章

面对万物互联的智能世界,你是否也想分一杯羹

第六届世界互联网大会于10月20日至22日在浙江乌镇顺利举行。作为世界互联网大会“13”架构的重要组成部分,“互联网之光”博览会以“智能互联网、开放合作——携手共建网络空间命运共同体”为主题,集中展示了全球范围内的互联网新技术、新成果、新产品、…

你必须知道的容器监控 (2) cAdvisor

# 实验环境:阿里云ECS主机(两台),CentOS 7.401—cAdvisor简介为了解决容器的监控问题,Google开发了一款容器监控工具cAdvisor(Container Advisor),它为容器用户提供了对其运行容器的…

代码阅读

http://alanse7en.github.io/caffedai-ma-jie-xi-4/ 三. 从一个比较宏观的层面上去了解caffe怎么去完成一些初始化的工作和使用Solver的接口函数,本文将主要分为四部分的内容: Google Flags的使用Register Brew Function的宏的定义和使用train()函数的…

动手造轮子:实现一个简单的依赖注入(一)

动手造轮子:实现一个简单的依赖注入(一)Intro在上一篇文章中主要介绍了一下要做的依赖注入的整体设计和大概编程体验,这篇文章要开始写代码了,开始实现自己的依赖注入框架。类图首先来温习一下上次提到的类图服务生命周期服务生命周期定义&am…

Qt 调试Caffe

http://blog.csdn.net/xg123321123/article/details/52817658 1.下载并安装Qt Creator 下载页面,推荐使用4.x版本,比如: Qt Creator 4.1.0 for Linux 64-bit下载的是run包,安装方法: cd到下载目录 chmod x xxx.run …

.NET Core 3.0 本地工具

.NET Core从最早期的版本就开始支持全局工具了。如果仅仅需要在某个项目中或某个文件夹中使用特定的工具,那么.NET Core 3.0就允许您这样做。 使用.NET Core 3.0,您可以在特定的文件夹下安装“本地”工具,它的作用范围仅限于该文件夹及其子文…

Nsight 调试 Caffe

http://blog.csdn.net/u014114990/article/details/47723877 右键属性菜单的General->Code Analysis->Paths and Symbols下进行加入: Includes下加入程序需要用到的头文件的路径: Library Path下添加需要用到库文件的路径: 具体用到的…

张高兴的 .NET Core IoT 入门指南:(五)PWM 信号输出

什么是 PWM在解释 PWM 之前首先来了解一下电路中信号的概念,其中包括模拟信号和数字信号。模拟信号是一种连续的信号,与连续函数类似,在图形上表现为一条不间断的连续曲线。数字信号为只能取有限个数值的信号,比如计算机中的高电平…

.NET Core 3 对 IoT 应用程序的高级支持:System.Device.Gpio

System.Device.Gpio 是一个全新的 .Net Core 开源库,它旨在使 IoT(物联网)应用程序能够通过其 GPIO 引脚或其他 I/O 控制硬件与传感器、显示器和输入设备进行交互。该库是由社区维护的多个设备绑定集合来进行增强实现的。正如微软 .NET 项目…

代码阅读2

http://blog.csdn.net/u014568921/article/details/53995455 首先,要知道caffe里的卷积核都是三维的 在caffe中卷积核是三维的还是二维的? 下面分割线之间的内容来自http://blog.csdn.NET/u014114990/article/details/51125776 /*********************…

一文带你了解华为云DevCloud为何能全面领跑中国DevOps云服务市场

近日,国际权威调研机构IDC发布了《IDC MarketScape:中国DevOps云服务市场2019厂商评估》报告,该报告从战略和能力两个维度对国内主流DevOps云厂商进行了评估,报告显示,华为云位于 IDC MarketScape “中国DevOps云服务 …

[电子书制作]Excel催化剂输出内容汇总PDF及Word版本分享

Excel催化剂在2018年开始,陆续写出了230篇高质量原创性文章,将Excel催化剂插件的开发过程及使用方法全方位地通过文字的方式给广大网友们分享了。电子书下载方式同样地,为了减少大家过多繁琐的资料下载途径,电子书的下载路径和之前…

深入理解.NET Core的基元: deps.json, runtimeconfig.json, dll文件

原文链接: Deep-dive into .NET Core primitives: deps.json, runtimeconfig.json, and dlls作者: Nate McMasterC#编译器(The C# Compiler)C#的编译器可以将cs文件转换为dll文件, 即程序集文件。程序集文件是一个便携的可执行格式文件, 借助.NET Core,它…

C# 8.0 的默认接口方法

例子直接看例子有这样一个接口: 然后有三个它的实现类: 然后在main方法里面调用: 截至目前,程序都可以成功的编译和运行。 IPerson接口变更 突然,我想对所有的人类添加一个新的特性,例如,添加一…

convolutional layer 源代码

http://blog.csdn.net/xizero00/article/details/51049858 一、 卷积层的作用简介 卷积层是深度神经网络中的一个重要的层,该层实现了局部感受野,通过这种局部感受野,可以有效地降低参数的数目。我们将结合caffe来讲解具体是如何实现卷积层的…

在.net core3.0中使用SignalR实现实时通信

最近用.net core3.0重构网站,老大想做个站内信功能,就是有些耗时的后台任务的结果需要推送给用户。一开始我想简单点,客户端每隔1分钟调用一下我的接口,看看是不是有新消息,有的话就告诉用户有新推送,但老大…

活动最后72小时:购书优惠劵,折后再折,赶紧来抢啊

1024程序员节当当网计算机图书每满100减50!满200减100!满300-150!机械工业出版社华章公司联合当当网特意为【DotNET技术圈】用户申请了一批可与满减叠加使用的“满200减30”的图书优惠码,优惠码使用后相当于:400减230 …

C# 8 新特性 - using 声明

using语句块 尽管.NET Core运行时有垃圾收集器(GC)来负责内存清理工作,但是我们还是要自己确保当非托管资源不再使用的时候应该被清理掉。以前针对实现了IDisposable接口的对象,我们经常会使用using 语句块来这样做: 这…

.Net Core3.0依赖注入DI

构建ASP.NET Core应用程序的时候,依赖注入已成为了.NET Core的核心,这篇文章,我们理一理依赖注入的使用方法。不使用依赖注入首先,我们创建一个ASP.NET Core Mvc项目,定义个表达的爱服务接口,中国小伙类实现…