1、RPC和HTTP对比
1.1 具体实现
RPC:可以基于TCP协议,也可以基于HTTP协议。
HTTP:基于HTTP协议
1.2 效率
RPC:自定义具体实现可以减少很多无用的报文内容,使得报文体积更小。
HTTP:如果是HTTP 1.1 报文中很多内容都是无用的。如果是HTTP2.0以后和RPC相差不大,比RPC少的可能就是一些服务治理等功能。
1.3 连接方式
RPC:长连接支持。
HTTP:每次连接都是3次握手。(断开链接为4次挥手)
1.4 性能
RPC可以基于很多序列化方式。如:thrift
HTTP 主要是通过JSON,序列化和反序列效率更低。
1.5 注册中心
RPC :一般RPC框架都带有注册中心。
HTTP:都是直连。
1.6 负载均衡
RPC:绝大多数RPC框架都带有负载均衡测量。
HTTP:一般都需要借助第三方工具。如:nginx
1.7 综合结论
RPC框架一般都带有丰富的服务治理等功能,更适合企业内部接口调用。而HTTP更适合多平台之间相互调用。
2、HttpClient实现RPC
2.1、Ajax发送json参数写法
var json = '[{"id":123,"name":"bjsxt"},{"id":123,"name":"bjsxt"}]';
$.ajax({url:'/demo5',type:'post',success:function(data){alert(data);for(var i = 0 ;i<data.length;i++){alert(data[i].id +" "+data[i].name);}},contentType:'application/json',//请求体中内容类型dataType:'json',//响应内容类型。data:json});
2.2、跨域
跨域:协议、ip、端口中只要有一个不同就是跨域请求。
同源策略:浏览器默认只允许ajax访问同源(协议、ip、端口都相同)内容。
解决同源策略:
在控制器接口上添加@CrossOrigin。表示允许跨域。本质在响应头中添加Access-Control-Allow-Origin: *
@RequestMapping("/demo5")
@ResponseBody
@CrossOrigin
public List<People> demo5(@RequestBody List<People> list) {System.out.println(list);return list;
}
3、RMI实现RPC
1 RMI简介
RMI(Remote Method Invocation) 远程方法调用。
RMI是从JDK1.2推出的功能,它可以实现在一个Java应用中可以像调用本地方法一样调用另一个服务器中Java应用(JVM)中的内容。
RMI 是Java语言的远程调用,无法实现跨语言。
2 执行流程
Registry(注册表)是放置所有服务器对象的命名空间。 每次服务端创建一个对象时,它都会使用bind()或rebind()方法注册该对象。 这些是使用称为绑定名称的唯一名称注册的。
要调用远程对象,客户端需要该对象的引用。即通过服务端绑定的名称从注册表中获取对象(lookup()方法)。
3 API介绍
3.1 Remote
java.rmi.Remote 定义了此接口为远程调用接口。如果接口被外部调用,需要继承此接口。
3.2 RemoteException
java.rmi.RemoteException
继承了Remote接口的接口中,如果方法是允许被远程调用的,需要抛出此异常。
3.3 UnicastRemoteObject
java.rmi.server.UnicastRemoteObject
此类实现了Remote接口和Serializable接口。
自定义接口实现类除了实现自定义接口还需要继承此类。
3.4 LocateRegistry
java.rmi.registry.LocateRegistry
可以通过LocateRegistry在本机上创建Registry,通过特定的端口就可以访问这个Registry。
3.5 Naming
java.rmi.Naming
Naming定义了发布内容可访问RMI名称。也是通过Naming获取到指定的远程方法。