我本身总结的Java学习的系统知识点以及面试问题,目前已经开源,会一直完善下去,欢迎建议和指导欢迎Star: github.com/Snailclimb/…html
RPC
RPC(Remote Procedure Call)—远程过程调用 ,它是一种经过网络从远程计算机程序上请求服务,而不须要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通讯程序之间携带信息数据。在OSI网络通讯模型中,RPC跨越了传输层和应用层。RPC使得开发分布式程序就像开发本地程序同样简单。git
RPC采用客户端(服务调用方)/服务器端(服务提供方)模式, 都运行在本身的JVM中。客户端只须要引入要使用的接口,接口的实现和运行都在服务器端。RPC主要依赖的技术包括序列化、反序列化和数据传输协议,这是一种定义与实现相分离的设计。github
目前Java使用比较多的RPC方案主要有RMI(JDK自带)、Hessian、Dubbo以及Thrift等。面试
注意: RPC主要指内部服务之间的调用,RESTful也能够用于内部服务之间的调用,但其主要用途还在于外部系统提供服务,所以没有将其包含在本知识点内。redis
RMI(JDK自带): JDK自带的RPC数据库
详细内容能够参考:从懵逼到恍然大悟之Java中RMI的使用服务器
Dubbo: Dubbo是 阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可经过高性能的 RPC 实现服务的输出和输入功能,能够和 Spring框架无缝集成。微信
详细内容能够参考:网络
Hessian: Hessian是一个轻量级的remotingonhttp工具,使用简单的方法提供了RMI的功能。 相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议,由于采用的是二进制协议,因此它很适合于发送二进制数据。
详细内容能够参考: Hessian的使用以及理解
Thrift: Apache Thrift是Facebook开源的跨语言的RPC通讯框架,目前已经捐献给Apache基金会管理,因为其跨语言特性和出色的性能,在不少互联网公司获得应用,有能力的公司甚至会基于thrift研发一套分布式服务框架,增长诸如服务注册、服务发现等功能。
详细内容能够参考: 【Java】分布式RPC通讯框架Apache Thrift 使用总结
此外,Google推出的基于HTTP2.0的gRPC框架也开始获得应用,其序列化协议基于Protobuf,网络框架使用的是Netty4,可是其须要生成代码,可扩展性也比较差。
消息中间件
消息中间件,也能够叫作中央消息队列或者是消息队列(区别于本地消息队列,本地消息队列指的是JVM内的队列实现),是一种独立的队列系统,消息中间件常常用来解决内部服务之间的 异步调用问题 。请求服务方把请求队列放到队列中便可返回,而后等待服务提供方去队列中获取请求进行处理,以后经过回调等机制把结果返回给请求服务方。
异步调用只是消息中间件一个很是常见的应用场景。此外,经常使用的消息队列应用场景还偷以下几个:
具体能够参考:
当前使用较多的消息队列有ActiveMQ(性能差,不推荐使用)、RabbitMQ、RocketMQ、Kafka等等,咱们以前提升的redis数据库也能够实现消息队列,不过不推荐,redis自己设计就不是用来作消息队列的。
ActiveMQ: ActiveMQ是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ是一个彻底支持JMS1.1和J2EE 1.4规范的JMSProvider实现,尽管JMS规范出台已是好久的事情了,可是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。
具体能够参考:
RabbitMQ: RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现。RabbitMQ 最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗
AMQP :Advanced Message Queue,高级消息队列协议。它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产品、开发语言等条件的限制。
具体能够参考:
RocketMQ:
具体能够参考:
《十分钟入门RocketMQ》 (阿里中间件团队博客)
Kafka:Kafka是一个分布式的、可分区的、可复制的、基于发布/订阅的消息系统,Kafka主要用于大数据领域,固然在分布式系统中也有应用。目前市面上流行的消息队列RocketMQ就是阿里借鉴Kafka的原理、用Java开发而得。
具体能够参考:
推荐阅读:
《Kafka、RabbitMQ、RocketMQ等消息中间件的对比 —— 消息发送性能和区别》
欢迎关注个人微信公众号:"Java面试通关手册"(一个有温度的微信公众号,无广告,单纯技术分享,期待与你共同进步~~~坚持原创,分享美文,分享各类Java学习资源。您想关注便关注,😁,公众号只是我记录文字和生活的地方,无所谓利益。)