中间件 - 初识

中间件 - 初识

​ 在Java项目实际开发中,我们所使用的ActiveMQ、RibbitMQ、Kafka、Tomcat、WebLogic,这些都可以统称为中间件。

​ 我们初次去了解,什么是中间件?

一、中间件简介

​ 什么是中间件?

​ 由于业务、机构和技术是不断变化的,因此为其服务的软件系统必须适应这样的变化。在合并、添加服务或扩展可用服务之后,公司可能无力负担重新创建信息系统所需的成本。正是在这个关键时刻,才需要集成新组件或者尽可能高效地扩展现有组件。要集成异类组件,最方便的方法不是将它们重新创建为同类元素,而是提供一个允许它们进行通信(不考虑它们之间的差异)的层。该层被称作中间件。

中间件-01

​ 维基百科中的介绍:

中间件(英语:Middleware),又译中间件、中介层,是提供系统软件和应用软件之间连接的软件,以便于软件各部件之间的沟通。在现代信息技术应用框架如 Web 服务、面向服务的体系结构等项目中应用比较广泛。如数据库、Apache 的 Tomcat ,IBM 公司的 WebSphere ,BEA 公司的 WebLogic 应用服务器,东方通公司的 Tong 系列中间件,以及 Kingdee 公司的等都属于中间件。

​ 中间件,顾名思义,就是连接在两个软件之间的东西,是软件之间的一个粘合剂,一个胶水一样的东西。它位于操作系统和我们的应用程序之间,可以让开发者方便地处理通信、输入和输出,使开发者能够专注于自己的业务逻辑开发。

​ 这么一说,好像 Tomcat 确实还有点像中间件!位于我们的操作系统和应用程序之间!

二、中间件分类

​ 中间件有很多,早在 1998 年 IDC 公司就将中间件分成了 6 大类,国内 2005 年之前出版的中间件相关的书上,很多都是按照这 6 大类来分的,分别是:

  1. 终端仿真/屏幕转换
  2. 数据访问中间件(UDA)
  3. 远程过程调用中间件(Remote Procedure Call, RPC)
  4. 消息中间件(MOM)
  5. 交易中间件(TPM)
  6. 对象中间件(Object Request Broker, ORB)

​ 这里边除了消息中间件和交易中间件大家可能听说过之外,其他的中间件估计都很少听说,这是因为时代在变化,有的中间件慢慢被淘汰了(例如 终端仿真/屏幕转换 中间件),有的则慢慢合并到其他框架中去了(例如 远程过程调用中间件)。

三、面向消息的中间件 (Message-Oriented Middleware, MOM)

3.1 消息中间件介绍

​ 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合、异步消息、流量削锋等问题。实现高性能、高可用、可伸缩和最终一致性架构。是大型分布式系统不可缺少的中间件。

3.2 消息中间件的结构

中间件-02

四.JMS(Java Message Service)

4.1 什么是jms?

JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。

4.2 JMS 消息传送模式

中间件-3

  • 客户端 A、C 和 D之间的消息传送说明了点对点模式(P2P)。客户端使用此模式向队列目的地发送一条消息,只有一个接收者能够从该目的地获得该消息。访问该目的地的其他任何接收者都不能获得该消息。
  • 客户端 B、E 和 F之间的消息传送说明了发布/订阅模式(publish-subscribe)。客户端使用此广播模式向主题目的地发送一条消息,任意数量的使用方订户都可以从该目的地检索此消息。每个订户都获得此消息的一个副本。

4.3 JMS 消息传送对象

JMS 消息传送的对象在编程域中基本保持不变:连接工厂、连接、会话、生成方、使用方、消息和目的地。

中间件-4

五、MQ (Message Queue)

MQ全称为Message Queue,消息队列(MQ)是正确而又完整的 JMS 实现,消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过写和检索出入列队的针对应用程序的数据(消息)来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。

5.1 应用场景

1. 异步处理

   场景说明:新用户注册发放100积分,180元新手大礼包,激活会员卡,传统的做法有两种:串行方式,并行方式。    
  • 串行方式

中间件-5


  • 使用消息队列

中间件-6

以上两种方式,很容易发现同步处理的情况下都会涉及到非主业务的其他操作,其实注册的的主流程不应该受其他事件影响,通过消息队列的方式,可以把后续的处理流程进行异步处理可以大大提高响应速度。

2. 应用解耦

场景说明:企业中经常出现企业合作如:本公司的驴粉卡与电信合作,新开卡的用户从电信端推送到我方,除了相对应的福利外,首先判断是否注册本公司账户,
没有给予注册,但是新用户的相对应权益需要对等的发放。
  • 传统方式

中间件-7

缺点:

1.与其他系统过度耦合
2.短信发放或优惠券发放失败,影响主业务


  • 使用消息队列

中间件-8

优点:

1.注册完成然后将消息写入队列返回成功。
2.发放权益业务不影响主业务,实现解耦。


3. 秒杀方案

场景说明:秒杀活动对稀缺或者特价的商品进行定时定量售卖,吸引成大量的消费者进行抢购,但又只有少部分消费者可以下单成功。
因此,秒杀活动将在较短时间内产生比平时大数十倍,上百倍的页面访问流量和下单请求流量。
  • 秒杀前:用户不断刷新商品详情页,页面请求达到瞬时峰值。
  • 秒杀开始:用户点击秒杀按钮,下单请求达到瞬时峰值。
  • 秒杀后:一部分成功下单的用户不断刷新订单或者产生退单操作,大部分用户继续刷新商品详情页等待退单机会。

中间件-9

  • 秒杀前,用户不断刷新商品详情页,造成大量的页面请求。所以,我们需要把秒杀商品详情页与普通的商品详情页分开。对于秒杀商品详情页尽量将能静态化的元素静态化处理,除了秒杀按钮需要服务端进行动态判断,其他的静态数据可以缓存在浏览器和CDN 上。这样,秒杀前刷新页面导致的流量进入服务端的流量只有很小的一部分。
  • 利用读写分离 Redis 缓存拦截流量(活动未开始时拦截大部分动态数据请求)
  • 成功参与下单后,进入下层服务,开始进行订单信息校验,库存扣量。为了避免直接访问数据库,我们使用主从版 Redis 来进行库存扣量
  • 如果还有大量并发的请求则利用消息队列组件,当秒杀服务将订单信息写入消息队列后,即可认为下单完成,避免直接操作数据库。

转载于:https://www.cnblogs.com/shi-tian/p/11488729.html

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

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

相关文章

VUE 解决:Property or method “deleteFun“ is not defined on the instance but referenced during render.

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1. 一个点击事件报错: Property or method "deleteFun" is not defined on the instance but referenced during…

2014年广州科目三道路驾驶技能考试/广汕路科目三路考系统操作和评判指南

一 上车准备 上车准备操作要点: 绕车一周,观察车辆外观和周围环境,确认安全。 考生绕车一周,检查轮胎气压、轮胎磨损情况、轮胎螺栓有无松动,检查有无漏水、漏油等情况,车辆外观有无凹凸等碰撞情况&…

Bootstrap 中: data-toggle 与 data-target 的作用

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 <buttontype"button"class"update-button"style"width:70px; height:40px;"data-toggle"modal&…

VUE 解决:Method “xxx“ has already been defined as a data property.

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1.调用方法报错&#xff1a; Method "changePage" has already been defined as a data property. 代码写法&#xff1a; 2…

C# 模拟Windows键盘事件

发送键盘消息 1 [DllImport("user32.dll", EntryPoint "keybd_event", SetLastError true)] 2 public static extern void keybd_event( 3 byte bVk, //虚拟键值 4 byte bScan,// 一般为0 5 int…

CDN 的作用与基本过程

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 技术原理解说也可参见另一文&#xff1a;https://blog.csdn.net/jiangyu1013/article/details/88795690 1.简介 CDN&#xff0c;Content …

CDN(内容分发网络)技术原理

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 前言 Internet的高速发展&#xff0c;给人们的工作和生活带来了极大的便利&#xff0c;对Internet的服务品质和访问速度要求越来越高…

视界云:CDN{内容分发网络} 知识详解

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 CDN 全称:Content Delivery Network或Content Ddistribute Network&#xff0c;即内容分发网络 基本思路&#xff1a; 尽可能避开互联…

更改 nginx 默认端口 ( ubuntu、linux )

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 我想让一个demo 站点直接域名访问&#xff0c;不带端口&#xff0c;所以想用 80 端口启动对应前端工程。 发现 80 被 nginx 占用&a…

怎么更改Rstudio中的默认目录

方法一、 每次启动Rstudio之后&#xff0c;执行代码 setwd("F:/R/R_data")默认目录就会修改为双引号内的位置路径。 方法二、 对Rstudio进行设置一次即可。 ①点击Tools&#xff0c;打开Global Options. ②将位置设置完毕&#xff0c;点击 Apply 确认即可。 ③Rstudi…

docker 虚悬镜像 ( 悬空镜像 ) :镜像没有仓库名或没有标签

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 我们在build镜像的过程中&#xff0c;可能会产生一些临时的不具有名称也没有作用的镜像他们的名称一般都是<none>, 我们可以执…

Docker 下载 JDK 镜像(docker search 、docker pull)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 我有一个dockerfile 中要引用 jdk。 运行脚本发现 居然没有JDK 原始镜像。早期是下载过的&#xff0c;不记得什么时候清掉了。 于是重新…

数据结构与算法-ADT-Array

Array ADT 一维数组是连续元素的集合&#xff0c;其中的每个元素都可以通过唯一的整数下标来存取。数组的大小在创建后不能修改。 ADT 定义&#xff1a; Array(size): 创建一个长度为 size 的一维数组&#xff0c;并且将每个元素初始化成 Nonelength(): 返回数组中的元素个数ge…

前端VUE工程不占用80端口,浏览器不带端口访问VUE项目的实现

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1.需求&#xff1a;直接域名访问项目&#xff0c;不用IP&#xff0c;也不带端口号。 1&#xff09;访问项目方法通常是 IP&#xff1a;…

ResourceDictionary主题资源替换(二) :编译期间,替换主题资源

之前的ResourceDictionary主题资源替换&#xff08;一&#xff09;通过加载顺序来覆盖之前的主题资源&#xff0c;介绍了WPF框架对ResourceDictionary资源的合并规则。 此篇介绍一种在编译期间&#xff0c;实现资源替换的方案 前言 如下图&#xff0c;项目中存在俩个主题资源字…

解决 idea 中 jsp 修改后页面不生效

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1.问题描述&#xff1a;idea 编辑 jsp , 修改好后在 浏览器访问却发现页面完全无变化 。 2.解决&#xff0c;要在 idea 中作如下设置&a…

解决 :IDEA 修改代码后 Local Changes 中没有提示待提交文件,代码自动提交了

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 通常修改代码后 会在 Local Changes 中提示修改过的文件&#xff0c;如下&#xff1a; 2. 我的情况是 &#xff0c;在这个界面中什么…

解决:Caused by: java.lang.UnsupportedOperationException: null

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1.报错&#xff1a; 严重: Servlet.service() for servlet [lbd-institution] in context with path [/ins] threw exception [Reques…

IntelliJ IDEA 设置代码检查级别

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 设置代码检查等级   IntelliJ IDEA中最右下角的小按钮可以设置当前编辑文档的代码检查等级&#xff0c;如图   Inspections 为最高等…

spring 中构造Constructor、@Autowired、@PostConstruct、静态方法的执行顺序 (@PostConstruct 说明)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 关于注解 PostConstruct public interface PostConstructPostConstruct 注释用于在依赖关系注入完成之后需要执行的方法上&#xff…