服务架构的进化之路:探索服务架构的演进之路

news2024/9/29 11:32:17

1、引言

服务架构是一种以服务为中心的软件设计模式,将应用程序拆分为一组小而自治的服务单元。随着互联网和信息技术的快速发展,软件系统变得越来越复杂。为了应对这种变化,服务架构也在不断地演变和发展。本文将简要介绍服务架构的发展史,包括单体、SOA(面向服务的架构)和微服务。

2、单体架构

单体架构是指一个软件系统中的所有功能都集成在一个单一的程序中。在这种架构下,所有的模块和组件都直接耦合在一起,这使得系统的扩展和维护变得非常困难。然而,在早期的软件开发阶段,由于技术限制和资源有限,单体架构是开发者们的主要选择。

以下是单体架构的主要特点和组成部分:

  1. 单一代码库:所有的功能和模块都被组织在一个单一的代码库中,通常是一个单独的代码库或一个单体项目。
  2. 单一部署单元:整个应用程序被打包成一个单一的部署单元,通常是一个独立的可执行文件或一个Web应用程序归档文件(WAR文件)。
  3. 紧密耦合:所有的功能和模块之间存在紧密的依赖关系,它们共享数据库、类库和其他资源。
  4. 单一数据库:应用程序通常使用单个共享数据库来存储和管理数据。
  5. 单一用户界面:应用程序通常具有单一的用户界面,用户通过该界面与应用程序进行交互。
  6. 单一部署和扩展:整个应用程序需要一次性部署和扩展,无法对某个特定的功能或模块进行独立的部署和扩展。

尽管单体架构在过去是一种主流的软件开发模式,但它也存在一些限制和挑战:

  1. 可扩展性受限:由于整个应用程序被作为一个单一的部署单元,因此在应对高负载和大规模用户访问时,往往需要水平扩展整个应用程序。
  2. 灵活性不足:由于模块之间存在紧密的耦合关系,因此对某个特定模块的修改或更新可能会影响整个应用程序,导致开发和部署变得复杂和困难。
  3. 技术栈限制:单体架构往往使用统一的技术栈,限制了开发人员在选择和使用新技术时的灵活性。

尽管如此,单体架构仍然在某些场景下具有一定的优势,特别是对于小型应用程序和简单业务需求而言,它可以提供简单、快速的开发和部署方式。然而,随着业务的发展和要求的增加,许多组织开始转向更灵活、可扩展的架构模式,如面向服务架构(SOA)和微服务架构,以应对更复杂的软件开发需求。就像《人月神话》中提到的烟囱式问题一样:烟囱式指的是应用程序的不同模块或组件之间缺乏有效的通信和集成,导致它们成为相互独立的"烟囱"。每个烟囱通常具有独立的代码库、数据库和用户界面,它们之间缺乏协作和共享。这种架构模式可能导致信息孤立、重复的功能开发、难以扩展和维护等问题。为了解决烟囱式架构带来的挑战,许多组织转向面向服务架构(SOA)和微服务架构,以促进模块间的解耦和灵活性。这也引入了我们下一个话题SOA。

3、SOA

SOA(面向服务的架构)是一种软件设计和开发的架构风格,它的主要思想是将应用程序划分为一组可重用的、自治的服务,这些服务通过定义的接口进行通信和集成。SOA的目标是通过解耦服务,实现松耦合、可扩展和可维护的系统。

以下是SOA的一些核心概念和原则:

  1. 服务(Service):服务是SOA的基本构建块,它是一个具有清晰定义的功能单元,通过接口暴露其功能和能力。服务可以是独立的、自治的,可以由不同的团队开发和维护。
  2. 服务提供者(Service Provider):服务提供者是实现和发布服务的组件或系统。它负责将服务的功能实现为可供其他应用程序或服务使用的形式。
  3. 服务消费者(Service Consumer):服务消费者是使用服务的组件或系统。它通过调用服务的接口来获取所需的功能和数据。
  4. 服务接口(Service Interface):服务接口定义了服务的可用操作和数据格式。它规定了服务提供者和服务消费者之间的通信协议和规范。
  5. 服务注册与发现(Service Registry and Discovery):为了使服务消费者能够找到可用的服务,SOA通常使用服务注册与发现机制。服务提供者将其服务注册到中央注册表或服务发现机制,服务消费者可以查询该注册表或机制以发现所需的服务。

SOA的优势包括:

  • 松耦合:通过服务接口的定义和规范,服务之间解耦,使得系统更加灵活和可维护。
  • 可重用性:将功能划分为独立的服务,可以在不同的应用程序中重复使用,提高开发效率。
  • 可扩展性:可以根据需求增加或替换服务,实现系统的水平扩展和灵活性。
  • 互操作性:不同平台和技术栈的应用程序可以通过定义的服务接口进行通信和集成。
  • 增量开发:可以独立开发和部署不同的服务,从而实现快速迭代和部署。

需要注意的是,SOA是一个架构风格,它不依赖于特定的技术或工具。在实践中,可以使用不同的技术和协议来实现SOA,如Web Service、RESTful API、消息队列等。

4、微服务架构

微服务架构是一种更加灵活和可扩展的服务架构模式。在微服务架构中,应用程序被拆分为多个小型、独立的服务单元,每个服务单元负责一个特定的功能。这些服务单元可以通过轻量级的通信机制(如HTTP RESTful API)相互协作。微服务架构的优势在于其高度可扩展性、易于维护和快速迭代。同时,由于每个服务都是独立的,因此可以针对具体需求进行优化和定制。

微服务架构可以分为三个主要的演进阶段,也可以称为三代微服务架构:

4.1、第一代微服务架构

初始阶段的微服务架构主要关注服务的拆分和自治。这一阶段的微服务架构使用轻量级通信协议(如REST)进行服务之间的通信,并依赖于简单的服务注册和发现机制。代表性的第一代微服务架构包括Spring Cloud的Dubbo。

  • Spring Cloud:Spring Cloud是一个基于Spring框架的开源微服务架构。它提供了一系列的工具和组件,用于构建和部署分布式系统中的各个微服务。Spring Cloud包含了服务发现、负载均衡、断路器、配置管理、网关等功能,使得开发者能够更轻松地构建和管理微服务应用。常用的组件包括Netflix OSS(如Eureka、Ribbon、Hystrix)、Spring Cloud Config、Spring Cloud Gateway等。

  • Dubbo:Dubbo是阿里巴巴开源的一款高性能Java RPC框架,也是第一代微服务架构的代表之一。Dubbo提供了分布式服务治理的解决方案,包括服务注册与发现、负载均衡、服务路由、容错处理等。Dubbo支持多种协议和序列化方式,并提供了丰富的扩展点,使得开发者能够根据实际需求进行定制化开发。Dubbo在国内得到了广泛应用,并在大规模分布式系统中展现了良好的性能和稳定性。

这些项目在第一代微服务架构的发展和实践中发挥了重要的作用。它们提供了一套完整的解决方案,帮助开发者构建和管理分布式系统中的微服务,解决了服务发现、负载均衡、容错处理等关键问题。这些项目在实际应用中积累了丰富的经验和成果,并得到了广大开发者的认可和使用。

4.2、第二代微服务架构

Service Mesh是一种用于处理微服务之间通信的基础设施层。它通过在服务之间插入一个专用的代理(通常是sidecar代理),来管理和控制微服务之间的通信流量。Service Mesh提供了丰富的功能和特性,包括服务发现、负载均衡、故障恢复、安全性、监控和跟踪等。

Service Mesh的核心概念是数据平面和控制平面:

  1. 数据平面(Data Plane):数据平面由一组用于处理实际请求和响应的代理组成,这些代理位于每个微服务的旁边(sidecar)。代理通过拦截和转发请求,实现服务之间的通信和数据传输。代理可以提供负载均衡、流量控制、故障恢复等功能,同时也可以进行安全性、监控和日志记录等操作。
  2. 控制平面(Control Plane):控制平面负责配置、管理和监控数据平面中的代理。它提供了集中化的管理界面和控制接口,用于配置路由规则、定义策略、执行故障恢复和安全策略等。控制平面可以根据需求自动更新代理的配置,实现服务之间的无缝通信。

Service Mesh的优势在于它提供了一种解耦的方式来处理微服务之间的通信,使开发者可以专注于业务逻辑的开发而无需关注底层的通信细节。它提供了更好的可观测性、安全性和可扩展性,同时也使得服务之间的通信更加可靠和弹性。

在Service Mesh领域,一些知名的项目包括Istio、Linkerd和Envoy等。这些项目提供了一套完整的Service Mesh解决方案,各自具有不同的特点和功能。随着Service Mesh的发展和普及,它正在成为构建和管理微服务架构的重要工具和技术之一。

一个常见的service mesh的例子是开源项目Istio,它是一种透明地覆盖在现有分布式应用程序上的service mesh。Istio的强大功能提供了一种统一和更高效的方式来保护、连接和监控服务。Istio是实现负载均衡、服务间认证和监控的途径,而且几乎不需要或不需要修改服务代码。

5、未来的微服务架构与技术栈


如果文章对你有帮助,请不要忘记加个关注、点个赞!!

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

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

相关文章

基于BG/NBD概率模型的用户CLV预测

基于BG/NBD概率模型的用户CLV预测 小P:小H,我们最近想预测下用户的生命周期价值,有没有什么好的方法啊? 小H:简单啊, C L V 用户每月平均花费 ∗ 用户平均寿命 CLV用户每月平均花费*用户平均寿命 CLV用户每…

Masked Autoencoders As Spatiotemporal Learners

Masked Autoencoders As Spatiotemporal Learners 文章目录 Masked Autoencoders As Spatiotemporal Learners一、文章背景二、文章变量1 mask sampling 方式2 Mask ratio3 其余的ablation studies 一、文章背景 用于视频中的时间信息学习。 基本思想是重构,使用的…

bilibili记录

霹雳吧啦Wz的个人空间-霹雳吧啦Wz个人主页-哔哩哔哩视频 目标检测篇github地址;GitHub - WZMIAOMIAO/deep-learning-for-image-processing: deep learning for image processing including classification and object-detection etc.

mapbox分屏地图同步缩放拖拽旋转

成果图 之前写过一版,后来又经过一些优化,形成了现在的最终版本,之前是二维的,现在是三维的也可以了,地址在这儿 https://blog.csdn.net/Sakura1998gis/article/details/113175905 实现 监听动作 // 拖拽同步map.on(d…

pm3包1.8版本发布----一个用于3组倾向性评分的R包

目前,本人写的第二个R包pm3包的1.8版本已经正式在CRAN上线,用于3组倾向评分匹配,只能3组不能多也不能少。 可以使用以下代码安装 install.packages("pm3")什么是倾向性评分匹配?倾向评分匹配(Propensity Sc…

经常被问道的这些类,佬们能够吊打面试官嘛(适合秋招和小白系列)?

前言: 本篇文章主要讲解Java中的几个类常被问到的面试题相关知识。该专栏比较适合刚入坑Java的小白以及准备秋招的大佬阅读。 如果文章有什么需要改进的地方欢迎大佬提出,对大佬有帮助希望可以支持下哦~ 小威在此先感谢各位小伙伴儿了😁 以…

宏病毒组研究大放异彩!| 凌恩生物1-5月高分宏病毒组文章大盘点!

凌恩生物现已在宏组学、基因组、表观遗传以及蛋白代谢等多组学及联合分析领域积累了深厚经验,打造出成熟的科研服务平台,以优质售前方案和优秀售后服务助力客户在Nature、Science、PNAS、ISME和MIcrobiome等高端国际期刊上发表了大量文章。 伴随着组学技…

【DevOps】Python+Golang(一)

Python is和的区别 is检查两个对象是否是同一个对象,即它们的内存地址是否相同。如果是同一个对象,则返回True,否则返回False。 检查两个对象是否相等,即它们的值是否相同。如果值相同,则返回True,否则返回…

Maven-基础

Maven Maven是专门用于管理和构建Java项目的工具,主要功能有: 提供了一套标准化的项目结构 Maven提供了一套标准化的项目结构,所有的IDE使用Maven构建的项目完全一样 提供了一套标准化的构建流程(编译,测试&#xff0c…

jmeter性能测试进阶使用纪要

目录 目录 随机变量:实现注册手机号不重复分配 正则表达式:token等变量提取 HTTP header manager:token传参Authorization使用 后置BeanShell PostProcessor设置prev.setDataEncoding(“utf-8”):响应中文乱码处理 同步定时…

与AI合作穿越剧 编剧徐婷:AI脑洞大,但无法替代人类的情感表达

热门喜剧秀《周六夜现场》本季提前结束,美剧《亿万》最新第七季的更新搁浅,漫威新电影《新刀锋战士》暂停拍摄……美国影视娱乐行业的编剧们以抵制AI为由的大罢工,开始影响诸多作品的产出,据说造成了100亿美元的损失。 这场罢工已…

深入理解Linux虚拟内存管理(八)

系列文章目录 Linux 内核设计与实现 深入理解 Linux 内核(一) 深入理解 Linux 内核(二) Linux 设备驱动程序(一) Linux 设备驱动程序(二) Linux 设备驱动程序(三&#xf…

Hive企业级调优

Hive企业级调优 调优原则已经在MR优化阶段已经有核心描述,优化Hive可以按照MR的优化思路来执行 优化的主要考虑方面: 环境方面:服务器的配置、容器的配置、环境搭建具体软件配置参数:代码级别的优化 调优的主要原则: ​ 20/80原则非常重要,简单的说80…

骨传导蓝牙耳机排行榜10强,介绍几款不错的户外骨传导耳机

随着骨传导技术的不断发展,骨传导耳机的性能也得到了很大的提升,特别是在音质和佩戴舒适性上,都有了很大的提升。很多人在听音乐的时候,都会佩戴骨传导耳机,因为骨传导耳机具有开放双耳的特点,长时间佩戴也…

Android Jetpack Compose 中的Tabs(TabLayout)

Android Jetpack Compose 中的Tabs(TabLayout) 添加依赖 我们需要依赖于2个 accompanist组件,你可以从下面链接中获取最新版本https://github.com/google/accompanist/tree/main/pager#pager-composable-for-jetpack-compose def accompan…

探索LowLatency的HLS低延迟直播协议

HLS全称为HTTP Live Streaming,其中m3u8作为描述协议,指向一系列切片文件。支持多码流与自适应码率,支持广告无缝播放,支持CMAF协议的低延时直播,也支持CDN动态选择。 我们先看下HLS整体架构,由三部分构成…

莫顿曲线映射 一维到二维的变换 MD(莫顿)码 反向变换 线性四叉树

函数声明&#xff1a; #include <stdio.h> #include <math.h>#define MAXSIZE 200 #define N 8typedef struct //栈的存储结构 {int data[MAXSIZE];int MD[MAXSIZE];int top; }stack1;void stackinitiate(stack1 *s); //初始化栈 void push (s…

【已解决】c++ 读入灰度图进行dft变换报错

报错原因&#xff1a; 1、imread函数读入默认参数为1&#xff0c;即彩色三通道图像&#xff0c;而我们要指定参数为0&#xff0c;读入灰度图像 2、在进行傅里叶变换前要将图像数据类型转为CV_32F&#xff0c;因为默认灰度图像类型为CV_8U 正确代码&#xff1a; #include <…

Vue中如何进行滚动加载与无限滚动?

Vue中如何进行滚动加载与无限滚动&#xff1f; 随着Web应用程序的复杂性和数据量的增加&#xff0c;滚动加载和无限滚动成为了Web开发中常见的需求。在Vue中&#xff0c;我们可以使用一些插件和技术来实现这些功能。 本文将介绍Vue中如何进行滚动加载和无限滚动&#xff0c;包…

内核实现信号捕捉的过程,以及要用到的函数sigaction

1.信号捕捉过程 1.在执行主控制流程的某条指令时因为中断、异常或系统调用进入内核。 2.内核处理完异常准备回用户模式之前先处理当前进程中可以递送的信号。 3.do_signal(); 如果信号的处理动作为自定义的信号处理函数&#xff0c;则回到用户模式执行信号处理函数&#xff08…