分布式(基础)-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谢谢。

相关文章
|
5月前
|
安全 JavaScript 前端开发
HarmonyOS NEXT~HarmonyOS 语言仓颉:下一代分布式开发语言的技术解析与应用实践
HarmonyOS语言仓颉是华为专为HarmonyOS生态系统设计的新型编程语言,旨在解决分布式环境下的开发挑战。它以“编码创造”为理念,具备分布式原生、高性能与高效率、安全可靠三大核心特性。仓颉语言通过内置分布式能力简化跨设备开发,提供统一的编程模型和开发体验。文章从语言基础、关键特性、开发实践及未来展望四个方面剖析其技术优势,助力开发者掌握这一新兴工具,构建全场景分布式应用。
536 35
|
4月前
|
分布式计算 Java 大数据
Java 大视界 —— 基于 Java 的大数据分布式计算在气象数据处理与天气预报中的应用进展(176)
本文围绕基于 Java 的大数据分布式计算在气象数据处理与天气预报中的应用展开,剖析行业现状与挑战,阐释技术原理,介绍其在数据处理及天气预报中的具体应用,并结合实际案例展示实施效果。
Java 大视界 -- 基于 Java 的大数据分布式存储在视频监控数据管理中的应用优化(170)
本文围绕基于 Java 的大数据分布式存储在视频监控数据管理中的应用展开,分析管理现状与挑战,阐述技术应用,结合案例和代码给出实操方案。
|
8月前
|
机器学习/深度学习 存储
DeepSeek进阶开发与应用4:DeepSeek中的分布式训练技术
随着深度学习模型和数据集规模的扩大,单机训练已无法满足需求,分布式训练技术应运而生。DeepSeek框架支持数据并行和模型并行两种模式,通过将计算任务分配到多个节点上并行执行,显著提高训练效率。本文介绍DeepSeek中的分布式训练技术,包括配置与启动方法,帮助用户轻松实现大规模模型训练。数据并行通过`MirroredStrategy`同步梯度,适用于大多数模型;模型并行则通过`ParameterServerStrategy`异步处理大模型。DeepSeek简化了分布式环境配置,支持单机多卡和多机多卡等场景。
|
11月前
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
205 5
|
12月前
|
人工智能 文字识别 Java
SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?
尼恩,一位拥有20年架构经验的老架构师,通过其深厚的架构功力,成功指导了一位9年经验的网易工程师转型为大模型架构师,薪资逆涨50%,年薪近80W。尼恩的指导不仅帮助这位工程师在一年内成为大模型架构师,还让他管理起了10人团队,产品成功应用于多家大中型企业。尼恩因此决定编写《LLM大模型学习圣经》系列,帮助更多人掌握大模型架构,实现职业跃迁。该系列包括《从0到1吃透Transformer技术底座》、《从0到1精通RAG架构》等,旨在系统化、体系化地讲解大模型技术,助力读者实现“offer直提”。此外,尼恩还分享了多个技术圣经,如《NIO圣经》、《Docker圣经》等,帮助读者深入理解核心技术。
SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?
|
存储 NoSQL Java
分布式session-SpringSession的应用
Spring Session 提供了一种创建和管理 Servlet HttpSession 的方案,默认使用外置 Redis 存储 Session 数据,解决了 Session 共享问题。其特性包括:API 及实现用于管理用户会话、以应用容器中性方式替换 HttpSession、简化集群会话支持、管理单个浏览器实例中的多个用户会话以及通过 headers 提供会话 ID 以使用 RESTful API。Spring Session 通过 SessionRepositoryFilter 实现,拦截请求并转换 request 和 response 对象,从而实现 Session 的创建与管理。
299 0
分布式session-SpringSession的应用
|
存储 NoSQL Java
分布式session-SpringSession的应用
Spring Session 提供了一种创建和管理 Servlet HttpSession 的方案,默认使用外置 Redis 存储 Session 数据,解决 Session 共享问题。其主要特性包括:提供 API 和实现来管理用户会话,以中立方式替换应用程序容器中的 HttpSession,简化集群会话支持,并在单个浏览器实例中管理多个用户会话。此外,Spring Session 允许通过 headers 提供会话 ID 以使用 RESTful API。结合 Spring Boot 使用时,可通过配置 Redis 依赖和支持缓存的依赖实现 Session 共享。
269 0
分布式session-SpringSession的应用
|
存储 运维 应用服务中间件
阿里云分布式存储应用示例
通过阿里云EDAS,您可以轻松部署与管理微服务应用。创建应用时,使用`CreateApplication`接口基于模板生成新应用,并获得包含应用ID在内的成功响应。随后,利用`DeployApplication`接口将应用部署至云端,返回"Success"确认部署成功。当业务调整需下线应用时,调用`ReleaseApplication`接口释放资源。阿里云EDAS简化了应用全生命周期管理,提升了运维效率与可靠性。[相关链接]提供了详细的操作与返回参数说明。
|
缓存 网络协议 API
分布式系统应用之服务发现!
分布式系统应用之服务发现!
152 0

热门文章

最新文章