初学分布式对EJB、RMI、RPC、WebService、ESB等理解

 因为初学分布式的过程中,很多概念含糊不清,于是将有关知识做出整理,如有不对请指点更正。

       首先讲EJB:主要用于"服务集群"和"企业级开发",可以部署分布式应用程序。它既是J2EE的一种规范(指他的一系列技术规范:可扩展 Scalable、分布式 Distributed、事务处理 Transactional、数据存储 Persistent、安全性 Secure),又是一个特殊的java类(就是ejb组件:给一个类贴上规范化的标签就成了EJB类或者叫ejb组件)。    将业务逻辑从客户端软件中抽取出来,封装在一个ejb组件中,然后把这个组件运行在一个独立的服务器上(就是把原来放到客户端的"类",拿出来不放到客户端了,放到一个组件中,并将这个组件放到一个服务器上去运行,客户端通过网络调用组件提供的服务以实现业务逻辑,而客户端的功能单纯到只负责发送调用请求和显示处理结果) 。  再简单的来说,EJB 就是将那些"类"放到一个服务器上,用C/S 形式的软件客户端对服务器上的"类"进行调用。其中将业务逻辑分出来了运行在单独的EJB容器(存放运行EJB组件,相当于tomcat,常用EJB容器有weblogic、jboss等)里面,说明了他可以跨不同的电脑部署,业务逻辑、数据库可以部署在异地电脑上(这就是EJB为什么可以部署分布式应用程序的原因)。

但是EJB有一些缺点:1.web端调用服务是远程调用,但服务端调用本地数据接口获取数据的时候,也是远程调,同时涉及太多类的序列化和反序列化,导致性能不好;2.比较重量级,而且应用服务器厂商配置数据源都不一样,jboss、weblogic等都各有各的方案,导致移植性低;3.调试难,因为看不到远程的东西。。。。等等一系列的缺点导致EJB被淘汰,但是我们还是要去了解其理论,毕竟很多框架都是基于他

       由此可知EJB相当于运行在独立服务器上的组件,客户端是通过网络对EJB 对象进行调用的。在Java中,能够实现远程对象调用的技术是RMI,而EJB 技术基础正是RMI。通过RMI 技术,J2EE将EJB 组件创建为远程对象,客户端就可以通过网络调用EJB 对象了。而RMI是什么技术呢?RMI是“Remote Method Invocation",即远程方法调用,利用对象序列化来实现远程调用。其中对象的序列化过程就是将对象状态转换成字节流(就是将对象数据转为二进制码)或从字节流恢复对象。将对象状态转换成字节流之后,可以用java.io 包中的各种字节流类将其保存到文件中,或者通过网络连接将对象数据发送到另一个主机;既然说到RMI就说说RPC。RPC("远程过程调用")这个概念表示本地计算机调用远程计算机上的一个函数,RMI=对象序列化+RPC。

其中像我这种初学者要搞清楚RPC和RMI的关系,RPC是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议,支持多种语言;而RMI是Java的一组拥护开发分布式应用程序的API只支持java,可看作是sun公司对rpc的java版本的实现;另外 RMI 调用远程对象方法,允许方法返回 Java 对象以及基本数据类型。而 RPC 不支持对象的概念,传送到 RPC 服务的消息由外部数据表示 (External Data Representation, XDR) 语言表示,这种语言抽象了字节序类和数据类型结构之间的差异。只有由 XDR 定义的数据类型才能被传递, RPC 不允许传递对象。可以说 RMI 是面向对象方式的 Java RPC 。RMI和RPC之间最主要的区别在于方法是如何被调用的。在RMI中,远程接口使每个远程方法都具有方法签名。如果一个方法在服务器上执行,但是没有相匹配的签名被添加到这个远程接口上,那么这个新方法就不能被RMI客户方所调用。在RPC中,当一个请求到达RPC服务器时,这个请求就包含了一个参数集和一个文本值,通常形成“classname.methodname”的形式。这就向RPC服务器表明,被请求的方法在为“classname”的类中,名叫“methodname”。然后RPC服务器就去搜索与之相匹配的类和方法,并把它作为那种方法参数类型的输入。这里的参数类型是与RPC请求中的类型是匹配的。一旦匹配成功,这个方法就被调用了,其结果被编码后返回客户方。

        当EJB逐渐被淘汰后,著名的软件架构WebService出现了。web service就是一种跨编程语言和跨操作系统平台的远程调用技术,它规定了一种方式,告诉你将你的程序如何的部署到服务器上,然后大家通过一种协商好的地址能找到你的程序的说明,说明的格式也是大家都协商好的,所以可以读懂,然后你就可以根据那个地址来调用这个程序的方法了。webservice=xml+soap+wsdl;xml用来封装发送的请求内容和结果内容(即XML中说明调用远程服务对象的哪个方法,传递的参数是什么,以及服务对象的返回结果是什么),并增加了一些特定的HTTP消息头,以说明HTTP消息的内容格式。 XML解决了数据表示的问题,但它没有定义一套标准的数据类型,更没有说怎么去扩展这套数据类型。而SOAP协议是基于HTTP协议的,SOAP也是基于XML的,XML是SOAP的数据编码方式,也就是说,soap协议是被xml修饰过的http请求,相比较http协议,它有自己特定的表达形式。WSDL:服务描述文件,用xml的方式来展现其内容,他的作用是:1.描述服务器具备的方法;2.描述方法应该传递的参数;3.该方法的返回值。webservice的实现技术有很多:比如第一代的Apache Axis(不好用,被淘汰),xfire,cxf(重量级框架),JWX-WS(轻量级,适合像我这样的菜鸟练习)。当然webservice技术也有一些弊端:比如单机程序应用方面,或者xml数据量大的话,都会导致效率低;比如想采用远程接口方式调用,则要用开发工具生成一堆的工具类代码.........相较于SOAP的webservice,新兴起的RESTful Web服务更加受欢迎,他是完全基于http协议,省去了soap繁杂的封装,可利用HTTP请求方式进行HTTP方法(GET,POST,PUT,DELETE)的直接进行CRUD操作,然后返回更加简洁的json数据,而且相比soap这样重量级的协议,rest的安全控制、缓存、连接性都做得更好(因为基于http,不像soap把所有的请求资源都封装在soap信封里,让服务器摸不着头脑)。

     之后随着webservice的逐渐发展,一大核心神器:SOA诞生了。SOA(Service-Oriented Architecture)既面向服务编程,是指为了解决在inernet环境下业务集成的需要,通过连接能完成特定任务的独立功能实现的一种软件系统架构,同时也是一种思想,一种方法论。它可以让应用不受限于技术,让企业轻松应对商业服务变化和发展的需要。SOA不是webservice,WebService是实现SOA的方式之一,其他的实现手段还有CORBA、JINI和阿里的DUBBO等。捎带一提:webservice和bubbo这些框架的区别在于:Dubbo是一种分布式服务框架, Webservice也是一种服务框架,但是webservice并不是分布式的服务框架,他需要结合F5实现才能负载均衡(dubbo除了可以提供服务之外,还可以实现软负载均衡)。SOA解决多服务凌乱问题,SOA架构解决数据服务的复杂程度,同时SOA又有一个名字,叫做服务治理。关于SOA应用场景

 

初学分布式对EJB、RMI、RPC、WebService、ESB等理解

通过上面的图我们可以看出,多个子系统直接相互交互,而且每个服务系统都有对应的ip地址和端口,相互调用非常凌乱,这样我们就很不爽,所以我们就用到了我们的SOA服务治理,SOA就是帮助我们把服务之间调用的乱七八糟的关系给治理起来,然后提供一个统一的标准,把我们的服务治理成下图所示,以前我们的服务是互相交互,现在是只对数据总线进行交互,这样系统就变得统一起来。

初学分布式对EJB、RMI、RPC、WebService、ESB等理解

统一标准:各系统的协议、地址、交互方式。

新的交互方式:各个系统分别根据统一标准向数据总线进行注册,各子系统调用其他子系统时,我们并不关心如何找到其他子系统,我们只招数据总线,数据总线再根据统一标准找其他子系统,所以数据总线在这里充当一个指路人的作用。

而图中这个数据总线就是ESB组件,ESB是一个集中式的、可升级的、容错的和基于消息服务的框架:为架构在不同消息协议、开发语言上的异构服务提供透明的通讯;为企业应用、服务和组件提供互连互通的共享消息层;能够同步或异步地将消息传递到服务终端,能智能的转换和保护消息内容以满足不同服务终端的要求;应该提供错误恢复,可以传送错误消息,可测量性问题,重复消息,网络失败等等。如java访问.net发布服务,为了集成不同系统,不同协议的服务,ESB做了消息的转换解释与路由等工作,让不同的服务互联互通。 数据总线里面一个key对于一个value,key指的是服务名,value则是服务的调度方式。如图:

初学分布式对EJB、RMI、RPC、WebService、ESB等理解

 

初学分布式对EJB、RMI、RPC、WebService、ESB等理解

就用zookeeper打个比方:客户端想调用这些service1、service2、service3......但是每个service都部署在服务器,有指定的ip地址,每次调用很麻烦,zookeeper就可以充当这个数据总线,在里面对这些服务进行注册并给他们命名,然后客户端就不需要知道这些服务器的地址了,只找他们的名字剩下的交给zookeeper,就像域名一样:不需要知道百度的地址只输入baidu.com,更加简单好记。

还有一点需要说明的是,数据总线只是指路人,服务是不经过数据总线的,如上图的黄色线的路径。

数据总线通过域名解析实现:一个域名绑定多台服务器,ajax也可以,dns也可以,解析域名嘛。

其实数据总线还有一些高级应用,比如心跳检测,实现负载均衡等等,就不细说了,目前应用数据总线的有阿里的dubbo,还有上面提到的zookeeper。

以下是几个比较流行且好用的开源的esb:

  • Mule ESB:MuleSoft是Mule ESB创建者。Mule ESB是一种广泛的开源ESB下载。
  • WSO2 ESB:WSO2 ESB旨在极端轻量型和可扩展性。它包括服务交互图形编辑和XML支持。
  • Apache ServiceMix ESB:Apache Service Mix ESB以Java业务集成为标准为基础,支持Spring。

 

最后关于SOA,个人理解SOA不是关于XML,SOAP和web服务的,这些都能在SOA里面使用,但不是SOA的主体。soa只是一个可管理的架构、一种思想,某个服务用或者不用SOAP或者什么rest,其实是与SOA无关的。作为一个架构方法,即使你完全没有SOAP服务在上面,SOA依然是有效的。

 

参考:https://www.cnblogs.com/renzhitian/p/6853289.html

https://www.cnblogs.com/ygj0930/p/6542811.html
https://blog.csdn.net/lovechuanyu/article/details/40508507

上一篇:在Android应用程序中使用JAVA RMI


下一篇:13_Docker镜像命令