中间件的定义

  • 中间件这个术语第一次出现是1968年在德国加尔米施帕滕基兴举办的 NATO 软件工程大会 结束后发表的一份报告中。
  • 这届大会正式确定了软件工程(Software Engineering)的概念,同时还探讨了软件设计、生产和分发等主题。

  • 中间件(Middleware),又译中介层,是一类提供系统软件和应用软件之间连接,便于软件各部件之间的沟通的软件,应用软件可以借助中间件在不同的技术架构之间共享信息和资源。中间件位于客户机服务器的操作系统之上,管理者计算资源和网络通信。

什么不是中间件

  • 我们按照类别来看一些经常会遇到的一些不是中间件的概念
    • 业务平台不是中间件,业务平台是从服务的视角抽象的能同时支撑多个业务,业务之间的信息能形成交互和增强的平台。
    • 营销工具不是中间件,营销工具是直接作用于最终消费者用户的软件或者插件服务。
    • 二方/三方工具包不是中间件,二方/三方工具包是在各种场景的程序开发过程中沉淀的一些常用工具类(功能)的集合,包含于软件代码本身。
    • SaaS 不是中间件,SaaS(Software as a Service) 更多的是一种软件交付模式,无需用户安装,通过网络在线访问的一种服务模式。
    • PaaS 不是中间件,PaaS(Platform as a Service) 将软件研发的平台做为一种服务,提供软件部署平台(强调的是屏蔽系统和软件细节的runtime平台)。

评判关键

  • 从定义可以总结出评判的几个地方
    • 性质:中间件是软件。
    • 作用层级:系统软件和应用软件之间、软件各部件之间;管理客户机与系统软件之间的计算资源和网络通信。
    • 服务对象:中间件为应用软件服务,应用软件为最终用户服务,最终用户并不直接使用中间件。

中间件的好处

  • 中间件能给客户带来什么?
    • 为上层应用软件的开发提供便捷的、开箱即用的服务交互和计算的能力,缩短开发周期;屏蔽底层runtime的差异;节省应用本身的系统资源,减少运行成本。

中间件分类,什么时候使用中间件

  • 基于中间件的定义我们知道中间件是连接软件与系统之间的服务,那么我们什么时候使用了中间件,在哪些地方用到了中间件了。我们不妨假设一个http请求过程来窥视一番
    • 当你在浏览器中输入一个网址时,它会通过 DNS 解析到目标服务注册的公网IP地址
    • 请求到达目标服务的 web 反向代理服务器 Tengine 之后,经过一定的过滤转发到目标服务A上
    • 服务A通过 RPC框架 Dubbo 请求服务B的结果做中间计算,并且从 Tair 缓存中读取计算因子,计算结果
    • 服务A接着使用 Druid 通过 TDDL 写入计算结果到 MySQL Master 节点然后返回结果
    • 异步过程中 Canal 通过模拟 Binlog 主从复制的原理,迅速将这条 Binlog 消费并下发到消息队列 RocketMQ
    • 服务C通过 RocketMQ 消费到事件之后,通过配置中心 ConfigServer 拉取到的策略进行对应策略的事件处理。
  • 这个过程中我们使用了一系列的中间件来协同各个微服务完成整个流程,如web反向代理服务器 Tengine、RPC框架 Dubbo、缓存 Tair、连接池 Driud、数据库代理层 TDDL、Binlog 同步工具 Canal、消息队列 RocketMQ、配置中心 ConfigServer。

常用基础中间件

  • 路由与web服务器:处理和转发其他服务器通信数据的服务器。 如被业界广泛使用的阿里基于 Nginx 研发的 Tengine、阿里内部的集中式路由服务 VipServer
  • RPC框架:微服务时代的远程服务调用框架。如grpc, Thrift, 阿里的 HSF, Dubbo, SOFA-RPC
  • 消息中间件:支持在分布式系统之间发送和接收消息的软件。 如 Apache kafka, Apache RabbitMQ, NSQ, 阿里孵化开源的 Apache RocketMQ
  • 缓存服务: 分布式的高速数据存储层,一般是内存存储。如 阿里 Tair,业界的 Redis, Memcached, Ehcache
  • 配置中心:用来统一管理各个项目中所有配置的系统。如 阿里 Nacos、携程 Apollo、百度 Disconf
  • 分布式事务:事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。 如 阿里 seata、腾讯 DTF
  • 任务调度:分布式环境下提供定时、任务编排、分布式跑批等功能的系统。如 阿里 SchedulerX、业界 xxl-job、当当 elastic-job、有赞 TSP
  • 数据库层 用于支持弹性扩容和分库分表的 TDDL,数据库连接池 Driud, Binlog 同步的 Canal 等

中间件云产品

  • 随着云时代的到来,大量公司的业务向云上迁移;为了云上客户能够便捷的使用稳定高效的中间件能力,云厂商开始将自身沉淀的基础中间件能力云化,用于支撑各个云上客户和自身业务的快速生长

什么是中间件开发

  • 随着国内软件行业的发展,国内互联网公司规模越来越大,业务越来越复杂,随之使用大量的中间件来提升后台服务性能。由此产生了中间件开发和维护人员。
  • 诚然,在小公司,中间件,例如缓存,MQ,RPC 等服务,极大可能是由业务开发人员自己维护,或者委托第三方云平台运维(支付一些费用)。但,如果后台开发超过 200 人,基本就会组建自己的中间件或者基础架构团队,用于维护后台服务器基础架构和中间
  • 更大规模的公司,则由于各种各样的原因(性能,KPI),会自己开发中间件,简称自研。这要求中间件团队需要更多的人员。

中间件开发人员需要哪些素质

  • 既然需要中间件开发人员,那么中间件开发人员一般从哪里招聘呢?招聘的要求是什么
  • 通常,一个公司在刚开始组建中间件团队的时候,都会从公司内部挑选精英人才,或者挑选对中间件感兴趣的人才。这时候,可能你没有相关经验,但你仍然有机会参与到中间件开发中。反之,如果你没有中间件开发经验,想通过招聘的方式进入中间件行业,那么相对而言,会有些曲折
  • 那么,假设,你想从事中间件开发,但,你没有中间件开发经验,且,你的公司也没有组建中间件团队的打算。
  • 该怎么突破?
    • 跳槽。跳槽到别的公司的中间件团队。
  • 这里就涉及到了一个中间件团队需要哪些技能。因为跳槽肯定就要面试,如果你面试的是中间件岗位,那么自然,就需要准备中间件的相关知识。
  • 另外,还有一点,在这个分工明确的时代,即使是中间件,也有很多种类,我这里稍微分一下,可能不是很准确。
    • 服务治理中间件,例如 RPC 相关中间件,限流熔断,链路追踪,分布式配置中心等等。你可以从 SpringCloud 里找到相关的产品。当然国内也有很多优秀的产品。
    • 存储中间件,例如缓存,MQ等等,如果存储涉及到分布式(通常都会涉及),那么要求相对较高。
    • 各种 Proxy,不论是数据库,还是 Cache,还是各种存储,通常单机无法承载海量数据,比较简单的办法就是使用 Proxy 进行代理,让应用透明的使用集群。出于性能考虑,这里通常会使用性能较高的产品,例如 goLang,C++ 等。Java 的长处——开发效率,在这个地方权重不大。
    • 各种分布式中间件,例如 ZK 这种,这个我个人认为难度是较大的。分布式向来是软件开发中比较困难的一个点。特别是涉及到存储和一致性。
    • 容器相关,k8s,docker等,容器化已经是大势所趋
  • 回到之前的话题: 一个中间件开发者需要哪些素质?
    • 语言基础。从 Java 程序员的角度,基础通常就是:集合,并发,JVM,Netty,IO、NIO(mmap,sendfile)
    • 计算机基础,由于中间件开发人员经常和 OS 打交道,所以计算机基础也必不可少,例如文件系统(IO/磁盘),进程线程,内存管理。
    • 网络基础,搞后台的人员,肯定要对网络熟悉了,熟悉在 Linux 下排查网络问题,熟悉 Epoll 原理等。
    • 分布式相关知识,互联网海量数据背景下,分布式知识必不可少,CAP, Paxos,Raft,zab,2pc,3pc,base等等。最好能根据这些理论写出实现代码。
    • 熟悉开源实现,即使你是业务开发人员,你也 100% 会接触开源项目,例如 Spring,那么,通常你需要对这种常用的开源代码有深刻的理解,不仅知晓其原理,也领会其设计。从大的角度看,你得看清整个框架的背景,设计和取舍,从小的角度看,你得看清框架的内部实现细节,有哪些有趣的地方(通常这种框架都会进行性能优化)。
    • 了解行业风向标,中间件行业和业务开发稍有不同,每个中间件的版本升级都会让该领域的开发者们侧目(类似 iPhone 发布会),了解其特性,进而了解行业趋势,最后成为行业引领