分布式(基础)-RMI简单的应用

简介: 分布式(基础)-RMI简单的应用

RMI的简单的应用

远程通信:不同的jvm之间进行通信,不同的虚拟机就是跨服务的通信。

RMI:jdk自带的远程通信的一个接口,java本身提供的远程通信框架,称不上rpc。RMI是依赖于jvm,不依赖于apache。

常见的rpc框架有:Dubbo,Thrift,WebService(WSDL)=>http+XML:而现在都替换成http+json的方式来进行通信了。

写一个RMI的实例:底层就是用的Socket来进行通信的,但是它不支持跨语言,基于JRMP协议的,rmi的性能很高的。

RMI是WebService的根基。

1、新建两个java工程,一个代表客户端,一个代表服务端:

2、在server端提供一个UserDao的接口,代码如下:

  1. package dao;

  2. import java.rmi.RemoteException;

  3. /**
  4. * 接口里的方法必须抛RemoteException的异常
  5. */
  6. public interface UserDao extends java.rmi.Remote {
  7.     String addUser(String name) throws RemoteException;
  8. }

2.1、UserDao的实现类如下:

  1. package dao;

  2. import java.rmi.RemoteException;
  3. import java.rmi.server.UnicastRemoteObject;

  4. //UnicastRemoteObject这个类用于RemoteImpl这个类发布出去做一个序列化的处理,继承这个类的话,会在主类的时候会开启一个线程
  5. public class UserDaoImpl extends UnicastRemoteObject implements UserDao {
  6.    public UserDaoImpl() throws RemoteException {
  7.    }

  8.    @Override
  9.    public String addUser(String name) throws RemoteException {
  10.        return "添加的用户名称为"+name;
  11.    }
  12. }

2.2、server端的主类的代码如下:绑定的是接口,然后会生成一个代理,通过这个代理,然后和客户端的代理进行通信的去实现网络通信的操作。

  1. package rmi;

  2. import dao.UserDao;
  3. import dao.UserDaoImpl;

  4. import java.net.MalformedURLException;
  5. import java.rmi.AlreadyBoundException;
  6. import java.rmi.Naming;
  7. import java.rmi.RemoteException;
  8. import java.rmi.registry.LocateRegistry;

  9. public class RmiServer {
  10.    public static void main(String[] args) throws InterruptedException, RemoteException {
  11.        //创建接口引用的实例
  12.        UserDao remote=new UserDaoImpl();
  13.        try {
  14.            //注册要被客户端监听的端口
  15.            LocateRegistry.createRegistry(8888);
  16.            try {
  17.                //rmi:是固定的写法
  18.                Naming.bind("rmi://localhost:8888/user",remote);
  19.                System.out.println("server starting...........");
  20.            } catch (AlreadyBoundException e) {
  21.                e.printStackTrace();
  22.            } catch (MalformedURLException e) {
  23.                e.printStackTrace();
  24.            }
  25.        } catch (RemoteException e) {
  26.            e.printStackTrace();
  27.        }
  28.    }
  29. }

启动server端:

3、客户端的接口的代码和server端的接口是一样,因为需要把接口给暴漏出去,代码如下:

  1. package dao;

  2. import java.rmi.RemoteException;

  3. /**
  4. * 接口里的方法必须抛RemoteException的异常
  5. */
  6. public interface UserDao extends java.rmi.Remote {
  7.     String addUser(String name) throws RemoteException;
  8. }

3.1、客户端的主类的代码如下Naming是命,lookup寻找地址是否存在。

  1. package rmi.client;
  2. import dao.UserDao;
  3. import java.net.MalformedURLException;
  4. import java.rmi.Naming;
  5. import java.rmi.NotBoundException;
  6. import java.rmi.RemoteException;
  7. public class RmiClient {
  8.    public static void main(String[] args) {
  9.        try {
  10.            UserDao userDao = (UserDao)Naming.lookup("rmi://localhost:8888/user");
  11.            System.out.println(userDao.addUser("weizhaoyang"));
  12.        } catch (NotBoundException e) {
  13.            e.printStackTrace();
  14.        } catch (MalformedURLException e) {
  15.            e.printStackTrace();
  16.        } catch (RemoteException e) {
  17.            e.printStackTrace();
  18.        }
  19.    }
  20. }

启动客户端:

注意:如下,服务端的接口和客户端的接口的路径必须一样,否则也会报错。

因为需要 代理是实现类应该是一样的。

未完待续!!如果哪里写的有问题,请指出。xxxxxxxxxxxxxxxxxxx谢谢。

相关文章
|
12小时前
|
网络协议 安全 Java
分布式(基础)-RMI的原理
分布式(基础)-RMI的原理
|
1月前
|
存储 Linux 应用服务中间件
Docker——底层实现原理及关键技术
Docker——底层实现原理及关键技术
77 0
|
4月前
|
存储 Java Docker
深入浅出:使用Docker容器化改进Java微服务架构
在快速演进的软件开发领域,微服务架构已成为构建可扩展、灵活且独立部署的应用程序的首选模式。然而,随着服务数量的增加,管理与部署这些服务的复杂性也随之上升。本文将探讨如何利用Docker容器技术,简化并优化Java微服务架构的开发、部署和运维流程。通过具体实例,我们将展示容器化如何为微服务架构带来的高效性、一致性和可伸缩性,从而使开发团队能够更加专注于业务逻辑的实现,而非环境的搭建与维护。
71 1
|
Dubbo Java 应用服务中间件
带你读《Apache Dubbo微服务开发从入门到精通》——二、 部署到Docker(1)
带你读《Apache Dubbo微服务开发从入门到精通》——二、 部署到Docker(1)
98 3
|
Dubbo 应用服务中间件 Apache
带你读《Apache Dubbo微服务开发从入门到精通》——二、 部署到Docker(4)
带你读《Apache Dubbo微服务开发从入门到精通》——二、 部署到Docker(4)
74 2
|
存储 Cloud Native Linux
【云原生】Docker 架构及工作原理
【云原生】Docker 架构及工作原理
141 0
|
Cloud Native Unix Linux
【云原生】Docker 网络模式详解、容器间网络通信1
【云原生】Docker 网络模式详解、容器间网络通信
312 0
|
网络协议 Cloud Native Docker
【云原生】Docker 网络模式详解、容器间网络通信2
【云原生】Docker 网络模式详解、容器间网络通信2
254 0
|
算法 开发工具 Docker
搭建ZooKeeper3.7.0集群(传统方式&Docker方式)
搭建ZooKeeper3.7.0集群(传统方式&Docker方式)
420 0
搭建ZooKeeper3.7.0集群(传统方式&Docker方式)
|
安全 Ubuntu 数据管理
Docker 数据管理与网络通信
Docker 镜像除了是 Docker 的核心技术之外也是应用发布的标准格式。一个完整的 Docker 镜像可以支撑一个 Docker 容器的运行。
251 0
Docker 数据管理与网络通信

相关实验场景

更多