首页 程序笔记 服务架构进化论

服务架构进化论

1.原始分布式时代

 

  一直以来,我可能和大多数的人认知一样,认为我们的服务架构的源头是单体架构,其实不然,早在单体系统盛行之前,

我们的前辈们就已经

 

探索过使用多个独立的分布式服务共同完成一个大型的系统的实现方案。

 

众所周知,计算机的伊始是一个庞然大物,大概需要一整间屋子才可以容得下它那巨大的身躯。后来到了20世纪70年代末,

计算机终于被聪明的

 

科学家们设计再设计,摇身一变成了微型机,可以摆放在桌子上的那种。可这时候的微型计算机仍然属于它的时代的婴儿

期,它没有我们想象中

 

的高速的运算能力,它通常只有16位寻址能力、不足5MHz的时钟频率和128KB的内存空间,这种有限的运算处理能力直接

限制住了单台计算机上

 

可以运行的系统的规模,根本不利于我们来开发出一个理想的业务系统。

 

为了解决单个计算机处理能力有限的问题,聪明的科学家们想出了一个分而治之的好方法,一台咱不够用咱就搞两台,

两台不够用咱搞10台,

 

大问题拆解成小问题,大系统拆解成小系统让他们互相配合么,这不就解决了。想法确实不错只可惜出现的时代不对,

我就想说一句:

 

泰勒公式你找一个婴儿推理不出来,那找10个婴儿让他们互相商量商量就能推导出来了?

 

前辈们从来不只是说说而已,搞分布式那可是真的搞,于是早期的IT泰山北斗们开始浩浩荡荡的干起来了。

 

大家一块制定“分布式运算环境”(DCE)的分布式技术体系,包含了一些远程调用规范、分布式文件系统、服务认证规范、

时间服务及明明目录服务等等,

 

甚至如今我们IT行业最熟悉不过的UUID也是在DCE中发明出来的,可以说DCE是现代分布式的一个鼻祖。

 

搞分布式自然少不了远程调用,可是对于当时的计算机硬件水平来讲,一旦加上远程两字,那执行时间是呈几何式的

倍数增长,效率也大打折扣,

 

况且对于服务的一些发现、负载均衡、服务熔断隔离降级等问题都没有一个十分完善的解决方案,就像我提到的那

样,我们的微型计算机伊始

 

就像一个婴儿一样,它太弱小了,弱小到根本没有足够的能力支持它和其他的计算机很好的去配合。至于如何去构

建大规模的软件系统,要么

 

就是尽快提升单机的处理能力,要么就是找到一条更完美的解决构建分布式系统的方案。

 

  探索从未停止,但是原始的分布式时代高歌几年却终究没有盛行起来。

2.单体系统时代

  单体架构算是大家最熟悉的一种架构了吧,基本每个开发者在学习时,都会去实践的一种架构。仔细想来,我从工作到现在还真没搞过单纯的

单体架构,开始两年整的SOA,这两年一直是微服务。不过抛开整个大型系统来讲,单纯的看微服务架构中的某个服务,这也可以称得上是一个增强

版的单体架构吧,只不过多了些服务注册了、feign远程调用了、包的结构设计更加趋于现在风格,主体业务代码的编写感知上和单体系统并无很多

差别。当然放在整体系统来讲,那差异确实大了,单体系统将所有的模块功能都放在这个一个服务里,耦合度比较高,而微服务却拆分出来了,每个

模块的职责比较明确,每个模块自成一个服务,很好的诠释了弱耦合、高内聚的概念。

 

  自从20世纪80年代后,摩尔定律开始稳定发挥作用,计算机的性能以每两年一倍的惊人速度提升,我们的信息还没有像今天一样呈爆炸式增长,

也没有那么多如今的各种高流量高并发的大规模场景,单台服务器或者少量几台服务器足可以支撑起大型信息系统的运作,于是单体系统时代来了,

它足足占据主流地位了30年,放在如今很多小公司小系统也不乏有很多使用单体架构的。

 

  单体系统到底是什么?从整体概念来看,他无非就是一个人也可以活得像一支队伍,好比如今我们的电商系统,可能大家都选择将用户模块、

订单模块、支付模块、商品模块等等拆到不同服务中去运行,各司其职,有用得到对方的去调用一下,但是单体系统不会这样干,它就喜欢独掌

大权的感觉,上文所述的众多功能它全自己一个人来搞定,有我一台服务就够了,绝对不会像其他服务通信求救,要是其中某个功能出了问题,

咱大伙一块全下线;从架构划分上,单体架构内部的管理也是有模有样的,像我们最熟悉的MVC架构、SSM组合拳,通常不就是划分为了Controller

表示层、Service业务层、Mapper持久层、DataBase数据库层。它的问题排查与运维成本通常也比我们如今盛行的微服务小很多,毕竟就一个服务

在那,出了问题很明显就是它的错。

 

  虽然说单体架构有自己的局限性,但不可否认我们如今新兴的所有架构都是在它的基础上演变来的。

3.SOA时代

  关于SOA架构,坦白讲,这是我最没信心讲明白的一个架构了,因为从这几年的经历来讲,总感觉他没有一个很系统的架构模式的定义,说他是

单体但是他已经存在多个服务属于分布式了,说他是微服务总感觉还差点意思,没有划分那么微小的粒度,虽说我工作前两年时同事告诉我咱使用的

是SOA架构,但事实上,我当时对架构二字没有那么大的感知,能开发能写代码不就行了,接下里我就谈下我的一些不成文的浅陋认知,假设不对的

地方还请多多包涵,批评指出。

  SOA其实就是面向服务的架构,它对于服务的封装性、自治性、松耦合、可重用性有清晰的指导规则,它要求每个服务更具体更系统,与其说他

是一套架构,倒不如说SOA是一套思想,每个公司可以根据自己的业务场景,按照它的指导思想去开发属于自己的系统架构,在这里我想谈两种架

构的设计方式,大家也可以评估下是否可以归为SOA架构的范畴。

  第一种大概是我19年-21年一直在经历的一种架构模式,开发技术就是SpringBoot + SpringData JPA,服务划分大概分为了基础服务、业务系统

服务、定时服务三个服务,基础服务大概就是涵盖了一个系统最基础的那些功能模块:权限、角色、用户、审批流等等,每个功能模块用分包的方

法区分开;而业务系统服务则是包含了各种业务性的功能,功能模块还是蛮多的,这里为了保密也就不展开说了,当时每个功能模块的区分方式一

样也是分包路径的处理的;定时服务也是将所有的job加到这个服务里来开发。然后当时整个项目当时是没有注册中心的,也没有网关,也没有配置

中心,服务之间的调用的通过feign-url的方式进行,比较优秀的一点它还引用了seata做了分布式事务的管理,每个服务有自己的DB,可以说这个系

统确实是一个分布式的系统了,但是归为微服务还是欠缺点火候的,毕竟那些众多的业务模块并没有单独的划分出来自成一个服务,一个的功能模块

出问题其余的也多少受影响的,不过也确确实实的算是面向服务开发了,所以将它归为SOA的范畴我觉得也是有些道理的。

  第二种呢是我平时看一些学习视频提到的,它是一个标准的垂直划分的架构,自上而下分别拆分为了应用层、业务服务层、基础业务层、基础服

务层、存储层。应用层也叫作接入层,只负责接收来自于用户的请求,不会直接访问DB,通过请求下游服务的接口来处理数据;业务服务层主要是

用于处理各种业务场景,比如招聘网站的话就是处理一些职位搜索,简历投递一类的业务;而基础业务层则是处理一些系统最基础的核心功能,像

招聘网站的职位管理、简历管理、可以为上游的业务服务层提供一些api的支持;基础服务层则是一些业务无关的模块,用于管理一些消息推送、附

件解析、定时任务,这个服务的特点则是请求量大、逻辑简单、功能独立;而存储层则就是一些mysql、mongodb、Es一类的。整个系统呢引用了

Dubbo及zookeeper来完成服务的治理的。

  其实从服务拆分来看,第二种比起第一种来讲只是把controller应用层单独拆出了一个服务,其余的拆分手法还是蛮像的。从技术来看,第一种

不含注册中心,而第二种却使用了zookeeper来充当了注册中心。二者有共性也有差异,但总归来想,都是往拆分服务的方向看齐,确实比起单体架

构发生了质的改变。

 

4.微服务时代

  微服务大概是目前正在流行的一种服务架构了,多少曾经的SOA架构拥护者也慢慢的向微服务靠拢,从概念上来讲,微服务是一种通过多个小型

服务组合来构建单个应用的架构风格,这些服务围绕着业务能力而非特定的技术标准来构建。各个服务可以采用不同的编程语言、不同的数据存储

技术、运行在不同的进程中,服务采取轻量级的通信机制和自动化的部署机制来实现通信与运维。

 

  《凤凰架构》一书提到,微服务有九个核心的业务与技术特征,分别是:围绕业务能力构建、分散治理、通过服务来实现独立自治的组件、产品

化思维、数据去中心化、强终端若管道、容错性设计、演进性设计、基础设施自动化。通俗来讲,就是要我们根据业务场景来进行颗粒度的服务拆分,

每个微服务又自成一个可以独立运行的系统,可以分散不同人来管理,服务之间的通信尽可能的简单快捷,要考虑到扩容性和容错性能,由于一个系

统拆分为众多的微服务所以在部署时也要完成自动化的构建,减少不必要的人为操作,以防等待时间过久或操作失误。

 

  关于微服务系统的技术实现,我们通常使用第一代springcloud的组件或者使用第二代Springcloud alibaba的各种组件来实现,第一代springcloud

组件比较盛行的是:eureka服务注册中心、ribbon负载均衡、hystrix熔断器、feign远程调用组件、zuul网关、spring cloud config分布式配置中心、

spring cloud stream消息驱动组件。而第二代比较盛行的是nacos服务注册与配置中心、gateway网关组件、Sentinel流量控制熔断降级组件、seata

分布式事务管理组件。当然,二者的使用大可不必将界限划分那么清楚,没必要一套系统我使用第一代的就不使用第二代了,也没必要为证明自己

是搞得微服务就将所有组件堆砌而上,还是具体场景具体分析,就像我平时工作中一样,可能注册中心使用的eureka,而配置中心却用了nacos,

网关则用了gateWay,远程调用则使用了feign。

 

  微服务其实追求的是更加自由的架构风格,它抛弃了SOA中的那些条条框框的约束,用实践为标准代替了规范的约束。但这里我想讲的是,

并不是所有的系统都适合微服务,也是真的没必要无脑的往微服务靠拢,一个系统能用简单的方式应对,那完全没必要耗费资金人力去拆分出各式

各样的小服务来彰显自己的技术内涵,调用链路真的越短效率越高也不易出错。在这里我深有体会,前两年搞SOA时,其实公司真正经常改代码的也

就业务服务和基础服务两套,所以每次出问题能很快的定位到并解决,现在整这个微服务,整个大系统的微服务就有几十个,有很多服务由其他同

事管理而我自己并不熟悉,但是平时还需要调用他们提供的api,每次出现问题可能得拉会好几个同事一块讨论,问题解决难度增大了,而且上线时

好多服务要理清楚上线顺序和代码,生怕哪个服务忘了上线整出问题来。之所以很多公司需要使用微服务是因为自身的业务系统愈来愈复杂、流量

越来越多、数据信息变成海量才不得不去使用微服务的手段来应对,但是你的系统单一未来也很明确不会加入复杂的场景,那还是建议你保持初心吧。

5.后微服务时代

  微服务时代可以说是被Spring Cloud统治的时代,分布式架构中出现的注册发现、跟踪治理、负载均衡、传输通信,我们总能在Spring cloud提供的组件

中找到一个解决方案,但是这些解决方案都是软件的形式来提供的。不妨想一下,我们可不可以不局限于软件的方式,而考虑下硬件的解决方案呢?

  事实上,Kubernetes提供了一套基础设施层面的解决方案,下面将展示下与传统的第一代springcloud的解决方案的对比:

Kubernetes

Spring Cloud

弹性伸缩

Autoscaling

服务发现

KubeDNS/CoreDNS

Spring Cloud Eureka

配置中心

ConfigMap/Secret

Spring Cloud Config

服务网关

Ingress Controller

Spring Cloud Zuul

负载均衡

Load Balancer

Spring Cloud Ribbon

服务安全

RBAC API

Spring Cloud Security

跟踪监控

Metrics API/Dashboard

Spring Cloud Turbine

降级熔断

Spring Cloud Hystrix

  Kubernetes的整套解决方案得益于这些年虚拟化技术和容器化技术的发展,当虚拟化的基础设施从单个服务的容器扩展到多个容器构成的服务集群、

通信网络和存储设施时,软件与硬件的便已模糊。一旦虚拟化的硬件能够跟得上软件的灵活性,那么与业务无关的技术性问题便能从软件层面玻璃,

悄无声息的在硬件基础设施之内解决,让软件只专注于业务,真正的围绕业务能力来构建团队于产品。

  Kubernetes在容器生态发展中的崭露头角标志着后微服务时代的到来,但是它仍然有自己的缺点,很多场景的特殊性可能我们通过软件的手段很

容易就解决了,但是在硬件层面,它针对于整个容器来管理时粒度比较粗的,很多时候难以做到有效的管控,但是我们仍然可以相信,随着Kubernetes

的不断完善和进化,它会成为服务端的标准运行环境,它将会慢慢的可以取代今天Spring Cloud全家桶中大部分的组件的功能,微服务只需要考虑自身

的业务本身的逻辑,这将是智能终端的最终解决方案。

6.无服务时代

  谈到无服务时代我们不得不提起一个圈内耳熟能详的的词 ---- 云计算。百度百科上是这样介绍云计算的:云计算(cloud computing)是分布式计

算的一种,指的是通过网络“云”将巨大的数据计算处理程序分解成无数个小程序,然后,通过多部服务器组成的系统进行处理和分析这些小程序得到

结果并返回给用户。云计算早期,简单地说,就是简单的分布式计算,解决任务分发,并进行计算结果的合并。因而,云计算又称为网格计算。通过

这项技术,可以在很短的时间内(几秒钟)完成对数以万计的数据的处理,从而达到强大的网络服务。现阶段所说的云服务已经不单单是一种分布式

计算,而是分布式计算、效用计算、负载均衡、并行计算、网络存储、热备份冗杂和虚拟化等计算机技术混合演进并跃升的结果。云计算指通过计算

机网络(多指因特网)形成的计算能力极强的系统,可存储、集合相关资源并可按需配置,向用户提供个性化服务。

  有些专家预言:无服务将会成为未来云计算的主要形式。由于云计算将很多复杂的架构设计和难点处理全权托管到云端服务器来处理,因此对

于开发者来讲,完全就不需要来考虑技术组件了,因为组件是现成的;不需要考虑部署了,部署托管到了云端;不需要考虑算力了,有整个数据中

心支持着;不需要考虑运维了,有云计算的服务商帮你搞定。我们开发者仅仅需要纯粹的关注业务就好了。

  不管是SOA架构还是微服务架构,相比起最初的单体架构来讲,架构形式好像愈来愈复杂了,对开发者的技术要求也特别高,而无服务,则是

向简单发展,复杂的部分都托管向云端,未来若它成为大流行,那么所需的可能是业务极强的开发者,而不是单纯的技术牛人了,无服务它只涉及

两块内容:后端设施(Backend)和函数(Function)。

   后端设施是指数据库、消息队列、日志、存储,等等这一类用于支撑业务逻辑运行,但本身无业务含义的技术组件,这些后端设施都运行在云中

,无服务中称其为“后端即服务”(Backend as a Service,BaaS)。

   函数是指业务逻辑代码,这里函数的概念与粒度,都已经很接近于程序编码角度的函数了,其区别是无服务中的函数运行在云端,不必考

虑算力问题,不必考虑容量规划(从技术角度可以不考虑,从计费的角度你的钱包够不够用还是要掂量一下的),无服务中称其为“函数即服务”

(Function as a Service,FaaS)。

  坦白讲,至于它今后的一个运作方式我也无法具体描述,这种模式也在积极的探索中,至今并没有一个准确的落地实现,不管如何,社会

对于程序员的要求也仅仅不是技术那么简单了,做一名懂业务的程序员才是大势所趋。

 

后言:上述的很多观点一方面是自己总结的,另一方面是看的《凤凰架构-构建可靠的大型分布式系统》一书借鉴来的,不得不说,这本书真滴厚,

周志明老师是真滴强。这是我读这本书的第一篇心得,希望自己能在忙碌的工作生活中能坚持继续将这本书读完,写出更多的心得。

3

站心网

1.原始分布式时代 一直以来,我可能和大多数的人认知一样,认为我们的服务架构的源头是单体架构,其实不然..

为您推荐

微服务架构定义与特点总结

1. 定义微服务是一种架构风格,将应用程序拆分为多个小型、独立的服务,每个服务运行在自己的进程中,通过轻量级通信机制(如HTTP/REST)交互。每个服务围绕特定业务功能构建,可独立开发、部署和扩展。2. 特点独立..

架构与思维:微服务架构的思想本质

我们为什么需要微服务架构,它一定是为了解决我们某些问题才出现了。这篇文章我们讨论下微服务架构模式所解决的问题,带来的挑战,以及他的核心思想本质。1 早期的服务架构上图是一个典型的服务分层架构:Client: ..

架构与思维:秒杀和竞拍的业务架构,永不过时的话题

1 互联网架构越来越复杂?为啥感觉互联网架构越来越复杂了,早期我们的系统,可能也就那么少部分人使用,大都是一些后台管理系统。所以不用考虑很多东西,比如:流量少,无需考虑并发问题数据少,不用考虑什么索引优..

一文搞懂SaaS架构建设流程:业务战略设计、架构蓝图设计、领域系统架构设计、架构治理与实施

大家好,我是汤师爷~SaaS架构建设是一项复杂的系统工程,不仅需要技术层面的实现,更要从业务战略、架构设计、治理与实施等多个维度进行全面规划。一个成功的SaaS架构可以帮助企业降低IT成本、提升业务灵活性、加快..

架构知识点(一)

执行阶段(Execution Stage)执行阶段是 CPU 流水线中的一个步骤,通常发生在取指阶段(Instruction Fetch, IF)和解码阶段(Instruction Decode, ID)之后。在执行阶段,CPU 会进行以下操作:执行算术或逻辑操作:..

一文搞懂架构设计的衡量标准:功能性、可用性、性能、可扩展性、安全性、协作效率、复杂度、成本效益

大家好,我是汤师爷~架构设计的首要目标是服务于业务需求。因此,我们不应该盲目追求所谓的"最厉害的"架构,而应该致力于寻找最适合当前业务环境和未来发展需求的架构方案。衡量架构的合理性是一个复杂的过程,需要..

架构知识点(二)

轮询调度(Round Robin Scheduling)是一种时间片轮转调度算法,主要用于多任务系统中。其基本思想是将所有任务排成一个队列,每次调度时,系统会从队列中取出下一个任务执行,直到任务完成或达到其时间片限制。当任..

每一个程序员,都希望能成为分布式系统架构师

有很多读者经常问我,程序员的学习、成长之路应该怎么规划,才能早日成为一名架构师。作为一个曾经的架构师,在我走上技术管理这条路之后,管理的团队越来越大,现在我管理的技术团队有一百多人,最大的体会就是操心..

修改VisualSVN Server地址为ip地址,修改svn服务端地址为ip或者域名地址的方法

svn服务端搭建成功之后,地址太长很麻烦,想搞一个服务器专门做svn服务端,修改svn地址为ip地址无奈网上教程不靠谱,于是自己研究了下1.修改VisualSVN 的地址2修改地址并保存很多人不成功就在这里,点击确认之后复制..

判断 nginx 服务是否启动,未启动自动重启 shell脚本

我的是宝塔面板直接上代码nginx_procnum=`ps -ef|grep "nginx"|grep -v grep|wc -l`if [ $nginx_procnum -eq 0 ]then echo "start nginx..." /etc/init.d/nginx startelse echo "no cmd" fi然后添加定时任务;每分钟..

.NET调试Windows服务的方法

很多朋友编写Windows服务的时候都会觉得调试很麻烦,甚至不知道怎么调试。有些人可能添加个windows窗体用按键触发相关方法或者靠打印日志调试,那么到底windows服务怎么调试呢? 怎么编写代码就不说了。就说调试吧,..

MiniAPI参数绑定 服务注入 响应输出使用示例

在VS2022中可以使用MiniAPI。 使用MiniAPI以创建具有最小依赖项的 HTTP API。 它们非常适合于需要在 ASP.NET Core 中仅包括最少文件、功能和依赖项的微服务和应用。MiniAPI创建方法启动 Visual Studio 2022 并选择“..

Blazor使用内存中状态容器服务保存和验证登陆状态

想用Blazor做一个简单的登录验证。模式是render-mode="ServerPrerendered"。在登录页面登录成功后需要保存类似.NET MVC网站的服务端session的状态。网上一些简单的做法是登录成功后把用户信息存在LocalStorage或者Se..

什么是微服务架构?它与单体应用程序架构有什么区别?如何在.NET中实现微服务架构?

微服务架构是一种软件架构风格,通过将应用程序拆分为一组小型、自治的服务来构建应用程序。每个服务都专注于解决特定的业务功能,并通过轻量级的通信机制进行交互。这些服务可以独立开发、部署和扩展,可以使用不同..

适合架构师阅读的书籍推荐

一、Software Architecture篇 这个领域没有什么"畅销书",可能读者中本来就是开发设计人员与项目经理占了多数,真正定位为架构师而且做的也是架构师工作的不多吧。 1.《Software Architect Bootcamp--软件架构师教..

什么是Kafka?Kafka架构原理

在《财富》 500强公司中,超过三分之一的公司使用Kafka。这些公司包括排名前十的旅行社,排名前十的银行中有七个,排名前十的保险公司中有八个,排名前十的电信公司中有九个,等等。LinkedIn,Microsoft和Netflix每..

系统架构7个非功能性需求

在软件系统里面,功能性需求是面向用户、详细明确的需求,由产品人员根据市场的需要提炼出来,是产品生命周期里最重要的一环。比如电商系统里面的优惠券功能,通常包含需求:优惠券分类、细分领券人群、核销优惠券等..

免费Subversion(Svn)源代码托管服务

SVNSpot Subversion源代码托管服务 免费创建2个公共(开源)或私有项目 合作者人数无限制/支持目录权限 支持项目导出、导入,提交注释、编辑注释 http://code.svnspot.com/..

大型网站架构思路之二—分解

《大型网站构架优化思路之一简化》一文中我们讨论了简化,如果简化完毕,或者无法简化,那么就要考虑分解它了,那么如何去分呢?通常来说,可以从横向和纵向去分,也可以从软件和硬件去分,这个和我们构架的设计方..

ASP.NET Core微服务架构中使用RabbitMQ实现CQRS模式

微服务架构代表了软件设计的范式转变,将大型单体应用程序分解为更小的、可管理的服务,这些服务独立运行并通过定义良好的 API 进行通信。微服务架构概述在 C# 中,微服务可以是更大系统的一部分:using System;usin..

发表回复

返回顶部