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. 下载频道--IT资源关东煮第二期[申明:来源于网络]

    下载频道–IT资源关东煮第二期[申明:来源于网络] 地址:http://geek.csdn.net/news/detail/129509?ref=myread

  2. Herriott池的设计

    0.矩阵法计算光路 1.谐振腔和透镜组的等效,计算x和x’ 2.近轴光路的近似计算和矩阵法. 3.相邻光线的角度 4.为啥分模式 5.椭圆模式 6.要考虑的其他问题,相邻光斑的干涉

  3. win10系统安装了多个版本的JDK如何切换

    本人这台笔记本前面装了jdk8,现在准备用jdk7,我安装好了jdk7:把系统变量中的JAVA_HOME 改为 D:\java\jdk\jdk7\jdk1.7.0_67,Path下添加如下变量,记得加 ...

  4. PTA 复数四则运算

    本题要求编写程序,计算2个复数的和.差.积.商. 输入格式: 输入在一行中按照a1 b1 a2 b2的格式给出2个复数C1=a1+b1i和C2=a2+b2i的实部和虚部.题目保证C2不为0. 输出格式 ...

  5. 【托业】【新东方托业全真模拟】TEST09~10-----P5~6

    at no time 绝不,从不 takeover 收购 startup n.启动; 新兴公司(尤指新兴网络公司); 新兴公司,新开张的企业; specific具体的,特定的:factual 事实的, ...

  6. Sonatype Nexus Repository Manager版本3.14.2访问控制缺失及远程代码执行漏洞

    发现被执行的程序在xmrig在 /var/tmp/目录下 ,脚本文件内容为以下: curl -o /var/tmp/xmrig http://202.144.193.159/xmrig;curl -o ...

  7. 加壳工具-Virbox Protector Standalone

    深思数盾自动保护工具Virbox Protector Standalone,是深思数盾科技股份有限公司经过多年技术深耕开发的一款高强度自动保护(加密)工具. 该工具集混淆.虚拟化.外壳加密.数据加密于 ...

  8. Linux服务器可以进百度,但是进阿里云或者别的一些网站提示‘错误代码:NS_ERROR_NET_INADEQUATE_SECURITY’的问题

    昨天遇到一个头疼的事情,在阿里云买了一台服务器: 然后环境各种都装了,因为本人是小白,所以一般都装MATE界面: 一开始环境没配好,访问百度可以进去,进万网但是进不去,先也没急着搞这个事情,第一天晚上 ...

  9. this inspection detects names that should resolved but don't. Due to dynamic dispatch and duck typing, this is possible in a limited but useful number of cases. Top-level and class-level items are sup

    输入第一行代码:import logging;logging.basicConfig(level==logging.INFO) 提示:this inspection detects names tha ...

  10. JMeter-标的上架调整与完成

    问题:利随本青,按日的返回的参数不正确 各种计息方式的上标,新做产品的上架 散标各种计息方式的上架,新做产品的上架 修改后B环境上架 修改后C环境上架 [制作提案(担保机构)-提交18] loan.d ...