RMI 介绍

RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,能够让在某个 Java虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。可以用此方法调用的任何对象必须实现该远程接口。

服务提供者实现

创建 rmi-provider 项目

创建 UserService 接口

  1. package com.bjsxt.service;
  2. import java.rmi.Remote;
  3. import java.rmi.RemoteException;
  4. public interface UserService extends Remote {
  5. public String helloRmi(String name) throws RemoteException;
  6. }

创建 UserServiceImpl 实现类

  1. package com.bjsxt.service.impl;
  2. import com.bjsxt.service.UserService;
  3. import java.rmi.RemoteException;
  4. import java.rmi.server.UnicastRemoteObject;
  5. public class UserServiceImpl extends UnicastRemoteObject implements UserService {
  6. public UserServiceImpl() throws RemoteException {
  7. super();
  8. }
  9. @Override
  10. public String helloRmi(String name) throws RemoteException {
  11. return "hello "+name;
  12. }
  13. }

发布远程服务

  1. package com.bjsxt.app;
  2. import com.bjsxt.service.UserService;
  3. import com.bjsxt.service.impl.UserServiceImpl;
  4. import java.rmi.Naming;
  5. import java.rmi.registry.LocateRegistry;
  6. public class ProviderApp {
  7. public static void main(String[] args) {
  8. try {
  9. //将远程服务发布在本地的 8888 端口
  10. LocateRegistry.createRegistry(8888);
  11. //发布的远程服务的访问 url
  12. String name="rmi://localhost:8888/rmi";
  13. //创建一个提供具体服务的远程对象
  14. UserService userService=new UserServiceImpl();
  15. //给提供远程服务的对象绑定一个 url
  16. Naming.bind(name,userService);
  17. System.out.println("=============发布 rmi 远程服务============");
  18. }catch (Exception e){
  19. e.printStackTrace();
  20. }
  21. }
  22. }

服务消费者实现

创建 rmi-consumer 项目

拷贝 UserService 接口

消费远程服务

  1. package com.bjsxt.app;
  2. import com.bjsxt.service.UserService;
  3. import java.rmi.Naming;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6. import java.util.concurrent.ThreadLocalRandom;
  7. public class ConsumerApp {
  8. public static void main(String[] args) {
  9. List<String> urls = new ArrayList<>();
  10. urls.add("rmi://localhost:7777/rmi");
  11. urls.add("rmi://localhost:8888/rmi");
  12. urls.add("rmi://localhost:9999/rmi");
  13. String url = null;
  14. while (true) {
  15. try {
  16. //通过随机的负载均衡算法,产生随机的访问地址
  17. int index = ThreadLocalRandom.current().nextInt(urls.size());
  18. url = urls.get(index);
  19. //通过发布的远程服务的 url,获得远程服务的代理对象
  20. UserService userService = (UserService) Naming.lookup(url);
  21. System.out.println("获得的远程服务的代理对象:" + userService.getClass().getName());
  22. //通过远程服务的代理对象调用远程服务方法
  23. String result = userService.helloRmi("=======" + url + "==== rmi");
  24. System.out.println("result" + result);
  25. Thread.sleep(3000);
  26. } catch (Exception e) {
  27. urls.remove(url); //剔除不可用的服务的地址
  28. e.printStackTrace();
  29. }
  30. }
  31. }
  32. }

RMI 相关 API 总结

代码结构重构

建立 rmi-resource 公共资源项目

拷贝 UserService 接口

删除 rmi-provider UserService 接口

删除 rmi-consumer UserService 接口

rmi-provider 添加依赖

rmi-consumer 添加依赖

使用 RMI 实现方法的远程调用的更多相关文章

  1. 使用Socket&反射&Java流操作进行方法的远程调用(模拟RPC远程调用)

    写在前面 阅读本文首先得具备基本的Socket.反射.Java流操作的基本API使用知识:否则本文你可能看不懂... 服务端的端口监听 进行远程调用,那就必须得有客户端和服务端.服务端负责提供服务,客 ...

  2. 《Spring技术内幕》学习笔记17——Spring HTTP调用器实现远程调用

    1.Spring中,HTTPInvoker(HTTP调用器)是通过基于HTTP协议的分布式远程调用解决方案,和java RMI一样,HTTP调用器也需要使用java的对象序列化机制完成客户端和服务器端 ...

  3. Spring远程调用技术<1>-RMI

    在java中,我们有多种可以使用的远程调用技术 1.远程方法调用(remote method invocation, RMI)  适用场景:不考虑网络限制时(例如防火墙),访问/发布基于java的服务 ...

  4. cas的http配置和rmi远程调用

    1.cas配置http请求(服务端) 1) 解压cas-server-3.4.4-release.zip将modules目录下的cas-server-webapp-3.4.4.war改名称为cas.w ...

  5. ZooKeeper伪分布集群安装及使用 RMI+ZooKeeper实现远程调用框架

    使用 RMI + ZooKeeper 实现远程调用框架,包括ZooKeeper伪集群安装和代码实现两部分.  一.ZooKeeper伪集群安装: 1>获取ZooKeeper安装包 下载地址:ht ...

  6. 使用 RMI + ZooKeeper 实现远程调用框架

    目录[-] 1 发布 RMI 服务1.1 定义一个 RMI 接口1.2 编写 RMI 接口的实现类1.3 通过 JNDI 发布 RMI 服务2 调用 RMI 服务3 RMI 服务的局限性4 使用 Zo ...

  7. 【转】Python中实现远程调用(RPC、RMI)简单例子

    远程调用使得调用远程服务器的对象.方法的方式就和调用本地对象.方法的方式差不多,因为我们通过网络编程把这些都隐藏起来了.远程调用是分布式系统的基础. 远程调用一般分为两种,远程过程调用(RPC)和远程 ...

  8. WebService与RMI(远程调用方式实现系统间通信)

    前言 本文是<分布式java应用基础与实践>读书笔记:另外参考了此博客,感觉讲的挺好的,尤其是其中如下内容: 另外,消息方式实现系统间通信本文不涉及.RMI则只采用spring RMI框架 ...

  9. Atitit.分布式远程调用  rpc  rmi  CORBA的关系

    Atitit.分布式远程调用  rpc  rmi  CORBA的关系 1. 远程调用(包括rpc,rmi,rest)1 2. 分布式调用大体上就分为两类,RPC式的,REST式的1 3. RPC(远程 ...

随机推荐

  1. 关于vue ui组件

    一.vue ui  组件 1: vue 当前很火前端框架vue 针对PC用户 pc 端与移动端区别 (1)屏幕宽度:992px > (2)操作方式:鼠标 事件   手指:触碰操作 -饿了么:基于 ...

  2. 高德地图3D菱形 区域点击搜索

    更新一波吧 <!doctype html> <html lang="zh-CN"> <head> <!-- 原始地址://webapi.a ...

  3. Vue躬行记(8)——Vue Router

    虽然Vue.js未提供路由功能,但是官方推出了Vue Router(即vue-router库),以插件的形式支持.它与Vue.js深度集成,可快速的创建单页应用(Single Page Applica ...

  4. 破解微擎安装,免费搭建微擎,免费破解微擎,微擎破解版本,最新版本V2.1.2,一键安装!!

    ​ 微擎是一款基于WEB2.0(PHP+Mysql)技术架构,免费开源的公众平台管理系统,一款致力于将小程序和公众号商业化.智慧化.场景化的自助引擎.微擎提供公众号.微信小程序.支付宝小程序.百度熊掌 ...

  5. 网页版的支付宝授权登录(vue+java)

    api接口文档:https://docs.open.alipay.com/289/105656 后台管理系统原本是用账号密码登录的,不过需求要改成支付宝授权, 前端仅仅需要改登录页,以及添加一个授权返 ...

  6. nyoj 822-画图 (*)

    822-画图 内存限制:64MB 时间限制:1000ms 特判: No 通过数:133 提交数:187 难度:0 题目描述: 计算机画图也挺有趣的哈!那我们就来用计算机画幅图吧... 输入描述: 输入 ...

  7. 关于 Python 对象拷贝的那点事?

    概述 在本篇文章中,会先介绍 Python 中对象的基础概念,之后会提到对象的深浅拷贝以及区别.在阅读后,应该掌握如下的内容: 理解变量.引用和对象的关系 理解 Python 对象中 identity ...

  8. 剑指Offer-23.二叉搜索树的后序遍历序列(C++/Java)

    题目: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 分析: 二叉树的后序遍历也就是先访问左子树,再访问右 ...

  9. mysql的属性zerofill

    一.字段中zerofill属性的类似定义方式 SQL语句:字段名 int(M) zerofill 二.zerofill属性的作用 1.插入数据时,当该字段的值的长度小于定义的长度时,会在该值的前面补上 ...

  10. MySQL 、PDO对象

    目录 1, singleton 2, pdo与db 3, singleton获取pdo 4, pdo实现db增删改查 5, pdo异常处理exception 6, pdo预处理prepare 7, p ...