技术发展历程:从 CORBA 到微服务

在这里插入图片描述

CORBA

CORBA(Common Object Request Broker Architecture)诞生于上世纪 90 年代初期,由 OMG 组织提出,它作为一种开创性的分布式对象技术规范,在当时的计算机领域引起了轰动。其核心构成部分——接口定义语言(IDL)和对象请求代理(ORB)发挥着关键作用。IDL 犹如一座桥梁,让开发者能用一种中立的方式去定义对象的接口,无论后续使用何种编程语言来实现这些对象。而 ORB 则像是一个智能的“通信中介”,负责在不同平台的对象之间传递请求与响应,使得不同操作系统、不同编程语言编写的程序能够跨越网络的鸿沟,顺畅地进行通信和数据交换。

举例来说,在一个大型企业的跨部门系统中,财务部门用 C++ 编写的账目管理程序,和销售部门用 Java 编写的订单处理程序,以往很难直接交互数据。但借助 CORBA,它们能通过 ORB 找到彼此,依据 IDL 定义好的接口规范,轻松共享诸如客户信息、交易流水这类关键数据,极大提升了企业内部的协同效率。

然而,CORBA 也存在不少弊端。它的体系结构过于复杂,ORB 的实现往往十分臃肿,对硬件资源消耗巨大。并且,CORBA 的部署和维护难度很高,不同厂商实现的 CORBA 产品兼容性欠佳,这使得开发成本居高不下,逐渐难以适应快速发展的网络技术环境,于是催生了新的技术来替代它。

以下是一段简单示意 CORBA 客户端调用服务器对象的 C++ 代码示例:

#include <omniORB4/CORBA.h>
#include "HelloWorld.idl" // 假设这是 IDL 生成的头文件int main(int argc, char** argv) {CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);CORBA::Object_var obj = orb->string_to_object("corbaname::localhost:12345/HelloWorld");HelloWorld_var helloWorld = HelloWorld::_narrow(obj);if (CORBA::is_nil(helloWorld)) {std::cerr << "Could not narrow reference to type HelloWorld" << std::endl;return 1;}helloWorld->sayHello();orb->destroy();return 0;
}

RPC(远程过程调用)

随着网络技术日新月异的发展,RPC(Remote Procedure Call)技术登上历史舞台。在分布式计算场景里,RPC 带来了一种全新的简洁思路:它允许一个程序(客户端)如同调用本地函数一般,通过网络向另一个程序(服务器)轻松请求服务,而无需开发者去深挖底层网络技术的复杂细节。

比如在早期的分布式文件系统中,客户端程序想要读取远程服务器上的文件,以往得精心处理网络连接、数据传输协议等繁琐环节。有了 RPC 后,只需简单调用一个类似“readFile(“文件名”)”的函数,底层的网络通信、数据打包解包等操作都由 RPC 框架暗中搞定,极大简化了开发流程,推动了分布式计算迈向更广阔的应用天地。

不过,RPC 也并非完美无瑕。它过于依赖底层网络环境的稳定性,一旦网络出现波动、丢包等情况,很容易导致调用失败。而且,RPC 通常缺乏对异构系统间语义互操作性的深度支持,不同系统间的数据格式转换、错误处理机制难以统一,这就为新的替代技术留出了发展空间。

下面是一个简单的 Python RPC 示例代码,使用 xmlrpc 库:

from xmlrpc.server import SimpleXMLRPCServer
from xmlrpc.client import ServerProxy# 服务器端
def add(a, b):return a + bserver = SimpleXMLRPCServer(("localhost", 8000))
server.register_function(add, "add")
server.serve_forever()# 客户端
with ServerProxy("http://localhost:8000/") as proxy:result = proxy.add(3, 5)print(result)

Web Services

互联网浪潮汹涌来袭,Web Services 技术顺势崛起并风靡一时。它构建起一种基于 Web 的、分布式的、跨编程语言的服务导向架构技术体系,仰仗 XML、SOAP、WSDL 和 UDDI 等一系列开放标准,打破了不同平台与语言之间交互的壁垒。

以电商行业为例,一家主营时尚服饰的电商平台,需要和多家第三方物流企业对接订单配送业务。这些物流企业的系统可能基于不同的技术栈搭建,有的用.NET,有的用 Python。借助 Web Services,电商平台通过 SOAP 协议封装订单数据,以 WSDL 描述服务接口,发布到 UDDI 注册中心,物流企业就能轻松发现并接入服务,实现订单信息的无缝对接与处理,让企业间的集成变得前所未有的容易。

但 Web Services 也暴露出一些问题,SOAP 协议过于臃肿,传输效率较低,大量的 XML 标签增加了数据传输的开销。每次调用服务,都要进行复杂的 XML 解析与封装,性能损耗明显,这促使了更优架构的探索。

SOA(面向服务的架构)

SOA(面向服务的架构)作为一种革新性的软件设计模式闪亮登场,它把应用程序拆解成不同的功能模块,并将这些模块统统转化为服务。这些服务遵循松耦合、位置透明、协议独立的核心思想,能通过网络被灵活访问与重复利用。

设想一个智慧城市项目,交通管理、能源监控、环境监测等多个部门的系统需要协同运作。在 SOA 架构下,每个部门把自身核心业务封装成服务,交通部门的路况查询服务、能源部门的电量分配服务等,它们各自独立运行,又能按需组合。利用现有资产,减少重复开发,显著提升了系统整体的运作效率,降低成本,象征着软件架构从单体架构大步迈向服务化架构。

然而,SOA 实践过程中,服务粒度把控困难,一些服务过于庞大复杂,导致更新维护不便。而且,服务间通信多采用企业服务总线(ESB)这类较重的中间件,性能瓶颈愈发凸显,催生了对更精细架构的需求。

微服务架构

微服务架构作为 SOA 的一种精巧扩展,掀起了分布式系统构建的全新浪潮。它将服务打碎成更微小、高度独立的服务单元,每个微服务都运行在专属的进程空间之中,彼此通过轻量级通信机制,大多是 HTTP RESTful API 来交互协作,就像一个个小巧玲珑却又配合默契的精密零件,共同组装起庞大复杂的软件系统。

具体实现方案

  • 服务拆分与界定:精准的服务拆分是微服务架构落地的基石。以电商系统为例,不再是构建一个大一统的巨型应用,而是拆解为诸多各司其职的微服务。像用户管理微服务,专职处理用户注册、登录、信息修改等操作;订单处理微服务,一门心思扑在订单创建、订单流程跟踪、支付对接这些事务上;商品管理微服务,则聚焦商品上架、库存盘点、分类编辑。这种拆分依据业务领域,确保每个微服务职责纯粹、功能独立,方便后续开发、维护与升级。
// 用户管理微服务中的用户注册示例代码
@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;@PostMapping("/register")public ResponseEntity<String> registerUser(@RequestBody User user) {boolean success = userService.register(user);if (success) {return new ResponseEntity<>("User registered successfully", HttpStatus.CREATED);} else {return new ResponseEntity<>("Registration failed", HttpStatus.BAD_REQUEST);}}
}
  • 独立部署与运维:每个微服务都配备独立的代码仓库、构建流程与部署管道。借助 Docker 容器技术,将微服务及其依赖项打包封装,实现环境的高度一致性。比如,订单微服务打包进一个 Docker 容器,无论在开发环境、测试环境还是生产环境,只要有 Docker 引擎,就能一键拉起运行,大大简化部署流程,也便于版本回滚与故障隔离。运维团队利用 Kubernetes 编排这些容器化的微服务,自动化管理资源分配、扩缩容等操作。
# Kubernetes 部署订单微服务的示例配置文件
apiVersion: apps/v1
kind: Deployment
metadata:name: order-service
spec:replicas: 3selector:matchLabels:app: order-servicetemplate:metadata:labels:app: order-servicespec:containers:- name: order-containerimage: order-service:latestports:- containerPort: 8080
  • 轻量级通信机制:摒弃传统笨重的中间件,采用 HTTP RESTful API 作为主流通信方式。它基于通用的 HTTP 协议,简单易懂,开发成本低。客户端无论是网页端、移动端,还是其他微服务,都能轻松发起请求。以获取商品详情为例,客户端只需向商品管理微服务发送一个 GET 请求,形如/products/{productId},就能拿到 JSON 格式的商品详情数据。同时,还可以搭配 JSON Web Token(JWT)实现安全的认证授权,保障通信安全。
// 前端使用 JavaScript 调用商品详情接口示例
fetch('/products/123', {method: 'GET',headers: {'Authorization': 'Bearer <JWT_TOKEN>'}
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
  • 配置管理与服务发现:配置管理方面,利用 Spring Cloud Config 或 Consul 这类工具,将微服务的配置参数集中存储与管理。例如,数据库连接字符串、第三方 API 密钥这些敏感信息,统一放在配置中心,微服务启动时按需拉取,方便配置更新,避免硬编码带来的风险。服务发现借助 Netflix Eureka 或 Consul 实现,新上线的微服务自动注册到服务发现中心,其他微服务要调用时,无需硬编码 IP 地址和端口,直接从服务发现中心查询目标微服务实例,动态获取调用地址,适应微服务实例的动态增减。

解决其他技术面临的问题

  • 应对 CORBA 的复杂性与兼容性难题:CORBA 体系臃肿、部署维护复杂,不同厂商产品兼容性差。微服务架构下,每个微服务足够小巧简单,开发团队能轻松掌握,无需应对复杂的 ORB 等 CORBA 特有组件。而且微服务基于通用的 HTTP 协议通信,摆脱了 CORBA 那种对特定厂商实现的依赖,兼容性大幅提升。各个微服务独立开发部署,不会出现 CORBA 里牵一发而动全身的更新难题。
  • 攻克 RPC 的稳定性与语义互操作性短板:RPC 高度依赖底层网络稳定性,语义互操作性弱。微服务采用 RESTful API,本身基于 HTTP 这个成熟的网络协议,有诸多现成的网络库与框架保障通信稳定性,如 OkHttp、HttpClient 等,还能方便地添加重试、熔断机制。在语义互操作性上,RESTful API 利用 HTTP 状态码、标准的 JSON 数据格式,清晰传达请求结果与数据结构,不同语言编写的微服务能毫无障碍地理解交互信息,克服了 RPC 的缺陷。
  • 化解 Web Services 的性能瓶颈:Web Services 依赖的 SOAP 协议因大量 XML 标签,传输效率低。微服务使用的 RESTful API 多采用更紧凑的 JSON 格式传输数据,大大减少数据冗余,提升传输速度。而且微服务抛弃了 Web Services 里繁琐的 WSDL、UDDI 等复杂规范,开发运维流程简化,性能损耗随之降低,让系统响应更加敏捷高效。
  • 弥补 SOA 的服务粒度与通信性能问题:SOA 服务粒度把控困难,服务间通信依赖较重的 ESB 中间件。微服务把服务粒度细化到极致,每个微服务功能聚焦,更新维护轻松。轻量级的 HTTP 通信替代 ESB,减少了不必要的通信开销,使得系统整体性能得到质的飞跃,也让架构更具灵活性与扩展性。

技术发展的本质

技术发展的本质归根结底是为了解决实际问题,同时提升效率。从 CORBA 到微服务这一演进脉络清晰可见,始终紧紧围绕着怎样更出色地达成分布式计算、实现服务集成与通信畅通无阻,以及如何全方位增强系统的可维护性与可扩展性。商业世界里,市场竞争激烈,企业必须快速响应市场的风云变幻,微服务架构所具备的灵活性与敏捷性,能让企业迅速迭代产品功能。技术层面,云计算提供了近乎无限的计算资源,容器化技术(如 Docker)将微服务轻松封装部署,服务网格(如 Istio)精细管理服务间通信,为微服务蓬勃发展筑牢根基。在用户体验端,大众对软件响应速度要求近乎即时,个性化定制需求也越发旺盛,微服务架构正好契合这些诉求。再加上硬件性能的飞跃与成本的跳水,运行海量微服务不再是天方夜谭。

为什么会这么发展

  • 商业需求:现代商业节奏飞快,新的商业模式、竞品冲击不断。企业亟需迅速调整业务逻辑,推出新功能、新服务。微服务架构下,各个小团队可以独立负责一个微服务,快速开发、测试、上线,大大缩短产品迭代周期,相比以往笨重的架构,灵活性不可同日而语。
  • 技术进步:云计算的按需分配资源模式,让微服务不再受限于硬件资源匮乏;Docker 容器技术使得微服务部署环境标准化、可移植,一键部署到不同环境;服务网格 Istio 自动处理服务发现、配置管理、流量管控等难题,全方位支撑微服务稳健运行。
  • 用户体验:如今用户使用软件时,稍有延迟就会弃用,而且期望软件贴合个人喜好。微服务能够分布式并行处理请求,减少响应时间,同时每个微服务专注一项功能,便于个性化定制与优化。
  • 计算资源:芯片制造工艺持续升级,服务器性能成倍增长,成本却不断降低。曾经运行少数大型服务都吃力的硬件,如今承载成百上千的微服务游刃有余。

未来展望

微服务架构注定会持续进化,以从容应对越发错综复杂的应用需求。新兴技术如 Serverless,让开发者只需聚焦业务代码,无需操心服务器运维;Service Mesh 将持续优化服务治理能力;AIOps 运用人工智能助力运维决策。未来,智能化、自动化与集成化必将成为技术发展的主攻方向,进一步为提升效率、升华用户体验添砖加瓦。

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

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

相关文章

抢单人机交互「新红利」!哪些细分赛道“多金”?

受终端用户的智能座舱体验需求驱动&#xff0c;视觉、听觉、触觉等人机交互方式加速焕新。 一方面&#xff0c;人机多模交互引领&#xff0c;车载声学进入新周期。根据高工智能汽车研究院统计数据&#xff0c;单车的车载扬声器搭载量正在快速起量。 很显然&#xff0c;作为智…

前端学习DAY26(华为平板页面)

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>平板图片</title><style> .box{text-al…

算法 双指针技巧

文章目录 双指针[leetcode167 两数之和](https://leetcode.cn/problems/two-sum-ii-input-array-is-sorted/description/)分析题解 [leetcode88 合并两个有序数组](https://leetcode.cn/problems/merge-sorted-array/description/)分析题解 [leetcode142 环形链表](https://lee…

DevOps工程技术价值流:制品库Nexus与Harbor的实战探索

制品库作为DevOps价值流中的一个关键环节&#xff0c;其重要性日益凸显。制品库&#xff0c;作为存储和管理软件开发过程中产生的各种制品&#xff08;如代码包、镜像、配置文件等&#xff09;的仓库&#xff0c;是连接开发、测试、部署等多个环节的桥梁。它不仅能够实现制品的…

R9000P键盘失灵解决办法

问题描述 突然&#xff0c;就是很突然&#xff0c;我买的R9000P 2024不到三个月&#xff0c;键盘突然都不能用了&#xff0c;是所有键盘按键都无效的那种。&#xff08;可以使用外接键盘&#xff09; 解决办法 我本科室友说的好哈&#xff0c;全坏全没坏。 &#xff08;该解…

潜在狄利克雷分配LDA 算法深度解析

引言 潜在狄利克雷分配&#xff08;Latent Dirichlet Allocation, LDA&#xff09;是一种广泛应用于文本挖掘和信息检索领域的主题模型。它能够从文档集合中自动发现隐藏的主题结构&#xff0c;为理解大规模文本数据提供了强有力的工具。本文将着重讲解 LDA 的核心理论&#x…

sentinel学习笔记6-限流降级(上)

本文属于sentinel学习笔记系列。网上看到吴就业老师的专栏&#xff0c;写的好值得推荐&#xff0c;我整理的有所删减&#xff0c;推荐看原文。 https://blog.csdn.net/baidu_28523317/category_10400605.html sentinel 实现限流降级、熔断降级、黑白名单限流降级、系统自适应…

全面解析 Kubernetes 流量负载均衡:iptables 与 IPVS 模式

目录 Kubernetes 中 Service 的流量负载均衡模式 1. iptables 模式 工作原理 数据路径 优点 缺点 适用场景 2. IPVS 模式 工作原理 数据路径 优点 缺点 适用场景 两种模式的对比 如何切换模式 启用 IPVS 模式 验证模式 总结 Kubernetes 中 Service 的流量负载…

每日十题八股-2024年12月19日

1.Bean注入和xml注入最终得到了相同的效果&#xff0c;它们在底层是怎样做的&#xff1f; 2.Spring给我们提供了很多扩展点&#xff0c;这些有了解吗&#xff1f; 3.MVC分层介绍一下&#xff1f; 4.了解SpringMVC的处理流程吗&#xff1f; 5.Handlermapping 和 handleradapter有…

蓝桥杯嵌入式备赛教程(1、led,2、lcd,3、key)

一、工程模版创建流程 第一步 创建新项目 第二步 选择型号和管脚封装 第三步 RCC使能 外部时钟&#xff0c;高速外部时钟 第四步晶振时钟配置 由数据手册7.1可知外部晶振频率为24MHz 最后一项设置为80 按下回车他会自动配置时钟 第五步&#xff0c;如果不勾选可能程序只会…

2.4 设备管理

文章目录 设备管理概述设备管理技术磁盘调度 设备管理概述 设备管理是操作系统中最繁杂、与硬件关系紧密的部分。 设备可以按照数据组织、资源分配、数据传输率分类。 数据组织&#xff1a;分为块设备&#xff08;ex. 磁盘&#xff09;、字符设备(ex. 打印机)。资源分配&#…

网络安全渗透有什么常见的漏洞吗?

弱口令与密码安全问题 THINKMO 01 暴力破解登录&#xff08;Weak Password Attack&#xff09; 在某次渗透测试中&#xff0c;测试人员发现一个网站的后台管理系统使用了非常简单的密码 admin123&#xff0c;而且用户名也是常见的 admin。那么攻击者就可以通过暴力破解工具&…

PSDK的编译与ROS包封装

本文档讲述在NIVIDIA开发板上使用大疆提供的Payload SDK获取无人机实时GPS信息的方法&#xff0c;以及基于Payload SDK发布ROS GPS话题信息的方法。 文章目录 0 实现目标1 Payload SDK1.1 PSDK 源码的编译1.2 PSDK 的使用 2 遥测数据的读取2.1 示例代码结构2.2 读取机载GPS信息…

模型 课题分离

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。明确自我与他人责任。 1 课题分离的应用 1.1课题分离在心理治疗中的应用案例&#xff1a;李晓的故事 李晓&#xff0c;一位28岁的软件工程师&#xff0c;在北京打拼。他面临着工作、家庭和感情的多重…

大恒相机开发(3)—大恒相机工业检测的实际案例

大恒相机工业检测的实际案例 工业检测的实际案例图像采集性能优化技巧工业环境下的稳定性 工业检测的实际案例 以下是一些使用大恒相机进行工业检测的实际案例&#xff1a; 多特征光学成像系统&#xff1a; 在这个案例中&#xff0c;使用大恒相机构建了一个全方位、多特征的图…

go官方日志库带色彩格式化

go默认的 log 输出的日志样式比较难看&#xff0c;所以通过以下方式进行了美化和格式化&#xff0c;而且加入了 unicode 的ascii码&#xff0c;进行色彩渲染。 package mainimport ("fmt""log""os""runtime""strings""…

Linux shell脚本用于常见图片png、jpg、jpeg、webp、tiff格式批量转PDF文件

Linux Debian12基于ImageMagick图像处理工具编写shell脚本用于常见图片png、jpg、jpeg、webp、tiff格式批量转PDF文件&#xff0c;”多个图片分开生成多个PDF文件“或者“多个图片合并生成一个PDF文件” 在Linux系统中&#xff0c;使用ImageMagick可以图片格式转换&#xff0c…

【C++语言】多态

一、多态的概念 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某种行为&#xff0c;当不同的对象去完成时会产生出不同的状态。 我们可以举一个例子&#xff1a; 比如买票这种行为&#xff0c;当普通人买票时&#xff0c;是全价买票&am…

Centos7配置webrtc-streamer环境

Centos7配置webrtc-streamer环境 安装webrtc-streamer0.7版本 升级gdb 1、yum安装2、查看gdb版本3.下载待升级的gdb版本4.QA 1、预编译的时候报错no acceptable C compiler found in $PATH2、make的时候报错[all-bfd] Error3、make的时候报错 升级GCC 1.源码编译升级gcc9.3.0…

【AIGC】ChatGPT 结构化 Prompt 的高级应用

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;标识符的使用&#xff08;Use of Identifiers&#xff09;1. #2. <>3. - 或 4. [] &#x1f4af;属性词的重要性和应用应用场景 &#x1f4af;具体模块…