远程过程调用RPC RMI(Remote Method Invocation)和Web Service
2019独角兽企业重金招聘Python工程师标准>>>
一、RPC是什么
RPC的全称是Remote Procedure call,是进程间通信方式。
他允许程序调用另一个地址空间的过程或者函数,不用去关注此过程或函数的实现细节。比如两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数或者方法,由于不在一个内存空间,不能直接调用,这时候需要通过就可以应用RPC框架的实现来解决。
二、RPC的实现
RPC有很多开源的框架实现这里主要介绍java自带的RMI
1、RMI是什么
RMI全称是Remote Method Invocation-远程方法调用,Java RMI在JDK1.1中实现的,其威力就体现在它强大的开发分布式网络应用的能力上,是纯Java的网络分布式应用系统的核心解决方案之一。其实它可以被看作是RPC的Java版本。要求客户端和服务端都要用java实现
2、RMI简单实例
(1)服务端代码实现:
IHello类实现:
import java.rmi.Remote;
import java.rmi.RemoteException;public interface IHello extends Remote{/** * 简单的返回“Hello World!"字样 * @return 返回“Hello World!"字样 * @throws java.rmi.RemoteException */ public String helloWorld() throws RemoteException; /** * 一个简单的业务方法,根据传入的人名返回相应的问候语 * @param someBodyName 人名 * @return 返回相应的问候语 * @throws java.rmi.RemoteException */ public String sayHelloToSomeBody(String someBodyName) throws RemoteException;
}
HelloImpl实现IHello实现:
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;public class HelloImpl extends UnicastRemoteObject implements IHello{protected HelloImpl() throws RemoteException {super();}@Overridepublic String helloWorld() throws RemoteException {return "Hello Word";}@Overridepublic String sayHelloToSomeBody(String someBodyName) throws RemoteException {return "你好," + someBodyName + "!";}}
HelloServer:
import java.net.MalformedURLException;
import java.nio.channels.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;/**
* Created by IntelliJ IDEA.
* Date: 2008-8-7 22:03:35
* 创建RMI注册表,启动RMI服务,并将远程对象注册到RMI注册表中。
*/
public class HelloServer { public static void main(String args[]) throws java.rmi.AlreadyBoundException { try { //创建一个远程对象 IHello rhello = new HelloImpl(); //本地主机上的远程对象注册表Registry的实例,并指定端口为8888,这一步必不可少(Java默认端口是1099),必不可缺的一步,缺少注册表创建,则无法绑定对象到远程注册表上 LocateRegistry.createRegistry(8888); //把远程对象注册到RMI注册服务器上,并命名为RHello //绑定的URL标准格式为:rmi://host:port/name(其中协议名可以省略,下面两种写法都是正确的) Naming.bind("rmi://localhost:8888/RHello",rhello);
// Naming.bind("//localhost:8888/RHello",rhello); System.out.println(">>>>>INFO:远程IHello对象绑定成功!"); } catch (RemoteException e) { System.out.println("创建远程对象发生异常!"); e.printStackTrace(); } catch (AlreadyBoundException e) { System.out.println("发生重复绑定对象异常!"); e.printStackTrace(); } catch (MalformedURLException e) { System.out.println("发生URL畸形异常!"); e.printStackTrace(); } }
}
(2)客户端代码实现:
新建客户端工程GiveMeWords,客户端需要将服务端的IHello接口拷贝过来,并且必须和服务器端包名相同。否则会报如下错误(本人亲测):
java.lang.ClassNotFoundException: test.rmi.IHello (no security manager: RMI class loader)
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;public class HelloClient {public static void main(String args[]){ try { //在RMI服务注册表中查找名称为RHello的对象,并调用其上的方法 IHello rhello =(IHello) Naming.lookup("rmi://localhost:8888/RHello"); System.out.println(rhello.helloWorld()); System.out.println(rhello.sayHelloToSomeBody("熔岩")); } catch (NotBoundException e) { e.printStackTrace(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (RemoteException e) { e.printStackTrace(); } }
}
服务端工程结构截图
客户端工程结构截图
先运行服务器端代码,在运行客户端代码。运行结果:
三、Web Service
1、WebService是一种跨编程语言和跨操作系统平台的远程调用技术。
XML+XSD,SOAP和WSDL就是构成WebService平台的三大技术。Web Service采用http协议传输,数据格式为特定格式的XML。
SOAP协议=HTTP协议+XML协议
WSDL(Web Service Description Language)基于XML语音的,用于描述Web Service及其函数、参数和返回值。它是WebService客户端和服务器端都能理解的标准格式。WSDL文件保存在Web服务器上,通过一个url地址就可以访问到它。客户端要调用一个WebService服务之前,要知道该服务的WSDL文件的地址。WebService服务提供商可以通过两种方式来暴露它的WSDL文件地址:1.注册到UDDI服务器,以便被人查找;2.直接告诉给客户端调用者。也就是说我们要进行Web Service开发,通过服务器端的WSDL文件,我们就可以编写客户端调用代码。
服务端代码:
import javax.jws.WebService;
import javax.xml.ws.Endpoint;@WebService
public class Function {public String transWords(String words){String res = "";for(char ch : words.toCharArray()){res += "\t" + ch + "\t";}return res;}public static void main(String[] args){Endpoint.publish("http://localhost:9001/Service/Function", new Function());System.out.println("publish success");}
}
运行成功后访问http://localhost:9001/Service/Function?wsdl。wsdl文件如下:
<!--Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2.4-b01.
-->
<!--Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2.4-b01.
-->
<definitions xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://webService.test/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://webService.test/" name="FunctionService">
<types>
<xsd:schema>
<xsd:import namespace="http://webService.test/" schemaLocation="http://localhost:9001/Service/Function?xsd=1"/>
</xsd:schema>
</types>
<message name="transWords">
<part name="parameters" element="tns:transWords"/>
</message>
<message name="transWordsResponse">
<part name="parameters" element="tns:transWordsResponse"/>
</message>
<portType name="Function">
<operation name="transWords">
<input wsam:Action="http://webService.test/Function/transWordsRequest" message="tns:transWords"/>
<output wsam:Action="http://webService.test/Function/transWordsResponse" message="tns:transWordsResponse"/>
</operation>
</portType>
<binding name="FunctionPortBinding" type="tns:Function">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
<operation name="transWords">
<soap:operation soapAction=""/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
<service name="FunctionService">
<port name="FunctionPort" binding="tns:FunctionPortBinding">
<soap:address location="http://localhost:9001/Service/Function"/>
</port>
</service>
</definitions>
WSDL 文档在Web服务的定义中使用下列元素:
- Types - 数据类型定义的容器,它使用某种类型系统(一般地使用XML Schema中的类型系统)。
- Message - 通信消息的数据结构的抽象类型化定义。使用Types所定义的类型来定义整个消息的数据结构。
- Operation - 对服务中所支持的操作的抽象描述,一般单个Operation描述了一个访问入口的请求/响应消息对。
- PortType - 对于某个访问入口点类型所支持的操作的抽象集合,这些操作可以由一个或多个服务访问点来支持。
- Binding - 特定端口类型的具体协议和数据格式规范的绑定。
- Port - 定义为协议/数据格式绑定与具体Web访问地址组合的单个服务访问点。
- Service- 相关服务访问点的集合。
然后在客户端项目下运行如下命令 wsimport -s Documents/workspace/GiveMeWords/src -p com.shu.service -keep http://localhost:9001/Service/Function?wsdl 即可自动生成客户端代码
Documents/workspace/GiveMeWords/src代码位置
com.shu.service包名
测试代码:
public class Test {/*** 测试webservice此作为客户端* test项目中的webService包下面的Function作为服务端*wsimport -s Documents/workspace/GiveMeWords/src -p com.shu.service -keep http://localhost:9001/Service/Function?wsdl* @param args*/public static void main(String[] args){Function fu = new FunctionService().getFunctionPort();String str = fu.transWords("get my words");System.out.println(str);}
}
运行即可调用服务端的远程方法transWords()方法。但是客户端怎么知道服务端暴露出来的服务就是transWords呢,还有参数返回值这些客户端是怎么知道的?我们回到上面的WSDL文件:
<portType name="Function">
<operation name="transWords">
<input wsam:Action="http://webService.test/Function/transWordsRequest" message="tns:transWords"/>
<output wsam:Action="http://webService.test/Function/transWordsResponse" message="tns:transWordsResponse"/>
</operation>
</portType>
operation表情表明方法暴露服务的方法名是transWords。<input>标签标示输入参数,<output>函数返回值。这样我们就得到了我们想要的接口了。总之通过WSDL文件我们就可以进行编程。
转载于:https://my.oschina.net/u/579493/blog/897359
远程过程调用RPC RMI(Remote Method Invocation)和Web Service相关推荐
- RabbitMQ教程远程过程调用RPC
前言:在前面的教程里我们学习了工作队列,实现了将工作任务发给不同的工人,如果任务是需要在另一台计算机上运行,我们如何实现运行远程计算机上的一个函数任务并等待其返回的结果呢,这种模式通常被称为远程过程调 ...
- 远程过程调用RPC 2:RPC思想与RPC框架
RPC思想与RPC框架 RPC思想 组成部分 RPC框架 完整的RPC框架 RPC调用关键点 RPC框架分类对比 RPC和REST REST主要原则 对比 RPC思想 上一篇笔记:远程过程调用RPC ...
- 远程过程调用RPC简介
RPC(Remote Procedure Call, 远程过程调用):是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的思想. RPC是一种技术思想而非一种规范或协议,常见RPC技术 ...
- rpc 服务器不可用_什么是远程过程调用RPC
背景: 最近在开发中接触到微服务的一些概念,并且为其他业务组通过URL请求的方式提供了我们本地接口. 其中涉及到了,注册方法,发送和接收脚本,确定调用的URL,鉴权数据.从而引出今天要讲内容RPC ...
- 《Go 开源说 2022》预告「微服务可用性」系列之第六期:远程过程调用RPC——gRPC...
点击蓝字 关注我们 写在前面 Go开源说是GoCN推出的一档分享Go开源好项目的直播栏目,2022年联合腾源会社区全面升级,通过全新的栏目设置,希望能够帮助到开源作者们实现以下目标: 第一是去推广他们 ...
- RPC(Remote Procedure Calls)远程过程调用
很长时间以来都没有怎么好好搞清楚RPC(即Remote Procedure Call,远程过程调用)和HTTP调用的区别,不都是写一个服务然后在客户端调用么?这里请允许我迷之一笑~Naive!本文简单 ...
- zkcli远程连接_高级框架第一天RPC:远程过程调用
RPC:远程过程调用 主要内容 1.项目结构变化 2.RPC简介 3.RMI实现RPC 4.HttpClient实现RPC 5.Zookeeper安装 6.Zookeeper客户端常用命令 7.向Zo ...
- RPC(Remote Procedure Call)远程过程调用
所谓的RPC(remote procedure call 远程过程调用)框架实际是提供了一套机制, 使得应用之间可以进行通讯,而且也遵从server/client模型. 使用的时候客户端调用serve ...
- 从核心概念和技术层面着眼,系统化认识RPC 2017-09-26 张旭 InfoQ 作者|张旭 编辑|田光 RPC(Remote Procedure Call),即远程过程调用,是一个分布式系统间
从核心概念和技术层面着眼,系统化认识RPC 转自:https://mp.weixin.qq.com/s/6AX2-zjvcpesSe93HihVoA 2017-09-26 张旭 InfoQ 作者| ...
最新文章
- 写的函数符号表里没有_你有没有想过,C语言 main 函数到底为啥这么写?
- R假设检验之Grubbs异常检测(Grubbs’ Test)
- 四种类型的数据分析模式
- Exchange 2010和Exchange 2016共存部署-10:配置多域名证书
- 图灵奖得主LeCun亲授,深度学习课程在线发布|资源
- 正則表達式基本元字符集及其含义(上)
- java中类加载机制、类加载过程和类加载器层次
- Python自动化运维工具-Fabric部署及使用总结
- [转自 Flyingis]Geometry 对象浅析
- 陈平原教授谈博士论文写作经验:讲得太好了!
- JAVA分析命令:jps、jstack、jmap、jhat
- Spring Boot 解决方案 - 会话
- 混沌数学之CircuitChaotic(二维离散电路混沌系统)
- 职称计算机 将计算机broad_1下的e盘映射为k盘网络驱动器,计算机职称考试题目(网络基础答案)...
- python 常用模块列表
- 深度学习-感受野与有效感受野
- 解决百度网盘下载慢限速问题(2019亲测可用)下载速度不要太爽了
- java红牛农场,在新加坡的,完一朋友一个夜班喝5瓶红牛。 下班坐地
- 【T+】畅捷通T+软件,修改固定资产模块中已经使用卡片的资产编码。
- Django模型中的关系:一对一、一对多与多对多
热门文章
- 抓取AJAX网页的方法-Firefox组件,C#集成
- 第六计 / Explosive City (2004)
- HTML DOM文档对象查找元素的方法
- 给自己的网址加上https,添加ssl证书(springboot项目)
- 升级Python2.7后 no module name yum
- java遍历树_Java实现遍历N级树形目录结构
- 人工蜂群算法python_教程 | 用人工蜂群算法求解k-分区聚类问题
- java8 循环jsonarray_JSONArray 遍历方式
- 来电语音播报软件下载apk_消息语音播报app下载-消息语音播报安卓版 v1.0.1 - 安下载...
- java变量数据类型_java变量与数据类型