Java自带RPC实现,RMI框架入门

  首先RMI(Remote Method Invocation)是Java特有的一种RPC实现,它能够使部署在不同主机上的Java对象进行通信与方法调用,它是一种基于Java的远程方法调用技术。

  让我们优先来实现一个RMI的RPC案例吧。

  项目源码地址:RPC_Demo,记得是项目里面的comgithubrmi

  1、首先我们需要为服务端创建一个接口方法,而且这个接口最好继承Remote

  package com.github.rmi.server;

  import java.rmi.Remote;

  import java.rmi.RemoteException;

  /**

  * Create by UncleCatMySelf in 21:03 2019\4\20 0020

  */

  public interface MyService extends Remote {

  String say(String someOne)throws RemoteException;

  }

  2、对于接口实现类,RMI接口方法定义必须显式声明抛出RemoteException异常,服务端方法实现必须继承UnicastRemoteObject类,该类定义了服务调用与服务提供方对象实现,并建立一对一的连接。

  package com.github.rmi.server;

  import java.rmi.RemoteException;

  import java.rmi.server.UnicastRemoteObject;

  /**

  * Create by UncleCatMySelf in 21:05 2019\4\20 0020

  */

  public class MyServiceImpl extends UnicastRemoteObject implements MyService {

  protected MyServiceImpl() throws RemoteException {

  }

  public String say(String someOne) throws RemoteException {

  return someOne + ,Welcome to Study!;

  }

  }

  3、这里我们还需要一个针对服务端的配置类,因为RMI的通信端口是随机产生的,因此有可能会被防火墙拦截。为了防止被防火墙拦截,需要强制制定RMI的通信端口,一般通过自定义一个RMISocketFactory类来实现。

  package com.github.rmi.config;

  import java.io.IOException;

  import java.net.ServerSocket;

  import java.net.Socket;

  import java.rmi.server.RMISocketFactory;

  /**

  * Create by UncleCatMySelf in 21:15 2019\4\20 0020

  */

  public class CustomerSocketFactory extends RMISocketFactory {

  public Socket createSocket(String host, int port) throws IOException {

  return new Socket(host, port);

  }

  public ServerSocket createServerSocket(int port) throws IOException {

  if (port == 0){

  port = 8855;

  }

  System.out.println(RMI 通信端口 : + port);

  return new ServerSocket(port);

  }

  }

  4、好了,这时你可以写出服务端的启动代码了。

  package com.github.rmi.server;

  import com.github.rmi.config.CustomerSocketFactory;

  import java.rmi.Naming;

  import java.rmi.registry.LocateRegistry;

  import java.rmi.server.RMISocketFactory;

  /**

  * Create by UncleCatMySelf in 21:07 2019\4\20 0020

  */

  public class ServerMain {

  public static void main(String[] args) throws Exception {

  //注册服务

  LocateRegistry.createRegistry(8866);

  //指定通信端口,防止被防火墙拦截

  RMISocketFactory.setSocketFactory(new CustomerSocketFactory());

  //创建服务

  MyService myService = new MyServiceImpl();

  Naming.bind(rmi://localhost:8866/myService,myService);

  System.out.println(RMI 服务端启动正常);

  }

  }

  5、客户端的启动就相对比较简单,我们仅需要进入服务,并调用对应的远程方法即可。

  package com.github.rmi.client;

  import com.github.rmi.server.MyService;

  import java.rmi.Naming;

  /**

  * Create by UncleCatMySelf in 21:10 2019\4\20 0020

  */

  public class ClientMain {

  public static void main(String[] args) throws Exception {

  //服务引入

  MyService myService = (MyService) Naming.lookup(rmi://localhost:8866/myService);

  //调用远程方法

  System.out.println(RMI 服务端调用返回: + myService.say(MySelf));

  }

  }

  最后可以看看效果。

  

  

  关于RMI的一些关键点

  支持真正的面向对象的多态性,这是RMI的优势。

  完美支持Java语言所独有的特性,不支持其他语言。

  使用了Java原生序列化,所有序列化对象必须实现java.io.Serializablie接口。

  底层通信是BIO(同步阻塞I/O)实现的Socket

  由于BIO与原生序列化存在的性能问题,导致RMI的性能较差,如果你的项目性能要求较高,可能并不合适哦!

Java自带RPC实现,RMI框架入门的更多相关文章

  1. Java RMI 框架

    RMI(即Remote Method Invoke 远程方法调用).在Java中,只要一个类extends了java.rmi.Remote接口,即可成为存在于服务器端的远程对象,供客户端访问并提供一定 ...

  2. (转) Java RMI 框架(远程方法调用)

    "原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://haolloyin.blog.51cto.com/1177454/33 ...

  3. Java RMI 框架(远程方法调用)

    转自:http://haolloyin.blog.51cto.com/1177454/332426 RMI(即Remote Method Invoke 远程方法调用).在Java中,只要一个类exte ...

  4. Taurus.MVC 微服务框架 入门开发教程:项目集成:6、微服务间的调用方式:Rpc.StartTaskAsync。

    系统目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 开源地址:https://github.com/cyq1162/Taurus.MVC 本系列第一篇:Tauru ...

  5. Java - Struts框架教程 Hibernate框架教程 Spring框架入门教程(新版) sping mvc spring boot spring cloud Mybatis

    https://www.zhihu.com/question/21142149 http://how2j.cn/k/hibernate/hibernate-tutorial/31.html?tid=6 ...

  6. Spring框架入门之基于Java注解配置bean

    Spring框架入门之基于Java注解配置bean 一.Spring bean配置常用的注解 常用的有四个注解 Controller: 用于控制器的注解 Service : 用于service的注解 ...

  7. Taurus.MVC 微服务框架 入门开发教程:项目集成:3、客户端:其它编程语言项目集成:Java集成应用中心。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 开源地址:https://github.com/cyq1162/Taurus.MVC 本系列第一篇:Tauru ...

  8. 一篇文章带你了解网页框架——Vue简单入门

    一篇文章带你了解网页框架--Vue简单入门 这篇文章将会介绍我们前端入门级别的框架--Vue的简单使用 如果你以后想从事后端程序员,又想要稍微了解前端框架知识,那么这篇文章或许可以给你带来帮助 温馨提 ...

  9. Java云原生崛起微服务框架Quarkus入门实践

    @ 目录 概述 定义 GraalVM简介 为何使用 特性 官方性能 实战 入门示例 步骤 安装GraalVM 创建quarkus工程 Idea导入项目 Idea运行和调试 打包成普通的Jar 打包成依 ...

随机推荐

  1. SparkSQL与Hive on Spark的比较

    简要介绍了SparkSQL与Hive on Spark的区别与联系 一.关于Spark 简介 在Hadoop的整个生态系统中,Spark和MapReduce在同一个层级,即主要解决分布式计算框架的问题 ...

  2. 目标检测(三)Fast R-CNN

    作者:Ross Girshick 该论文提出的目标检测算法Fast Region-based Convolutional Network(Fast R-CNN)能够single-stage训练,并且可 ...

  3. Django中使用Celery

    一.前言 Celery是一个基于python开发的分布式任务队列,如果不了解请阅读笔者上一篇博文Celery入门与进阶,而做python WEB开发最为流行的框架莫属Django,但是Django的请 ...

  4. nodejs 之=> 函数

    基本用法: ES6中允许使用“箭头”(=>)定义函数 var f = v => v; 上面代码相当于定义了一个函数 f : var f = function(v){ return v; } ...

  5. [svc]共享内存

    ipc是什么? 进程间通信(IPC,Inter-Process Communication),指至少两个进程或线程间传送数据或信号的一些技术或方法. 进程间为何不能直接共享数据? 如何解决ipc问题? ...

  6. 【Algorithm】-NO.140.Algorithm.1.Algorithm.1.001-【空间复杂度 时间复杂度 o(1), o(n), o(logn), o(nlogn)】-

    Style:Mac Series:Java Since:2018-09-10 End:2018-09-10 Total Hours:1 Degree Of Diffculty:5 Degree Of ...

  7. sublime lincense for linux

    sublime lincense for linux Sublime Text 3.x (after Build 3133) —– BEGIN LICENSE —–TwitterInc200 User ...

  8. 虚拟机VM三种网络连接方式说明

  9. codeforces 985B Switches and Lamps

    题意: 有n个开关,m盏灯. 一个开关可以控制多个灯,一旦一个灯开了之后,之后再对这个灯的操作就没用了. 问是否存在一个开关,去掉了这个开关之后,按下其它开关之后所有的灯还是亮的. 思路: 首先统计每 ...

  10. 自定义Word颜色主题

    外观 说明 看到这个黑色编辑器的界面,第一印象可能认为是Sublime.Atom. VScode或者其它markdown编辑器.其实仅仅是微软的Word经过了自定义主题. 选择清晰易于辨认的字体和深色 ...