rmi

手写RPC框架(netty+zookeeper)

狂风中的少年 提交于 2020-03-21 10:15:48
  RPC是什么?远程过程调用,过程就是业务处理、计算任务,像调用本地方法一样调用远程的过程。   RMI和RPC的区别是什么?RMI是远程方法调用,是oop领域中RPC的一种实现,我们熟悉的restfull和webservice都是RPC,仅仅消息的组织方式和消息协议不同。   RPC调用过程 :    1、客户端处理过程中调用client sub(像调用本地方法一样),传递参数   2、client sub将参数编组为消息,然后通过系统调用想服务端发送消息   3、客户端本地操作系统将消息发送给服务端   4、服务端操作系统将收到的消息包传给server sub,   5、server sub解组消息为参数   6、server sub 调用本地服务,执行结果以反方向相同步骤返回给客户端   RPC协议 消息由哪些部分构成及消息的表示形式就构成了消息协议,RPC调用过程中采用的消息协议称为RPC协议,可以使用通用的协议(http、https),也可以自定义协议   RPC框架 封装好参数编组、消息解组、底层通信的RPC程序开发框架,可以在其基础上只需专注于过程代码编写,例如常用的dubbo和springcloud。   实现RPC的要点有:消息编组解组、服务注册发现和底层通信,本次基于JDK序列化编组解组消息

JAVA RMI 原理和使用浅析

隐身守侯 提交于 2020-03-11 16:50:21
定义 RMI: 远程方法调用( Remote Method Invocation ) ,它支持存储于 不同地址空间 的 程序级对象 之间彼此进行通信,实现远程对象之间的无缝远程调用。 Java RMI : 用于 不同虚拟机之间 的通信,这些虚拟机可以在不同的主机上、也可以在同一个主机上;一个虚拟机中的对象调用另一个虚拟上中的对象的方法,只不过是允许被远程调用的对象要通过一些标志加以标识。 RMI远程调用步骤 RMI的交互图 : RMI由3个部分构成: 第一个是 rmiregistry ( 远程方法调用注册,JDK提供的一个可以独立运行的程序,在bin目录下,名为rmiregistry.exe )。客户端端和服务端都有rmiregistry.exe, 客户端基于他进行对象发现,服务端基于他进行对象注册。 第二个是 server端 的程序, 对外提供远程对象 第三个是 client端 的程序,想要 调用远程对象 的方法。 首先,先 启动rmiregistry服务 ,启动时可以指定服务监听的端口,也可以使用默认的端口(1099)。 其次,server端在本地先实例化一个提供服务的实现类,然后通过RMI提供的Naming/Context/Registry(下面实例用的Registry)等类的bind或rebind方法将刚才实例化好的实现类注册到rmiregistry上并对外暴露一个名称。

RMI商品管理应用系统

给你一囗甜甜゛ 提交于 2020-02-28 18:43:57
要求设计一个RMI应用系统,满足如下的功能需求: 1)根据商品编号,查询商品信息 2)查询所有商品的信息 3)插入商品信息 4)修改商品信息 5)删除某个给定的商品信息 提示: 商品信息 包括:商品编号(goodId,String类型)、商品名称(goodName,String类型)、价格(price,float类型)、生产商(producer,String类型) 运行结果如图: 服务器一: ![在这里插入图片描](https://img-blog.csdnimg.cn/20200228151515781.PNG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NzM4NjYw,size_16,color_FFFFFF,t_70 服务器二: 客户端: 来源: CSDN 作者: 暮蓁 链接: https://blog.csdn.net/qq_44738660/article/details/104557094

100+经典Java面试题及答案解析

情到浓时终转凉″ 提交于 2020-02-26 09:59:53
面向对象编程(OOP) Java是一个支持并发、基于类和面向对象的计算机编程语言。下面列出了面向对象软件开发的优点: 代码开发模块化,更易维护和修改。 代码复用。 增强代码的可靠性和灵活性。 增加代码的可理解性。 面向对象编程有很多重要的特性,比如:封装,继承,多态和抽象。下面的章节我们会逐个分析这些特性。 封装 封装给对象提供了隐藏内部特性和行为的能力。对象提供一些能被其他对象访问的方法来改变它内部的数据。在Java当中,有3种修饰符:public,private和protected。每一种修饰符给其他的位于同一个包或者不同包下面对象赋予了不同的访问权限。 下面列出了使用封装的一些好处: 通过隐藏对象的属性来保护对象内部的状态。 提高了代码的可用性和可维护性,因为对象的行为可以被单独的改变或者是扩展。 禁止对象之间的不良交互提高模块化。 参考这个文档获取更多关于封装的细节和示例。 多态 多态是编程语言给不同的底层数据类型做相同的接口展示的一种能力。一个多态类型上的操作可以应用到其他类型的值上面。 继承 继承给对象提供了从基类获取字段和方法的能力。继承提供了代码的重用行,也可以在不修改类的情况下给现存的类添加新特性。 抽象 抽象是把想法从具体的实例中分离出来的步骤,因此,要根据他们的功能而不是实现细节来创建类。Java支持创建只暴漏接口而不包含方法实现的抽象的类

dubbo框架原理

ぃ、小莉子 提交于 2020-02-23 08:50:48
ali bab a有好几个 分布式 框架 ,主要有:进行远程调用(类似于RMI的这种远程调用)的(dubbo、hsf),jms消息 服务 (napoli、notify),KV 数据库 (tair)等。这个框架/ 工具 / 产品 在实现的时候,都考虑到了容灾,扩展,负载均衡,于是出现一个配置中心(ConfigServer)的东西来 解决 这些 问题 。 基本 原理 如图: 在 我们 的 系统 中,经常会有 一些 跨系统的调用,如在A系统中要调用B系统的一个服务,我们可能会使用RMI直接来进行,B系统 发布 一个RMI 接口 服务,然后A系统就来通过RMI调用这个接口,为了解决容灾,扩展,负载均衡的问题,我们可能会想很多办法,alibaba的这个办法感觉不错。 本文只说dubbo,原理如下: ConfigServer 配置中心,和每个Server/Client之间会作一个实时的心跳 检测 (因为它们都是 建立 的Socket长连接),比如几秒钟检测 一次 。收集每个Server 提供 的服务的信息,每个Client的信息,整理出一个服务列表,如: service Name serverAddressList clientAddressList UserService 192.168.0.1,192.168.0.2,192.168.0.3,192.168.0.4 172.16.0.1

EJB到底是什么,真的那么神秘吗??

拥有回忆 提交于 2020-02-03 23:12:05
EJB到底是什么,真的那么神秘吗?? 分类: JAVA学习-基础篇 2010-08-02 21:26 37965人阅读 评论 (127) 收藏 举报 ejb 服务器 数据库服务器 网络 分布式计算 数据库 1. 我们不禁要问,什么是"服务集群"?什么是"企业级开发"? 既然说了EJB 是为了"服务集群"和"企业级开发",那么,总得说说什么是所谓的"服务 集群"和"企业级开发"吧! 这个问题其实挺关键的,因为J2EE 中并没有说明白,也没有具体的指标或者事例告诉 广大程序员什么时候用EJB 什么时候不用。于是大家都产生一些联想,认为EJB"分布式运 算"指得是"负载均衡"提高系统的运行效率。然而,估计很多人都搞错了,这个"服务群集" 和"分布式运算"并没有根本解决运行负载的问题,尤其是针对数据库的应用系统。 为什么? 我们先把EJB 打回原形给大家来慢慢分析。 2. 把EJB 掰开了揉碎了 我们把EJB 的概念好好的分析一下,看看能发现些什么蛛丝马迹。 3.1 EJB 概念的剖析 我们先看一下,EJB 的官方解释: 商务软件的核心部分是它的业务逻辑。业务逻辑抽象了整个商务过程的流程,并使用计 算机语言将他们实现。 …… J2EE 对于这个问题的处理方法是将业务逻辑从客户端软件中抽取出来,封装在一个组 件中。这个组件运行在一个独立的服务器上,客户端软件通过网络调用组件提供的服务以实

When should i implement java.io.Serializable in RMI?

限于喜欢 提交于 2020-02-02 04:07:10
问题 I am just starting Java RMI and have some problems with when to use java.io.Serializable, so can anyone give me a RMI example that java.io.Serializable has to be implemented. Thanks!!! UPDATE: i had made a simple example, however, i think there are still problems as the output is not correct. Person Interface package server; import java.rmi.Remote; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; public interface PersonInterface extends Remote { public void setName

Rmi Mistake IllegalArgumentException, MarshalException

折月煮酒 提交于 2020-01-30 10:46:29
问题 Class for all package Task2; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; public class IdCl extends UnicastRemoteObject { private int id; private String name; protected IdCl() throws RemoteException { } public String getName() { return name; } public void setName(String name) { this.name = name; } public void setId(int id) { this.id = id; } } Interface for client package Task2; import java.rmi.Remote; import java.rmi.RemoteException; public interface ClientInt

关于<Java 中 RMI、JNDI、LDAP、JRMP、JMX、JMS那些事儿(上)>看后的一些总结-2

空扰寡人 提交于 2020-01-24 22:33:42
关于JNDI: 命名系统是一组关联的上下文,而上下文是包含零个或多个绑定的对象,每个绑定都有一个原子名(实际上就是给绑定的对象起个名字,方便查找该绑定的对象), 使用JNDI的好处就是配置统一的管理接口,下层可以使用RMI、LDAP或者CORBA来访问目标服务 要获取初始上下文,需要使用初始上下文工厂 比如JNDI+RMI Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory"); env.put(Context.PROVIDER_URL, "rmi://localhost:9999"); Context ctx = new InitialContext(env); //将名称refObj与一个对象绑定,这里底层也是调用的rmi的registry去绑定 ctx.bind("refObj", new RefObject()); //通过名称查找对象 ctx.lookup("refObj"); 比如JNDI+LDAP Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi

org.omg.CORBA.TRANSIENT: initial and forwarded IOR inaccessible vmcid: IBM minor code: E07 from stand-alone app

安稳与你 提交于 2020-01-24 20:14:50
问题 I'm connecting to the WebSphere instance from the stand-alone Java app which is quite trivial: InitialContext initCtx = new InitialContext(); That code was working perfectly in WebSphere 7, but after updating to WebSphere 8.5 I got the following exception: Caused by: org.omg.CORBA.TRANSIENT: initial and forwarded IOR inaccessible vmcid: IBM minor code: E07 completed: No at com.ibm.rmi.corba.ClientDelegate.createRequest(ClientDelegate.java:1276) at com.ibm.CORBA.iiop.ClientDelegate