初学分布式对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应用场景

 

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

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

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

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

 

就用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

原文地址:https://blog.csdn.net/weixin_39209728/article/details/111415097

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


1.使用ajax调用varxhr;functioninvoke(){if(window.ActiveXObject){xhr=newActiveXObject("Microsoft.XMLHTTP");}else{xhr=newXMLHttpRequest();}//指定请求地址varurl="http://127.0.0.1:7777/hello?wsdl";//
               好不容易把WebService服务器端搭建起来,我们还需要客户端程序也同样跑起来才能够进行和服务器端程序的通信: 在这篇文章里面,我会先自己写代码去实现调用WebService服务器端程序,接下来,通过IDEA配置的方式来调用WebService服务端: 首先,我写了一个W
1新建一个工程项目用来做服务端增加一个MyService1类文件packagecom.zns.ws;importjavax.jws.WebMethod;importjavax.jws.WebService;importjavax.xml.ws.Endpoint;@WebServicepublicclassMyService1{publicstaticvoidmain(String[]args){
packagecom.transsion.util;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.PrintWriter;importjava.net.URL;importjava.net.URLConnection;importcom.alibaba.druid.util.Base64;importcom.tra
再生产wsdl文件时重写描述文件1usingSystem;2usingSystem.Collections.Generic;3usingSystem.Linq;4usingSystem.Web;5usingSystem.Web.Services.Description;67namespaceStrongSoftManage.Web.App8{9publicclassSoapExtens:SoapExtensi
一般情况下,使用eclipse自带的jax-ws生成webservice会自动生成2个类:ContractConnector.java packagecom.wonders.webservice.contract;importjava.text.DecimalFormat;importjava.text.ParseException;importjava.text.SimpleDateFormat;importjava.util.Date;i
一、WebService概述1.1什么是WebService 基于Web的服务:服务器端整出一些资源让客户端应用访问(获取数据) 一个跨语言、跨平台的规范(抽象)所谓跨编程语言和跨操作平台,就是说服务端程序采用java编写,客户端程序则可以采用其他编程语言编写,反之亦然!跨操作系统平台则是指服务
一、什么是CXF?    ApacheCXF=Celtix+Xfire,开始叫ApacheCeltiXfire,后来更名为ApacheCXF了,以下简称为CXF。ApacheCXF是一个开源的webServices框架,CXF帮助您构建和开发webServices,它支持多种协议,比如:SOAP1.1,1,2 XML/HTTP、RESTful或者CORBA。  
工具IDEA一、构建项目1、选择SpringInitializr2、填写项目信息3、勾选webService4、勾选Thymeleaf5、项目建立完成,启动类自动生成二、写个Controller启动服务。浏览器访问/hello接口。 
1.环境win764位,vs20102.新建一个asp.netweb应用程序(同上一篇)3.添加一个web引用,引用上一篇创建的服务。注意不是服务引用。如下图 
WebService之WSDL文件讲解   恩,我想说的是,是不是经常有人在开发的时候,特别是和第三方有接口的时候,走的是SOAP协议,然后用户给你一个WSDL文件,说按照上面的进行适配,嘿嘿,这个时候,要是你以前没有开发过,肯定会傻眼,那如果你想学习的话,就认真的看下面的讲解咯:一、WSDL概述  
在websrvice发布文件的webconfig中加入<httpRuntimemaxRequestLength="102400"/> <webServices>     <protocols>       <addname="HttpPost"/>       <addname="HttpGet"/>     </protocols>   
 代码比较简单,按照如下来操作即可,只是jar包有很多问题,比如找不到classnotFondspring、以及找不到xfile.xml、以及xfile.xml中的一个参数问题,以及2.0 spring。jar和spring1.6.2冲突问题,总之这个小demo报了一堆错误,其实都是jar的问题,为了让大家减少这方面的错误,所以我提供
 一、soapUI简介SOAP:   WebService通过Http协议发送请求和接收结果时,发送的请求内容和结果内容都采用XML格式封装,并增加了一些特定的HTTP消息头,以说明HTTP消息头的内容格式,这些特定的HTTP消息头和XML内容格式就是SOAP协议。SOAP提供了标准的RPC方法来调用WebService。 
参考,感谢https://blog.csdn.net/hj7jay/article/details/727224381.环境:win764位,jdk1.8.0_201 EclipseJavaEEIDEforWebDevelopers.Version:Mars.1Release(4.5.1)2.创建一个普通的java项目,名字是TheService在src目录下创建一个com.hyan.service包,在此包下创建
CXF实现RestfulWebService基础示例一、写在前面IDE:IDEA14JDK:1.7CXF:2.6.2示例来源:%CXF_HOME%\samples\jax_rs\basic发布方式:JAXRSServerFactoryBean的create()方法调用方式:URL的openStream()方法、HttpClient的executeMethod()方法二、服务端(Java项目)1.准备Jar包
封装helper类:classWebServiceHelper{///<summary>///1.get请求http方法///</summary>///<paramname="url">基础url</param>///<paramname="method">请求方法</param>///<paramnam
.net客户端调用java或.netwebservice进行soapheader验证最近项目中有业务需要跨平台调用web服务,客户端和服务器之间采用非对称加密来保证数据的安全性,webservice的安全验证基于soapheader。借此机会,顺便整理一下调用.netwebservice和javawebservice的验证方式,记录下来。
Node.jshttps://www.cnblogs.com/goldlong/p/8027997.htmlQQ音乐apihttps://juejin.im/post/5a35228e51882506a463b172#heading-11?tdsourcetag=s_pcqq_aiomsgGit把本地仓库上传到GitHbubhttps://blog.csdn.net/zamamiro/article/details/70172900git删除本地仓库https://blog.cs
转载自:孤傲苍狼 WebService学习总结(三)——使用JDK开发WebService一、WebService的开发手段使用Java开发WebService时可以使用以下两种开发手段1、 使用JDK开发(1.6及以上版本)-->详见:本文2、使用CXF框架开发-->详见:其他文章二、使用JDK开发WebServi