Apache Dubbo是一款高性能的java RPC框架,是阿里巴巴公司开源的一个高性能,轻量级的开源RPC框架,可以和Spring进行无缝集成对接。
Dubbo提供了三大核心能力
- 面向接口的远程方法调用
- 智能容错和负载均衡
- 服务的自动注册和发现
什么是RPC
RPC全称为remote procedure call,即远程过程调用
例,有两台服务其A和B,上面分别部署着一个应用,A服务器想要调用B服务器的方法,由于两个服务器不在一个内存空间,不能直接调用,所以需要通过网络来表达调用的语义和传达调用的数据。
RPC并不是一种技术,而是指整个网络远程调用的过程
在面对对象的编程语言中,以远程过程调用即是远程方法调用
java中RPC框架比较多,常见的有RIM,Hessian,gRPC(谷歌),bRPC(百度),Dubbo等,对于RPC框架,其核心就是通讯和序列化
常见RPC框架
RIM
RIM(remote method invocation)是java原生的远程调用,RIM采用JRMP(Java RemoteMessageing Protocol)作为通信协议,可以认为是纯java版本的分布式远程调用解决方案
RMI核心概念
RMI执行步骤
- 创建远程接口,并且继承java,rmi.Remote接口
- 实现远程接口,并且继承UnicastRemoteObject
- 创建服务程序,createRegistry()方法注册远程对象
- 创建客户端程序(获取注册信息,调用接口方法)
代码实现
服务端:
import java.rmi.Remote;
import java.rmi.RemoteException;
/*
* 创建远程接口,并且继承java,rmi.Remote接口
* */
public interface UserServer extends Remote {
public String sayHellow(String name) throws RemoteException;
}
------------------------------分割线------------------------------------------
import com.lf.server.UserServer;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
/*
* 实现远程接口,并且继承UnicastRemoteObject
* */
public class UserServerImpl extends UnicastRemoteObject implements UserServer {
//必须重写无参构造,为了抛出RemoteException异常
public UserServerImpl() throws RemoteException {
}
public String sayHellow(String name) throws RemoteException {
return "name:"+name+"成功调用了服务端服务";
}
}
-----------------------------------分割线-----------------------------------------
import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
/*
* 创建服务程序,createRegistry()方法注册远程对象
* */
public class ServerMain {
public static void main(String [] args) throws RemoteException, AlreadyBoundException, MalformedURLException {
//启动RMI注册服务,指定端口号
LocateRegistry.createRegistry(8888);
//创建要被访问的远程对象的实例
UserServer userServer=new UserServerImpl();
//把远程对象实例注册到RMI注册服务器上
Naming.bind("rmi://localhost:8888/UserServer",userServer);
System.out.println("服务端启动中..............");
}
}
启动
客户端
import java.net.MalformedURLException;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import static java.rmi.Naming.*;
/**
* 创建客户端程序(获取注册信息,调用接口方法)
*/
public class clientMain {
public static void main(String []args) throws RemoteException, NotBoundException, MalformedURLException {
//要调用的远端对象
//注意客户端创建的userserver对象的包必须和服务端包路径相同
UserServer userServer= (UserServer) lookup("rmi://localhost:8888/UserServer");
String name=userServer.sayHellow("客户端");
System.out.println(name);
}
}
--------------------------------分割线--------------------------------------------------
import java.rmi.Remote;
import java.rmi.RemoteException;
/**
* 注意客户端创建的userserver对象的包必须和服务端包路径相同
*/
public interface UserServer extends Remote {
public String sayHellow(String name) throws RemoteException;
}
测试结果:
Hessian
Hessian使用C/S模式,基于HTTP协议传输,使用Hessian二进制系列化
-------------------代码看资源:https://download.csdn.net/download/xiaoxiaobai250/12034767-------------------
- Thrift:FaceBook开源RPC框架,典型的CS架构,支持跨语言,客户端和服务端可以使用不同的语言开发,thrift通过IDL(Interface Description Language)来关联客户端和服务端。
- gRPC google
- dubbo