您的位置:

javarpc,javarpc实现负载均衡

本文目录一览:

java protobuf 定义rpc服务怎么调用

1.,选择其中的win版本下载,我选择的是protoc-2.4.1-win32.zip

2.下载一个protobuf-java-2.4.1.jar文件(注意,要与你刚才下的proto.exe版本相同)

然后就开始开发了。

步骤:

1.用记事本编写一个.proto文件:

}如:编写的是test.proto

package protobuf;

option java_package = "com.sq.protobuf";

option java_outer_classname = "FirstProtobuf";

message testBuf {

required int32 ID = 1;

required string Url = 2;

}

将其放在与刚解压的protoc.exe同级目录中。

2.在cmd中,到protoc-2.4.1-win32文件夹下,

执行

E:\protoc-2.4.1-win32 protoc.exe --java_out=./ test.proto

则可以找到的一个生成的FirstProtobuf.java文件。

3.在MyEclipse中新建一个java project,建立包com.sq.protobuf,然后将刚才生成的FirstProtobuf.java文件放在其下面。

此时会报错,因为没有引入jar包,在package视图下,将protobuf-java-2.4.1.jar引入,即可解决问题。

Java远程方法调用(1)

概述 Java Remote Method Invocation ( RMI Java远程方法调用)允许您使用Java编写分布式对象 本文将介绍RMI的优点以及如何将其连接到现有的和原有的系统中 以及与用Java 编写的组件的连接 RMI为采用Java对象的分布式计算提供了简单而直接的途径 这些对象可以是新的Java对象 也可以是围绕现有API的简单的Java包装程序 Java体现了 编写一次就能在任何地方运行的模式 而RMI可将Java模式进行扩展 使之可在任何地方运行 因为RMI是以Java为核心的 所以 它将Java的安全性和可移植性等强大功能带给了分布式计算 您可将代理和梢?务逻辑等属性移动到网络中最合适的地方 如果您要扩展Java在系统中的使用 RMI将使您充分利用其强大功能 RMI可利用标准Java本机方法接口JNI与现有的和原有的系统相连接 RMI还可利用标准JDBC包与现有的关系数据库连接 RMI/JNI和RMI/JDBC相结合 可帮助您利用RMI与目前使用非Java语言的现有服务器进行通信 而且在您需要时可扩展Java在这些服务器上的使用 RMI可帮助您在扩展使用时充分利用Java的强大功能 优点 从最基本的角度看 RMI是Java的远程过程调用(RPC)机制 与传统的RPC系统相比 RMI具有若干优点 因为它是Java面向对象方法的一部分 传统的RPC系统采用中性语言 所以是最普通的系统 它们不能提供所有可能的目标平台所具有的功能 RMI以Java为核心 可与采用本机方法与现有系统相连接 这就是说 RMI可采用自然 直接和功能全面的方式为您提供分布式计算技术 而这种技术可帮助您以不断递增和无缝的方式为整个系统添加Java功能 RMI的主要优点如下  面向对象 RMI可将完整的对象作为参数和返回值进行传递 而不仅仅是预定义的数据类型 也就是说 您可以将类似Java哈希表这样的复杂类型作为一个参数进行传递 而在目前的RPC系统中 您只能依靠客户机将此类对象分解成基本数据类型 然后传递这些数据类型 最后在服务器端重新创建哈希表 RMI则不需额外的客户程序代码(将对象分解成基本数据类型) 直接跨网传递对象  可移动属性 RMI可将属性(类实现程序)从客户机移动到服务器 或者从服务器移到客户机 例如 您可以定义一个检查雇员开支报告的接口 以便察看雇员是否遵守了公司目前实行的政策 在开支报告创建后 客户机就会从服务器端获得实现该接口的对象 如果政策发生变化 服务器端就会开始返回使用了新政策的该接口的另一个实现程序 您不必在用户系统上安装任何新的软件就能在客户端检查限制条件 从而向用户提供烁?快的反馈 并降低服务器的工作量 这样就能具备最大的灵活性 因为政策改变时只需要您编写一个新的Java类 并将其在服务器主机上安装一次即可  设计方式 对象传递功能使您可以在分布式计算中充分利用面向对象技术的强大功能 如二层和三层结构系统 如果您能够传递属性 那么您就可以在您的解决方案中使用面向对象的设计方式 所有面向对象的设计方式无不依靠不同的属性来发挥功能 如果不能传递完整的对象 包括实现和类型 就会失去设计方式上所提供的优点  安全 RMI使用Java内置的安全机制保证下载执行程序时用户系统的安全 RMI使用专门为保护系统免遭恶意小应用程序侵害而设计的安全管理程序 可保护您的系统和网络免遭潜在的恶意下载程序的破坏 在情况严重时 服务器可拒绝下载任何执行程序 便于编写和使用 RMI使得Java远程服务程序和访问这些服务程序的Java客户程序的编写工作变得轻松 简单 远程接口实际上就是Java接口 服务程序大约用三行指令宣布本身是服务程序 其它方面则与任何其它Java对象类似 这种简单方法便于快速编写完整的分布式对象系统的服务程序 并快速地制做软件的原型和早期版本 以便于进行测试和评估 因为RMI程序编写简单 所以维护也简单  可连接现有/原有的系统 RMI可通过Java的本机方法接口JNI与现有系统进行进行交互 利用RMI和JNI 您就能用Java语言编写客户端程序 还能使用现有的服务器端程序 在使用RMI/JNI与现有服务器连接时 您可以有选择地用Java重新编写服务程序的任何部分 并使新的程序充分发挥Java的功能 类似地 RMI可利用JDBC 在不修改使用数据库的现有非Java源代码的前提下与现有关系数据库进行交互  编写一次 到处运行 RMI是Java 编写一次 到处运行 方法的一部分 任何基于RMI的系统均可 %地移植到任何Java虚拟机上 RMI/JDBC系统也不例外 如果使用RMI/JNI与现有系统进行交互工作 则采用JNI编写的代码可与任何Java虚拟机进行编译 运行  分布式垃圾收集 RMI采用其分布式垃圾收集功能收集不再被网络中任何客户程序所引用的远程服务对象 与Java 虚拟机内部的垃圾收集类似 分布式垃圾收集功能允许用户根据自己的需要定义服务器对象 并且明确这些对象在不再被客户机引用时会被删除  并行计算 RMI采用多线程处理方法 可使您的服务器利用这些Java线程更好地并行处理客户端的请求 Java分布式计算解决方案 RMI从JDK 开始就是Java平台的核心部分 因此 它存在于任何一台 Java虚拟机中 所有RMI系统均采用相同的公开协议 所以 所有Java 系统均可直接相互对话 而不必事先对协议进行转换 lishixinzhi/Article/program/Java/hx/201311/26469

手写一个RPC框架,看看100个线程同时调用情况如何

简单的介绍RPC是什么,RPC整个调用流程是什么,包含了什么组件。然后实际编写一个RPC实例,模拟100个线程调用以验证RPC的可用性,稳定性等。最后总结自己编写的RPC框架存在哪些问题,可以去完善的,一个优秀的RPC框架应该必备的功能点。

RPC(Remote Procedure Call),远程过程调用,可通过网络调用其他机器的服务请求。RPC是一种规范,和TCP、UDP都没有关系,RCP可以采用TCP协议完成数据传输,甚至可以使用HTTP应用协议。RCP是C端模式,包含了服务端(服务提供方)、客户端(服务使用方),采用特定的网络传输协议,把数据按照特定的协议包装后进行传输操作等操作。先来了解下一个具体的RPC调用请求的执行过程

本图来自网络

这就是一个完整的RPC调用过程,对使用方而言就 只暴露了本地代理对象 ,剩下的数据解析、运输等都被包装了,从服务提供方的角度看还有 服务暴露 ,如下图DUBBO的架构图。

学习写RPC之前必须先了解 动态代理 和 反射 这两个知识点,如不了解先自行了解,本学习笔记不涉及到此内容的介绍。

文件夹目录

可以很清楚的看到convert方法就是从一个输入流中读取出类名称、方法名等数据,组成一个MethodParameter对象,也就是上面所说的Request

服务暴露存储了一个 MapString, Object objectMap 对象,所有可对外提供服务的都必须添加到该容器中,以便于收到网络数据后能找到对应的服务,然后采用反射invoke调用,返回得到的结果。

简单的BIO模型,开启了一个ServerSocket后,接收到数据后就把套接字丢给一个新的线程处理,ServerSocketRunnable接受一个socket后,解析出MethodParameter这个请求对象,然后调用服务暴露的invoke方法,再写回到socket传输给客户端

服务使用方需要使用register进行服务的注册,会生成对应的本地代理对象,后续只需要通过本地代理对象。

代理对象被调用后生成一个MethodParameter对象,通过此IOClient把数据传输到服务端,并且返回对应的数据。

服务端

客户端

测试服务

运行效果

这只是一个非常简单的RPC实践,包含了服务暴露、服务注册(Proxy生成)、BIO模型进行网络传输,java默认的序列化方法, 对RPC有一个初步的认识和了解,知道RPC必须包含的模块 。

不过还是有很多需要优化的点以改进。

还有例如服务统计、优雅下线、负载均衡等也都是一个成熟的RPC框架必须要考虑到的点。

本人微信公众号(搜索jwfy)欢迎关注

Java开发中消息队列和rpc框架都是做什么的?

一,消息队列服务一般用于设计多系统之间的信息传输,一般这种传输不需要对方对数据做出回应。它最常见的方式是构建异步的生产者-消费者模式。我们在系统开发中,有些业务并不需要及时返回结果,我们可以把这些操作放到队列中,然后另起一个消费者去处理它。比如日志,数据库异步更新。

二,rpc一般是用于服务器与服务器进程之间通信,这种通信有请求和应答。它是建立在底层的socket通信之上的。封装为rpc之后,更加方便建立通信。就像在同一个进程中调用对方的方法一样。它本地的方法名一般和请求到达的服务器的方法名一一对应。这样可以更好的把模块划分。所以它是应对分布式而生的。比如一个网站,一开始可能所有的服务在一个进程中,但是随着业务的增长,一个进程处理不过来,这时就需要把业务拆分成多个,分部到不同的机器上去。

rpc的实现机制是什么

RPC 的全称是 Remote Procedure Call 是一种进程间通信方式。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。即无论是调用本地接口/服务的还是远程的接口/服务,本质上编写的调用代码基本相同。

比如两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数或者方法,由于不在一个内存空间,不能直接调用,这时候需要通过就可以应用RPC框架的实现来解决。

RPC 会隐藏底层的通讯细节(不需要直接处理Socket通讯或Http通讯)

RPC 是一个请求响应模型。客户端发起请求,服务器返回响应(类似于Http的工作方式)

RPC 在使用形式上像调用本地函数(或方法)一样去调用远程的函数(或方法)。

二、常见RPC框架

几种比较典型的RPC的实现和调用框架。

(1)RMI实现,利用java.rmi包实现,基于Java远程方法协议(Java Remote Method Protocol)

和java的原生序列化。

(2)Hessian,是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能。 基于HTTP协议,采用二进制编解码。

(3)THRIFT是一种可伸缩的跨语言服务的软件框架。thrift允许你定义一个描述文件,描述数据类型和服务接口。依据该文件,编译器方便地生成RPC客户端和服务器通信代码。

二、RPC框架实现原理

在RPC框架中主要有三个角色:Provider、Consumer和Registry。如下图所示:

RPC框架面试总结-RPC原理及实现

节点角色说明:

* Server: 暴露服务的服务提供方。

* Client: 调用远程服务的服务消费方。

* Registry: 服务注册与发现的注册中心。

三、RPC调用流程

RPC基本流程图:

RPC框架面试总结-RPC原理及实现

一次完整的RPC调用流程(同步调用,异步另说)如下:

1)服务消费方(client)调用以本地调用方式调用服务;

2)client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;

3)client stub找到服务地址,并将消息发送到服务端;

4)server stub收到消息后进行解码;

5)server stub根据解码结果调用本地的服务;

6)本地服务执行并将结果返回给server stub;

7)server stub将返回结果打包成消息并发送至消费方;

8)client stub接收到消息,并进行解码;

9)服务消费方得到最终结果。

RPC框架的目标就是要2~8这些步骤都封装起来,让用户对这些细节透明。

四、服务注册发现

RPC框架面试总结-RPC原理及实现

服务提供者启动后主动向注册中心注册机器ip、port以及提供的服务列表;

服务消费者启动时向注册中心获取服务提供方地址列表,可实现软负载均衡和Failover;

五、使用到的技术

1、动态代理

生成 client stub和server stub需要用到 Java 动态代理技术 ,我们可以使用JDK原生的动态代理机制,可以使用一些开源字节码工具框架 如:CgLib、Javassist等。

2、序列化

为了能在网络上传输和接收 Java对象,我们需要对它进行 序列化和反序列化操作。

* 序列化:将Java对象转换成byte[]的过程,也就是编码的过程;

* 反序列化:将byte[]转换成Java对象的过程;

可以使用Java原生的序列化机制,但是效率非常低,推荐使用一些开源的、成熟的序列化技术,例如:protobuf、Thrift、hessian、Kryo、Msgpack

关于序列化工具性能比较可以参考:jvm-serializers

3、NIO

当前很多RPC框架都直接基于netty这一IO通信框架,比如阿里巴巴的HSF、dubbo,Hadoop Avro,推荐使用Netty 作为底层通信框架。

4、服务注册中心

可选技术:

* Redis

* Zookeeper

* Consul

* Etcd

java java.lang.Class对象不能用于RPC传输吗

RPC的过程是 传递参数 给 远程的一个进程 执行相应的方法(这里的远程是相对的,其实不在同一个进程里,就可以),获取到一个对象,这中间的问题是,你需要把调用参数传递给远程的进程,但是这些参数是在你本地的内存里,远程的进程是拿不到你本地的内存信息的,所以这中间 演变出一个 序列化的机制,简单来说,就是把内存里的数据,变成一种可以传输的方式(简单来说,把内存的状态用一段数据来表示,这种数据可以是二进制数据,也可以是文本数据,常用的xml,json也是),序列化之后,就可以传递给远程,作为参数,调用远程的方法,同时 返回的结果也用序列化的方式,返回给本地。 java本身的序列化方式是,需要实现java.io.Serializable 就可以。 查看了下 Class的定义,

public final class ClassT implements java.io.Serializable,

GenericDeclaration,

Type,

AnnotatedElement

Class实现了那个接口,所以可以用来进行RPC传输。 这里需要说明的一点是,序列号的方式其实有很多种,不是所有的序列化方式都需要实现Serializable来序列化,有很多别的方式,是不需要实现Serializable,也可以序列化的。