Dubbo的介绍
Apache Dubbo是一款高性能的Java RPC框架。其前身是阿里巴巴公司开源的一个高性能、轻量级的开源Java RPC框架,可以和Spring框架无缝集成。
Dubbo提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
官网:http://dubbo.apache.org/
什么是RPC?
RPC全称为remote procedure call,即远程过程调用。比如两台服务器A和B,A服务器上部署一个应用,B服务器上部署一个应用,A服务器上的应用想调用B服务器上的应用提供的方法,由于两个应用不在一个内存空间,不能直接调用,所以需要通过网络来表达调用的语义和传达调用的数据。
需要注意的是RPC并不是一个具体的技术,而是指整个网络远程调用过程。
而不需要了解底层网络技术的协议,在面向对象的编程语言中,远程过程调用即是 远程方法调用
RPC调用过程
java中RPC框架比较多,常见的有RMI、Hessian、gRPC、bRPC、Dubbo等,其实对于RPC框架而言,核心模块就是通讯和序列化接下来我们就分别看一下常见的RPC框架
RMI
1)RMI(remote method invocation)是java原生支持的远程调用,RMI采用JRMP(Java RemoteMessageing Protocol)作为通信协议,可以认为是纯java版本的分布式远程调用解决方案。
2)RMI的核心概念
3)RMI步骤
- 创建远程接口, 并且继承java.rmi.Remote接口
- 实现远程接口,并且继承:UnicastRemoteObject
- 创建服务器程序: createRegistry()方法注册远程对象
- 创建客户端程序 (获取注册信息,调用接口方法)
服务器:
1.创建服务接口
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface UserService extends Remote {
String sayHello(String name) throws RemoteException;
}
2.提供接口的实现类
import Jackie.service.UserService;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class UserServiceImpl extends UnicastRemoteObject implements UserService
{
public UserServiceImpl() throws RemoteException {
}
@Override
public String sayHello(String name) throws RemoteException{
return "成功调用了服务端的服务"+name;
}
}
3.将本地服务暴露出去,供外部调用
import Jackie.service.UserService;
import Jackie.service.impl.UserServiceImpl;
import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
public class ServerMain {
public static void main(String[] args) {
try {
//1.启动RMI注册服务,指定端口号
LocateRegistry.createRegistry(5184);
//2.创建要被访问的远程对象的实例
UserService userService = new UserServiceImpl();
3.暴露服务,把远程对象实例注册到RMI注册服务器上
Naming.bind("rmi://localhost:5184/UserService", userService);
System.out.println("服务器启动中。。。。");
} catch (RemoteException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (AlreadyBoundException e) {
e.printStackTrace();
}
}
}
客户端:
创建服务接口
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface UserService extends Remote {
String sayHello(String name) throws RemoteException;
}
客户端远程调用服务,客户端需要依赖服务接口
import Jackie.service.UserService;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
public class ClientMain {
public static void main(String[] args) {
UserService userService = null;
try {
userService = (UserService) Naming.lookup("rmi://localhost:5184/UserService");
//userService代理对象
System.out.println(userService);
System.out.println(userService.sayHello("客户端"));
} catch (NotBoundException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
Hessian
Hessian使用C/S方式,基于HTTP协议传输,使用Hessian二进制序列化。
server端:
1.添加hessian的maven依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>Dubbo</artifactId>
<groupId>Jackie.demo</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>war</packaging>
<artifactId>Hessian_Server</artifactId>
<dependencies>
<dependency>
<groupId>com.caucho</groupId>
<artifactId>hessian</artifactId>
<version>4.0.7</version>
</dependency>
</dependencies>
2.创建跟server端相同的接口UserService
public interface UserService {
String sayHello(String name);
}
3.实现类
import Jackie.service.UserService;
public class UserServiceImpl implements UserService {
@Override
public String sayHello(String name) {
return "调用了hessian服务端的服务" + name;
}
}
4.web.xml中配置HessianServlet
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"