Java 远程通讯技术及原理分析( 七 )

  • 处理完毕后怎么回应?遵循JMS API生成消息,并写入JMS Queue中 。
  •  
    5.6 Mina
    Mina是Apache提供的通讯框架,在之前一直没有提到网络IO这块,之前提及的框架或library基本都是基于BIO的,而Mina是采用NIO的,NIO在并发量增长时对比BIO而言会有明显的性能提升,而java性能的提升,与其NIO这块与OS的紧密结合是有不小的关系的 。
    1. 是基于什么协议实现的?基于纯粹的Socket+NIO 。
    2. 怎么发起请求?通过Mina提供的Client API 。
    3. 怎么将请求转化为符合协议的格式的?Mina遵循java串行化机制对请求对象进行序列化 。
    4. 使用什么传输协议传输?支持多种传输协议,例如socket、http等等 。
    5. 响应端基于什么机制来接收请求?以NIO的方式监听协议端口 。
    6. 怎么将流还原为传输格式的?遵循java串行化机制对请求对象进行反序列化 。
    7. 处理完毕后怎么回应?遵循Mina API进行返回 。
     
    MINA是NIO方式的,因此支持异步调用是毫无悬念的 。
    6 RPC框架的发展与现状 
    RPC(Remote Procedure Call)是一种远程调用协议,简单地说就是能使应用像调用本地方法一样的调用远程的过程或服务,可以应用在分布式服务、分布式计算、远程服务调用等许多场景 。说起 RPC 大家并不陌生,业界有很多开源的优秀 RPC 框架,例如 Dubbo、Thrift、gRPC、Hprose 等等 。下面先简单介绍一下 RPC 与常用远程调用方式的特点,以及一些优秀的开源 RPC 框架 。
    RPC 与其它远程调用方式比较,RPC 与 HTTP、RMI、Web Service 都能完成远程调用,但是实现方式和侧重点各有不同 。
    6.1 RPC与HTTP
    HTTP(HyperText Transfer Protocol)是应用层通信协议,使用标准语义访问指定资源(图片、接口等),网络中的中转服务器能识别协议内容 。HTTP 协议是一种资源访问协议,通过 HTTP 协议可以完成远程请求并返回请求结果 。
    HTTP 的优点是简单、易用、可理解性强且语言无关,在远程服务调用中包括微博有着广泛应用 。HTTP 的缺点是协议头较重,一般请求到具体服务器的链路较长,可能会有 DNS 解析、Nginx 代理等 。
    RPC 是一种协议规范,可以把 HTTP 看作是一种 RPC 的实现,也可以把 HTTP 作为 RPC 的传输协议来应用 。RPC 服务的自动化程度比较高,能够实现强大的服务治理功能,和语言结合更友好,性能也十分优秀 。与 HTTP 相比,RPC 的缺点就是相对复杂,学习成本稍高 。
    6.2 RPC与RMI
    RMI(Remote Method Invocation)是指 Java 语言中的远程方法调用,RMI 中的每个方法都具有方法签名,RMI 客户端和服务器端通过方法签名进行远程方法调用 。RMI 只能在 Java 语言中使用,可以把 RMI 看作面向对象的 Java RPC 。
    6.3 RPC与Web Service
    Web Service 是一种基于 Web 进行服务发布、查询、调用的架构方式,重点在于服务的管理与使用 。Web Service 一般通过 WSDL 描述服务,使用 SOAP通过 HTTP 调用服务 。
    RPC 是一种远程访问协议,而 Web Service 是一种体系结构,Web Service 也可以通过 RPC 来进行服务调用,因此 Web Service 更适合同一个 RPC 框架进行比较 。当 RPC 框架提供了服务的发现与管理,并使用 HTTP 作为传输协议时,其实就是 Web Service 。
    相对 Web Service,RPC 框架可以对服务进行更细粒度的治理,包括流量控制、SLA 管理等,在微服务化、分布式计算方面有更大的优势 。
    RPC 可基于 HTTP 或 TCP 协议,Web Service 就是基于 HTTP 协议的 RPC,它具有良好的跨平台性,但其性能却不如基于 TCP 协议的 RPC 。会两方面会直接影响 RPC 的性能,一是传输方式,二是序列化 。
    众所周知,TCP 是传输层协议,HTTP 是应用层协议,而传输层较应用层更加底层,在数据传输方面,越底层越快,因此,在一般情况下,TCP 一定比 HTTP 快 。
    7 总结 
    在远程通讯领域中,涉及的知识点还是相当的多的,例如有:通信协议(Socket/tcp/http/udp/rmi/xml-rpc etc.)、消息机制、网络IO(BIO/NIO/AIO)、MultiThread、本地调用与远程调用的透明化方案(涉及java classloader、Dynamic Proxy、Unit Test etc.)、异步与同步调用、网络通信处理机制(自动重连、广播、异常、池处理等等)、Java Serialization (各种协议的私有序列化机制等)、各种框架的实现原理(传输格式、如何将传输格式转化为流的、如何将请求信息转化为传输格式的、如何接收流的、如何将流还原为传输格式的等等),要精通其中的哪些东西,得根据实际需求来决定了,只有在了解了原理的情况下才能很容易的做出选择,甚至可以根据需求做私有的远程通讯协议,对于从事分布式服务平台或开发较大型的分布式应用的人而言,我觉得至少上面提及的知识点是需要比较了解的 。


    推荐阅读