java web

消息队列

消息中间件经常用来解决内部服务之间的异步调用问题 ,它可以在分布式系统的不同服务之间进行消息的发送和接收。消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋和消息通讯等问题,实现高性能,高可用,可伸缩和最终一致性架构。目前使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ。

使用消息队列的好处
1. 通过异步处理提高系统性能
在不使用消息队列服务器的时候,用户的请求数据直接写入数据库,在高并发的情况下数据库压力剧增,使得响应速度变慢。但是在使用消息队列之后,用户的请求数据发送给消息队列之后立即返回,再由消息队列的消费者进程从消息队列中获取数据,异步写入数据库。由于消息队列服务器处理速度快于数据库(消息队列也比数据库有更好的伸缩性),因此响应速度得到大幅改善。通过以上分析我们可以得出消息队列具有很好的削峰作用的功能——即通过异步处理,将短时间高并发产生的事务消息存储在消息队列中,从而削平高峰期的并发事务。 在电子商务一些秒杀、促销活动中,合理使用消息队列可以有效抵御促销活动刚开始大量订单涌入对系统的冲击。
2. 降低系统耦合性

使用消息队列会带来什么问题?
系统可用性降低: 需要考虑消息丢失或者说MQ挂掉等情况
系统复杂性提高: 需要保证消息没有被重复消费、处理消息丢失的情况、保证消息传递的顺序性等问题
一致性问题: 万一消费者没有正确消费消息就会导致数据不一致的情况了

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

ActiveMQ

ActiveMQ是一种开源的,实现了JMS1.1规范的,面向消息(MOM)的中间件,为应用程序提供高效的、可扩展的、稳定的和安全的企业级消息通信。
Activemq的作用就是系统之间进行通信。使用 Activemq可以对系统之间的调用进行解耦,实现系统间的异步通信。
原理就是生产者生产消息,把消息发送给activemq。Activemq 接收到消息, 然后查看有多少个消费者, 然后把消息转发给消费者。
 

消息队列的两种通信方式
1. 同步方式
    两个通信应用服务之间必须要进行同步,两个服务之间必须都是正常运行的。发送程序和接收程序都必须一直处于运行状态,并且随时做好相互通信的准备。
发送程序首先向接收程序发起一个请求,称之为发送消息,发送程序紧接着就会堵塞当前自身的进程,不与其他应用进行任何的通信以及交互,等待接收程序的响应,待发送消息得到接收程序的返回消息之后会继续向下运行,进行下一步的业务处理。
2. 异步方式
    两个通信应用之间可以不用同时在线等待,任何一方只需各自处理自己的业务,比如发送方发送消息以后不用登录接收方的响应,可以接着处理其他的任务。也就是说发送方和接收方都是相互独立存在的,发送方只管方,接收方只能接收,无须去等待对方的响应。Java中JMS就是典型的异步消息处理机制。

消息队列的两种通信模式
1.点到点模式
一个消息生产者向消息服务器端一个特定的队列发送消息,一个消费者从该队列中读取消息。在这种模型下,消息生产者知道消息消费者的队列并直接将消息发送到消息消费者的队列。这种模型的特点为:能够保证数据安全;点对点模式的话, 如果消息发送不成功此消息默认会保存到 activemq 服务端直到有消费者将其消费, 所以此时消息是不会丢失的。
2.发布订阅模式
一个消息发布者向一个特定的消息主题发布消息,0或多个对此消息主题感兴趣的并且处于活动状态的消息订阅者或者建立了持久订阅的消息订阅者才可以接收到所发布的消息。这种模型的特点为:可能造成数据丢失。默认情况只通知一次,如果接受不到此消息就没有了,这种场景使用于对消息发送率要求不高的情况,如果要求消息必须送达不可以丢失的话,需要配置持久订阅。

引入消息队列之后如何保证高可用性

单点的ActiveMQ作为企业应用无法满足高可用和集群的需求,所以ActiveMQ提供了master-slave、broker cluster等多种部署方式来满足分布式和高可用的需求。

如何保证消息不被重复消费呢?
解决方法:增加消息状态表,用来记录消息的处理状态,每次处理消息之前,都去状态表中查询一次,如果已经有相同的消息存在,那么不处理,可以防止重复消费。

如何保证消息的可靠性传输(如何处理消息丢失的问题)

消息队列满了的情况下,会产生消息丢失的现象。解决方法如下:
1. 用持久化消息【可以使用对数据进行持久化JDBC,AMQ(日志文件),KahaDB和LevelDB】
2. 非持久化消息及时处理不要堆积
3. 启动事务,启动事务后,commit()方法会负责任的等待服务器的返回,也就不会关闭连接导致消息丢失了。

怎么保证从消息队列里拿到的数据按顺序执行?

1、单线程消费来保证消息的顺序性;2、对消息进行编号,消费者处理时根据编号判断顺序。 activeMq 里面有 messageGroups 属性,可以指定 JMSXGroupID,消费者会消费指定的 JMSXGroupID。即保证了顺序性,又解决负载均衡的问题。

如何解决消息队列的延时以及过期失效问题?消息队列满了以后该怎么处理?有几百万消息持续积压几小时,说说怎么解决?

如果让你来开发一个消息队列中间件,你会怎么设计架构?

什么情况下才使用消息队列
多个项目之间集成:跨平台、多语言、多项目

持久化消息非常慢
默认的情况下,非持久化的消息是异步发送的,持久化的消息是同步发送的,遇到慢一点的硬盘,发送消息的速度是无法忍受的。但是在开启事务的情况下,消息都是异步发送的,效率会有2个数量级的提升。所以在发送持久化消息时,请务必开启事务模式。其实发送非持久化消息时也建议开启事务,因为根本不会影响性能。

服务挂掉
在通常的情况下,非持久化消息是存储在内存中的,持久化消息是存储在文件中的,它们的最大限制在配置文件的<systemUsage>节点中配置。但是,在非持久化消息堆积到一定程度,内存告急的时候,ActiveMQ会将内存中的非持久化消息写入临时文件中,以腾出内存。虽然都保存到了文件里,但它和持久化消息的区别是,重启后持久化消息会从文件中恢复,非持久化的临时文件会直接删除

两个角色
Producer(生产者):发消息
Consumer(消费者):收消息

RPC(Remote Procedure Call)

  远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发分布式程序就像开发本地程序一样简单。
  RPC采用客户端(服务调用方)/服务器端(服务提供方)模式, 都运行在自己的JVM中。客户端只需要引入要使用的接口,接口的实现和运行都在服务器端。RPC主要依赖的技术包括序列化、反序列化和数据传输协议,这是一种定义与实现相分离的设计。目前Java使用比较多的RPC方案主要有RMI(JDK自带)、Hessian、Dubbo以及Thrift等。
注意: RPC主要指内部服务之间的调用,RESTful也可以用于内部服务之间的调用,但其主要用途还在于外部系统提供服务,因此没有将其包含在本知识点内。

RPC适用场合

  • 希望同步得到结果的场合,RPC合适。
  • 希望使用简单,则RPC;RPC操作基于接口,使用简单,使用方式模拟本地调用。异步的方式编程比较复杂。
  • 不希望发送端(RPC Consumer、Message Sender)受限于处理端(RPC Provider、Message Receiver)的速度时,使用Message Queue。

常见RPC框架:

  • RMI(JDK自带): JDK自带的RPC
  • Dubbo: Dubbo是 阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。
  • Hessian: Hessian是一个轻量级的remotingonhttp工具,使用简单的方法提供了RMI的功能。 相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用的是二进制协议,所以它很适合于发送二进制数据。
  • Thrift: Apache Thrift是Facebook开源的跨语言的RPC通信框架,目前已经捐献给Apache基金会管理,由于其跨语言特性和出色的性能,在很多互联网公司得到应用,有能力的公司甚至会基于thrift研发一套分布式服务框架,增加诸如服务注册、服务发现等功能。

如何选择框架:

  • 是否允许代码侵入: 即需要依赖相应的代码生成器生成代码,比如Thrift。
  • 是否需要长连接获取高性能: 如果对于性能需求较高的haul,那么可以果断选择基于TCP的Thrift、Dubbo。
  • 是否需要跨越网段、跨越防火墙: 这种情况一般选择基于HTTP协议的Hessian和Thrift的HTTP Transport。

REST

REST代表REpresentational State Transfer,它使用HTTP协议将数据从客户端发送到服务器。REST使用JSON来传递数据。用URL定位资源,使用PUT/DELETE/GET/POST HTTP方法来对应CURD操作。
1. REST是一种基于HTTP的RPC。RESTful是一种http架构风格,而不是具体的协议。
2. RPC是远程方法调用,服务端和客户端可以是异构的系统,可跨平台。
3. SOAP是WebService的协议,使用XML作为通信数据,比REST重量

REST基础概念

  • 在REST中的一切都被认为是一种资源。资源是REST架构中数据的表示方式。
  • 每个资源由URI标识。
  • 使用统一的接口。处理资源使用POST,GET,PUT,DELETE操作类似创建,读取,更新和删除(CRUD)操作。
  • 无状态。每个请求是一个独立的请求。从客户端到服务器的每个请求都必须包含所有必要的信息,以便于理解。
  • 通信都是通过展现。例如XML,JSON

REST 系统的特征

  • 客户-服务器(Client-Server),提供服务的服务器和使用服务的客户需要被隔离对待。
  • 无状态(Stateless),来自客户的每一个请求必须包含服务器处理该请求所需的所有信息。换句话说,服务器端不能存储来自某个客户的某个请求中的信息,并在该客户的其他请求中使用。
  • 可缓存(Cachable),服务器必须让客户知道请求是否可以被缓存。
  • 分层系统(Layered System),允许服务器和客户之间的中间层(代理,网关等)可以代替服务器对客户的请求进行回应,而且这些对客户来说不需要特别支持。
  • 统一接口(Uniform Interface),客户和服务器之间通信的方法必须是统一化的。(GET,POST,PUT.DELETE, etc)

REST 例子
获取 GET /rest/api/getBooks    -->  GET /rest/api/books
添加 GET /rest/api/addBooks   -->  POST /rest/api/books
修改 GET /rest/api/editBooks/:bookId     -->  PUT /rest/api/books/:bookId
删除 GET /rest/api/deleteBooks/:bookId -->  DELETE /rest/api/books/:bookId

什么是安全的REST操作?
一些不修改服务器资源的HTTP操作称为安全操作,包括GET和HEAD。而PUT,POST和DELETE是不安全的,因为它们修改了服务器上的资源

接口的幂等性(是否会造成2次伤害)
一个接口通过1次相同的访问,再对该接口进行N次相同的访问时候,对资源不造影响,那么就认为接口具有幂等性。
GET: 安全且幂等
POST: 不安全且不幂等,第二次会再次新增。
PUT:   不安全但幂等,第二次不会再次更新。
PATCH: 不安全但幂等,第二次不会再次更新。
DELTE:  不安全但幂等,第二次不再删除。

REST通常是无状态的吗?
REST是无状态的,因为它基于HTTP,也是无状态的。REST API中的请求应包含处理它所需的所有信息。它不应该依赖于前/下一个请求,或服务器端维护的某些数据(例如会话)。

响应代码的处理有必要吗?
HTTP的响应代码可用于应付不同场合,例如,201("Created")响应代码表明已经创建了一个新的资源,其URI在Location响应报头里。假如你不利用HTTP状态代码丰富的应用语义,那么你将错失提高重用性、增强互操作性和提升松耦合性的机会。

成功的DELETE语句的HTTP状态返回码是什么?
通常如果DELETE操作成功,则响应主体为空,返回204 No Content.如果DELETE请求成功且响应主体不为空,则返回200。

直接忽视缓存可取吗?
禁用缓存时可以在HTTP响应里增加这样一个报头: Cache-control: no-cache。 但是同时你也对失去了高效的缓存与再验证的支持(使用Etag等机制)。对于客户端来说,在为一个REST式服务实现程序客户端时,也应该充分利用现有的缓存机制,以免每次都重新获取表示。

REST可扩展和/或可互操作吗?
REST具有可扩展性和可互操作性。它不要求在客户端或服务器端特定的技术选择。你可以使用Java,C ++,Python或JavaScript来创建RESTful Web服务并在客户端使用它们。

REST的安全性
REST通常不安全,但你可以使用Spring Security来保护它。至少,你可以在Spring Security配置文件中使用HTTP启用HTTP基本身份认证。同样,如果底层服务器支持HTTPS,则可以使用HTTPS公开REST API。

REST是否与传输层安全性(TLS)一起使用?
传输层安全性(TLS)用于客户端和服务器之间的安全通信。它是SSL(安全套接字层)的继承者。由于HTTPS可以同时使用SSL和TLS,因此REST也可以与TLS一起使用。
实际上,在REST中,由服务器来实现安全协议。如果服务器支持SSL,则可以使用HTTP和HTTPS访问相同的RESTful Web服务。

ETL ( Extract-Transform-Load )

数据仓库技术,将业务系统的数据经过抽取、清洗转换之后加载到数据仓库的过程,目的是将企业中的分散、零乱、标准不统一的数据整合到一起,为企业的决策提供分析依据。

ELT架构的优势:

  1. ELT主要通过数据库引擎来实现系统的可扩展性(尤其是当数据加工过程在晚上时,可以充分利用数据库引擎的资源)
  2. ELT可以保持所有的数据始终在数据库当中,避免数据的加载和导出,从而保证效率,提高系统的可监控性。
  3. ELT可以根据数据的分布情况进行并行处理优化,并可以利用数据库的固有功能优化磁盘I/O。
  4. ELT的可扩展性取决于数据库引擎和其硬件服务器的可扩展性。
  5. 通过对相关数据库进行性能调优,ETL过程获得3到4倍的效率提升一般不是特别困难。

CloverETL

CloverETL是一个基于Java的开源的ETL框架,同时还包含了一个 ETL设计器——CloverETL Designer。核心的算法就是一个数据流网络。
CloverETL支持大多数主流数据库系统,并且它是一个跨平台产品,支持Windows 系列,Linux系列,Unix系列操作系统,有很强的可移植性。
CloverETL目前最新稳定版是CloverETL3.0.1。官方也同时推有收费版和免费版。
   收费版:桌面版(个人版),企业版,主要针对企业级大型开发;
   免费版:社区版(有桌面版和基于eclipse的插件版,针对个人或小型开发),引擎版,针对开源化开发。

Applet(Java小应用程序)

什么是Applet?
java applet是能够被包含在HTML页面中并且能被启用了java的客户端浏览器执行的程序。Applet主要用来创建动态交互的web应用程序。

Applet的生命周期
Init:每次被载入的时候都会被初始化。
Start:开始执行applet。
Stop:结束执行applet。
Destroy:卸载applet之前,做最后的清理工作。

当applet被载入的时候会发生什么?
首先,创建applet控制类的实例,然后初始化applet,最后开始运行。

Applet和普通的Java应用程序有什么区别?
1. applet是运行在启用了java的浏览器中,Java应用程序是可以在浏览器之外运行的独立的Java程序。但是,它们都需要有Java虚拟机。
2. Java应用程序需要一个有特定方法签名的main函数来开始执行。Java applet不需要这样的函数来开始执行。
3. Java applet一般会使用很严格的安全策略,Java应用一般使用比较宽松的安全策略。

Java applet有哪些限制条件?
主要是由于安全的原因,给applet施加了以下的限制:
1. applet不能够载入类库或者定义本地方法。
2. applet不能在宿主机上读写文件。
2. applet不能读取特定的系统属性。
4. applet不能发起网络连接,除非是跟宿主机。
5. applet不能够开启宿主机上其他任何的程序。

什么是不受信任的applet?
不受信任的applet是不能访问或是执行本地系统文件的Java applet,默认情况下,所有下载的applet都是不受信任的。

从网络上加载的applet和从本地文件系统加载的applet有什么区别?
当applet是从网络上加载的时候,applet是由applet类加载器载入的,它受applet安全管理器的限制。
当applet是从客户端的本地磁盘载入的时候,applet是由文件系统加载器载入的。从文件系统载入的applet允许在客户端读文件,写文件,加载类库,且允许执行其他程序,但却通不过字节码校验。

applet类加载器是什么?它会做哪些工作?
当applet是从网络上加载的时候,它是由applet类加载器载入的。类加载器有自己的java名称空间等级结构。类加载器会保证来自文件系统的类有唯一的名称空间,来自网络资源的类有唯一的名称空间。当浏览器通过网络载入applet的时候,applet的类被放置于和applet的源相关联的私有的名称空间中。然后,那些被类加载器载入进来的类都是通过了验证器验证的。验证器会检查类文件格式是否遵守Java语言规范,确保不会出现堆栈溢出(stack overflow)或者下溢(underflow),传递给字节码指令的参数是正确的。

applet安全管理器是什么?它会做哪些工作?
applet安全管理器是给applet施加限制条件的一种机制。浏览器可以只有一个安全管理器。安全管理器在启动的时候被创建,之后不能被替换覆盖或者是扩展。

Servlet

什么是Servlet?
Servlet是用来处理客户端请求并产生动态网页内容的Java类。Servlet主要是用来处理或者是存储HTML表单提交的数据,产生动态内容,在无状态的HTTP协议下管理状态信息。

说一下Servlet的体系结构。
所有的Servlet都必须要实现的核心的接口是javax.servlet.Servlet。每一个Servlet都必须要直接或者是间接实现这个接口,或者是继承javax.servlet.GenericServlet或者javax.servlet.http.HTTPServlet。最后,Servlet使用多线程可以并行的为多个请求服务。

Applet和Servlet有什么区别?
Applet是运行在客户端主机的浏览器上的客户端Java程序。而Servlet是运行在web服务器上的服务端的组件。applet可以使用用户界面类,而Servlet没有用户界面,相反,Servlet是等待客户端的HTTP请求,然后为请求产生响应。

GenericServlet和HttpServlet有什么区别?
GenericServlet是一个通用的协议无关的Servlet,它实现了Servlet和ServletConfig接口。继承自GenericServlet的Servlet应该要覆盖service()方法。最后,为了开发一个能用在网页上服务于使用HTTP协议请求的Servlet,你的Servlet必须要继承自HttpServlet。这里有Servlet的例子。

解释下Servlet的生命周期
对每一个客户端的请求,Servlet引擎载入Servlet,调用它的init()方法,完成Servlet的初始化。然后,Servlet对象通过为每一个请求单独调用service()方法来处理所有随后来自客户端的请求,最后,调用Servlet(译者注:这里应该是Servlet而不是server)的destroy()方法把Servlet删除掉。

doGet()方法和doPost()方法有什么区别?
doGet:GET方法会把名值对追加在请求的URL后面。因为URL对字符数目有限制,进而限制了用在客户端请求的参数值的数目。并且请求中的参数值是可见的,因此,敏感信息不能用这种方式传递。
doPOST:POST方法通过把请求参数值放在请求体中来克服GET方法的限制,因此,可以发送的参数的数目是没有限制的。最后,通过POST请求传递的敏感信息对外部客户端是不可见的。

浏览器和Servlet的通信协议是什么?
浏览器和Servlet通信使用的是HTTP协议。

sendRedirect()和forward()方法有什么区别?
sendRedirect()方法会创建一个新的请求,而forward()方法只是把请求转发到一个新的目标上。重定向(redirect)以后,之前请求作用域范围以内的对象就失效了,因为会产生一个新的请求,而转发(forwarding)以后,之前请求作用域范围以内的对象还是能访问的。一般认为sendRedirect()比forward()要慢。

JSP

什么是JSP页面?
JSP页面是一种包含了静态数据和JSP元素两种类型的文本的文本文档。静态数据可以用任何基于文本的格式来表示,比如:HTML或者XML。JSP是一种混合了静态内容和动态产生的内容的技术。这里看下JSP的例子。

JSP请求是如何被处理的?
浏览器首先要请求一个以.jsp扩展名结尾的页面,发起JSP请求,然后,Web服务器读取这个请求,使用JSP编译器把JSP页面转化成一个Servlet类。需要注意的是,只有当第一次请求页面或者是JSP文件发生改变的时候JSP文件才会被编译,然后服务器调用servlet类,处理浏览器的请求。一旦请求执行结束,servlet会把响应发送给客户端。这里看下如何在JSP中获取请求参数。

JSP的优点

  • JSP页面是被动态编译成Servlet的,因此,开发者可以很容易的更新展现代码。
  • JSP页面可以被预编译。
  • JSP页面可以很容易的和静态模板结合,包括:HTML或者XML,也可以很容易的和产生动态内容的代码结合起来。
  • 开发者可以提供让页面设计者以类XML格式来访问的自定义的JSP标签库。
  • 开发者可以在组件层做逻辑上的改变,而不需要编辑单独使用了应用层逻辑的页面。

隐含对象是什么意思?有哪些隐含对象?
JSP隐含对象是页面中的一些Java对象,JSP容器让这些Java对象可以为开发者所使用。开发者不用明确的声明就可以直接使用他们。JSP隐含对象也叫做预定义变量。 

JSP页面中的隐含对象:
application,session
page,pageContext
request,response
exception,out,config            

HTTP状态码
1xx:相关信息
2xx:操作成功
3xx:重定向
4xx:客户端错误
5xx:服务器错误

Cookie和Session的的区别

---------------------
作者:鸿燕藏锋
来源:CSDN
原文:https://blog.csdn.net/yanjiangdi/article/details/77896786
版权声明:本文为博主原创文章,转载请附上博文链接!

--------------------- 
作者:九师兄-梁川川 
来源:CSDN 
原文:https://blog.csdn.net/qq_21383435/article/details/80032375 
版权声明:本文为博主原创文章,转载请附上博文链接!

 

posted @   安小  阅读(230)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示