Bootstrap

【中间件——中间件的相关概念和定义】

1. 中间件的相关概念

1.1 什么是中间件

中同件(Middleware)是处于操作系统和应用程序之同的软件,也有人认为它应该属于操作系统中的一部分。人们在使用中同件时,往往是一组中同件集成在一起,构成一个平台(包括开发平台和运行平台),但在这组中间件中必须要有一个通信中间件,即中间件=平台+通信,这个定义也限定了只有用于分布式系统中才能称为中间件,同时还可以把它与支撑软件和实用软件区分开来。

1.2 为什么需要使用消息中间件

具体地说,中间件屏蔽了底层操作系统的复杂性,使程序开发人员面对一个简单而统一的开发环境,减少程序设计的复杂性,将注意力集中在自己的业务上,不必再为程序在不同系统软件上的移植而重复工作,从而大大减少了技术上的负担。中间件带给应用系统的,不只是开发的简便、开发周期的缩短,也减少了系统的维护、运行和管理的工作量,还减少了计算机总体费用的投入。

1.3 中间件的特点

中间件应具有如下的一些特点:
(1)满足大量应用的需要
(2)运行于多种硬件和OS平台
(3)支持分布计算,提供跨网络、硬件和OS平台的透明性的应用或服务的交互
(4)支持标准的协议
(5)支持标准的接口

由于标准接口对于可移植性和标准协议对于互操作性的重要性,中间件已成为许多标准化工作的主要部分。对于应用软件开发,中间件远比操作系统和网络服务更为重要,中间件提供的程序接口定义了一个相对稳定的高层应用环境,不管底层的计算机硬件和系统软件怎样更新换代,只要将中间件升级更新,并保持中间件对外的接口定义不变,应用软件几乎不需任何修改,从而保护了企业在应用软件开发和维护中的重大投资。

1.4 什么时候使用中间件

在项目的架构和重构中,使用任何技术和架构的改变我们都需要谨慎斟酌和思考,因为任何技术的融入和变化都可能人员,技术,和成本的增加,中间件的技术一般现在一些互联网公司或者项目中使用比较多,如果你仅仅还只是一个初创公司建议还是使用单体架构,最多加个缓存中间件即可,不要盲目追求新或者所谓的高性能,而追求的背后一定是业务的驱动和项目的驱动,因为一旦追求就意味着你的学习成本,公司的人员结构以及服务器成本,维护和运维的成本都会增加,所以需要谨慎选择和考虑。

2.中间件技术及架构的概述

2.1 分布式消息中间件

  • ActiveMQ
  • RabbitMQ(和SpringBoot是同一家)
  • Kafka(性能最高,不支持事务)
  • RocketMQ(国产消息中间件)

适用场景

  • 消息中间件监控数据
  • 异步数据传输场景
  • 削峰填谷场景
  • 任务调度场景
  • 海量数据同步场景
  • 分布式事物场景
  • 日志管理场景
  • 大数据分析场景

遵循的协议

  • 高级消息队列协议(AMQP,底层还是TCP)
  • 轻量级的消息协议(MQTT)
  • 持久化设计
  • Kafka协议
  • 消息分发设计
  • 高可用设计
  • 可靠性设计
  • 容错设计

2.2 负载均衡中间件

  • Nginx(重要)
  • CDN(Tomcat负载均衡)
  • LVS负载均衡(防止Nginx出现问题,并用KeepAlive来保持心跳)
  • KeepAlive

2.3 缓存中间件

  • MemCache(缓存中间件)
  • Redis

2.4 数据库中间件

  • Mycat
  • ShardingJdbc(中小型项目过渡)

场景:分库分表

2.5 可以解决的场景

  • 异步消息保存
  • 订单数据的消息分发
  • 分布式事务
  • 消息的容错
  • 分布式锁
  • 分布式会话
  • 分库分表

2.5 单体架构

在企业开发的中,大部分的初期架构都采用的是单体架构的模式进行架构,而这种架构的典型的特点:就是把所有的业务和模块,源代码,静态资源文件等都放在一个一工程中,如果其中的一个模块升级或者迭代发生一个很小变动都会重新编译和重新部署项目。 这种的架构存在的问题就是:
1:耦合度太高
2:运维的成本过高
3:不易维护
4:服务器的成本高
5:以及升级架构的复杂度也会增大

在这里插入图片描述

2.6 分布式架构

何谓分布式系统呢:
通俗一点:就是一个请求由服务器端的多个服务(服务或者系统)协同处理完成
在这里插入图片描述
和单体架构不同的是,单体架构是一个请求发起jvm调度线程(确切的是tomcat线程池)分配线程Thread来处理请求直到释放,而分布式是系统是:一个请求是由多个系统共同来协同完成,jvm和环境都可能是独立。这时候就需要考虑到信息的共享和通讯问题。

分布式架构存在的问题:
1:学习成本高,技术栈过多
2:运维成本和服务器成本增高
3:人员的成本也会增高
4:项目的负载度也会上升
5:面临的错误和容错性也会成倍增加
6:占用的服务器端口和通讯的选择的成本高
7:安全性的考虑和因素逼迫可能选择RMI/MQ相关的服务器端通讯。

优点:
1:服务系统的独立,占用的服务器资源减少和占用的硬件成本减少,
确切的说是:可以合理的分配服务资源,不造成服务器资源的浪费
2:系统的独立维护和部署,耦合度降低,可插拔性。
3:系统的架构和技术栈的选择可以变的灵活(而不是单纯的选择java)
4:弹性的部署,不会造成平台因部署造成的瘫痪和停服的状态。

;