2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

写给程序员的中间件入门课

  • 2020-04-16
  • 本文字数:2638 字

    阅读完需:约 9 分钟

写给程序员的中间件入门课

在技术交流中,对 “聊聊你对分布式缓存一致性 hash 算法的理解” 或 “你觉得 Docker 与虚拟化之间的区别有哪些?” 这一类的问题,只要接触过,大多数程序员都会说出个一二三,而对于 “为什么要用中间件?” 或 “你如何定义中间件这东西?” 这一类的问题,许多程序员却往往反应出相对茫然的眼神,不知如何回答。


当然,这类问题本身偏抽象,不够聚焦,对程序员来说,有功夫研究这些,还不如看个源代码,掰扯个 ‘充血模式’ 与 ‘贫血模式’ 来的接地气。


之前我曾写过一篇 #我司中间件演进 # 的文章,在我看来,许多程序员在通向架构师的道路上,往往受限于思维偏应用和细节,抽象能力弱,在目的与目标还一知半解的情况下,就盲目的追求深度。


所以我搞了一次内部分享,其目的是为了加深小伙伴对中间件的定义、作用与演进的了解,希望对正确树立架构设计思维有所帮助。以下是我基于 PPT 整理出的文字版本,欢迎大家阅读。

开场白

当面对一个稳定高效的系统时,我们相当于站在一条十字路口的纵轴上,向前可以回顾它从何而来,因为任何一个系统的成长,都是用户流量爆发与业务功能迭代,然后慢慢完善的过程,而向后却无法洞察它会向何而去,因为业务基因的不确定性,使其容易遭遇由耦合关系、服务复用、异构互通所带来的各种威胁。


中国有个词叫 “第一联想”,比如说说中国最有名的建筑是什么,相信大部分人的第一联想就是“万里长城”,而谈到通过分布式实现技术之间共享资源的解决方案有哪些,相信不少技术小伙伴会想到一个关键词,那就是“中间件”。


自古道“只知其然,而不知其所以然”,大致是说,只知道是这样,却不知道为什么是这样。之所以 “中间件” 能成为联想关键词之一,其原因究竟是什么呢?

中间件的定义是什么?

类似的解读,无论在理论派还是实践派中,都是一个永无休止的评论话题,应该说还没有一个标准的定义。


我们先来看看堪称 ‘理论派鼻祖’ 的维基百科是如何定义 “中间件” 的。


中间件是一类连接软件组件和应用的计算机软件,它包括一组服务。以便于运行在一台或多台机器上的多个软件通过网络进行交互。它是基础软件的一大类,属于可复用软件的范畴。


然后再来瞅瞅堪称‘实践派代表’的小伙伴们对“中间件”给出的定义。


一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源,中间件位于客户机服务器的操作系统之上,管理计算资源和网络通信。


虽说从笔风上看差异较大,其实无非观察角度有少许差异罢了。讲完别人的,我来对定义中的关键点进行一些提炼:


协同集成服务:解决网络分布式系统在通信服务、交换服务、语义互操作服务等系统之间的互连互通问题。


降低升级成本:在软硬件在快速换代的过程中,只要中间件对外接口的定义不变,无论如何升级更新,应用软件几乎是无感知的,最终达到‘一次接入,终生受益’的效果。


标准服务规则:提供应用软件之间的标准接口,体现可移植性、标准协议对于应用软件互连方面的重要性。

中间件都有哪些特性?

一款优秀的产品通常由不同的特性组成,下面我来分析下,中间件的特性都有哪些独到之处呢?

A. 独立性

比如一个海上岛屿旅游景区,它必须要能满足日常客流的需求供给,并且保持时刻运行的状态,为游客提供一个稳定安逸的环境,并通过港口向外来船只提供标准化连接服务,实现自助运力及承受大吞吐量,这样才能生意兴隆,蓬勃发展。


在我看来,中间件与岛屿极其相似,独立、标准、稳定是其最重要的核心属性。



图 1. 中间件独立性的三大属性

B. 复用性

记得以前在交流设计模式时,时常有句话挂在嘴边,“只有掌握如何使用可复用的面向对象模型之时,你才能说对于面向对象设计有了深入了解。”


的确,所谓复用,就是指同一事物不作修改或稍加改动就多次重复使用,如果从软件复用技术的发展来看,就是不断提升抽象级别,扩大复用范围。


而中间件复用场景的覆盖范围可分裂为以下四种:



图 2. 中间件复用场景的覆盖范围

C. 耦合性

从事互联网的任何一家企业,当规模达到一定程度后,野蛮生长所欠下的技术债务就会成为一颗颗不定时炸弹,而无论采取哪种排弹措施,“拆系统”的方案基本都会作为首选。


但无论你选择的策略是“标准化下沉”,还是“服务化独立”,“基础服务”、“数据转换”、“业务逻辑”的耦合性问题都会像三座大山一般拦在你的面前,形成铁板一块的软件,牵一发而动全身,让你难以适应变化。


在我看来,分布式中间件可以很好的解决“基础服务”、“数据转换”、“业务逻辑”所带来的耦合性问题,并为系统后期的扩展提供了灵活性。


下面我们通过两张图来简易描述下“基础服务”与“数据转换”的解耦效果:



图 3. 解除基础服务的耦合性



图 4. 解除数据转换的耦合性

中间件演进的助推剂

火箭的推进原理,是将一种液体推进剂用高压气体对燃料与氧化剂贮箱增压,然后在发动机内转化为燃气的动能,形成高速气流喷出,产生推力。


然而中间件发展的助推剂主要源于信息技术在‘群雄争霸模式’下所产生的孤立性与互连性,我将导致这种局面的原因概括为应用软件发展中的三种现象。

A. 异构现象

进入 21 世纪后,计算机的异构愈演愈烈,比如高级语言依赖于特定的编译器和操作系统,相互间还不兼容,再比如数据库的连接方式也是五花八门,你方唱罢我登场。


我认为,造成这种局面的原因应归结于技术升级和利益驱动两方面的因素,而通过中间件解决类似差异性问题,是不错的选择。

B. 互连现象

在互联网时代下,各种异构软件之间的信息互连增多,而且移植性需求也随之增多,但却因为网络协议与通信机制的不同,导致相互集成的成本变得越发让人难以承受。


我认为,造成这种局面的原因应归结于软件互连之间缺乏协议标准规则,而通过中间件解决类似差异性问题,无论成本还是效率,都是相对较高。

C. 共性现象

随着软件应用的越发增多,许多业务功能,尤其是把基础技术性质的功能放在一个系统(或服务)中,避免每次都从零开始建设,这样对质量和效率都是极大的提升。


我认为,在唯快不破的互联网竞争下,提高系统(或服务)的复用率,简化分布式系统的设计、编程和管理,中间件,可以说是极佳的解决手段。


在看完本文之前,你原来对中间件的定义是如何的?你认为中间件的局限性又有哪些呢?中间件是否将向 PaaS 化的方向发展呢?


相信经过深度思考的回答,也会让你对知识的理解更加深刻。


本文转载自头哥侃码公众号。


原文链接:https://mp.weixin.qq.com/s/frB4uWbxeMjEjG7rB2OMLw


2020-04-16 17:41914

评论

发布
暂无评论
发现更多内容

【原创】Spring Boot 过滤器、监听器、拦截器的使用

田维常

spring Boot Starter

只需三步,带你从0到1玩转React,附源码我一定给你讲明白

小Q

Java 学习 编程 架构 面试

产品经理团队的管理秘法

马踏飞机747

管理 产品经理 团队

阿里P8架构师呕心沥血整理的【Docker实战】文档带你玩转Docker。

Java架构之路

Java 程序员 架构 面试 编程语言

阿里P8Java大神给迷茫的程序员一些中肯建议:“请不要再虚度光阴了!”

Java架构之路

Java 阿里巴巴 程序员 架构 编程语言

【原创】Spring Boot一口气说自动装配与案例

田维常

spring Boot Starter

2020双十一终极清单!阿里云CDN&视频云最全优惠攻略

阿里云Edge Plus

CDN

华为云“创原会”:40+技术精英论道云原生2.0

华为云开发者联盟

k8s 华为云

如何快速构建Spring Boot基础项目?

田维常

spring Boot Starter

Spring Boot 如何快速实现定时任务

田维常

spring Boot Starter

【原创】Spring Boot 集成Spring Data JPA的玩法

田维常

spring Boot Starter

【原创】Spring Boot集成Mybatis的玩法

田维常

spring Boot Starter

【原创】SpringBoot快速整合Thymeleaf模板引擎

田维常

spring Boot Starter

【原创】Spring Boot集成Redis的玩法

田维常

spring Boot Starter

详解软件行业低代码开发平台以及敏捷开发方案

Marilyn

敏捷开发

Spring Boot 集成 Druid 监控数据源

田维常

spring Boot Starter

【原创】Spring Boot终极篇《下》

田维常

spring Boot Starter

为什么11·11物流一年比一年快?奥秘就在这里!

华为云开发者联盟

物联网 物流 仓储

MySQL-技术专题-STRAIGHT_JOIN

码界西柚

浅析一个较完整的SpringBoot项目

田维常

spring Boot Starter

【原创】Spring Boot 如何手写stater

田维常

spring Boot Starter

【原创】Spring Boot终极篇《上》

田维常

spring Boot Starter

国家超算深圳中心计划2年内提升计算能力至少1000倍;图神经网络的生成式预训练论文解读

京东科技开发者

云计算

区块链数字货币商城系统开发技术

薇電13242772558

区块链 数字货币

华为20级工程师吐血整理出600页Spring微服务架构设计,绝了!

996小迁

Java spring 编程 架构 微服务

【原创】SpringBoot 这几种配置文件方式,你都用过吗?

田维常

spring Boot Starter

想不通(关于人生的突发奇想)

干啥啥不行的赢

华为云FusionInsight湖仓一体解决方案的前世今生

华为云开发者联盟

数据库 华为 仓库

MySQL-技术专题-创建临时表

码界西柚

用时半个月,终于把2020年各大公司的Java面试题精选整理成文档了

Java架构之路

Java 架构 面试 编程语言

WebSocket连接错误Error during WebSocket handshake Unexpected response code 404

码界西柚

写给程序员的中间件入门课_语言 & 开发_头哥侃码_InfoQ精选文章