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

Python08

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

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

二,rpc一般是用于服务器与服务器进程之间通信,这种通信有请求和应答。它是建立在底层的socket通信之上的。封装为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

简单的介绍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

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

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

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

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

服务端

客户端

测试服务

运行效果

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

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

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

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