RPC实践

一. RPC是什么?

  • remote procedure call,远程过程调用。其中远程表示不同应用间的调用,过程就是业务处理,计算任务,更直白理解,就是程序(像调用本地方法一样调用远程的过程)。

  • RPC采用Client-Server结构,通过request-response消息模式实现。

  • RPC和RMI有什么区别?
    RMI(remote method invocation) 远程方法调用时oop领域中RPC的一种具体实现。

  • 我们熟悉的webservice,restful接口调用是RPC吗?
    都是RPC,仅消息的组织方式和消息协议不同

  • 远程过程调用较本地调用有何不同?
    速度相对慢,可靠性减弱

二. RPC的流程

在这里插入图片描述
在这里插入图片描述

  • RPC流程中需要处理的问题
    在这里插入图片描述

三. RPC协议

  • RPC调用过程中需要将参数编组为消息进行发送,接收方需要解组消息为参数,过程处理结果同样需要经编组,解组。消息由哪些部分构成及消息的表示形式就构成消息协议。

  • RPC调用过程中采用的协议称为RPC协议。

  • RPC协议规定请求,响应消息的格式
    在TCP(网络传输控制协议)上可以选用或自定义消息协议来完成RPC消息交互,我们可以选用通用的标准协议(如:http,https),也可以根据自身的需要定义自己的消息协议。

  • 常见RPC协议
    在这里插入图片描述

四. RPC框架

  • 封装好参数编组,消息解组,底层网络通信的RPC程序开发框架,带来的便捷性是可以直接在其基础上只需专注于过程代码编写。

  • Java领域的常见RPC框架
    传统的webservice框架:Apache CXF,Apache Axis2,Java自带的JAX-WS等;
    新兴的微服务框架:Dubbo,Spring Cloud,Apcahe Thrift等。

  • 为什么用RPC?
    服务化,可重用,系统间交互调用

  • RPC核心概念术语
    在这里插入图片描述

五. 自己实现一个简单的RPC

  • 从使用者角度开始
    用户使用RPC框架开发过程时需要注意什么?
    (1) 定义过程接口;
    (2) 服务端实现过程;
    (3) 客户端使用生成的stub代理对象。
    在这里插入图片描述

  • 客户端设计
    (1) 在ClientStubInvocationHandler(客户端stub代理)中要完成哪些事情?
    编组消息 + 发送网络请求
    (2) 将请求的内容编组为消息这件事情由谁来做?
    消息协议 + 网络层
    (3) 消息协议是固定不变的吗?它与什么有关?
    看框架对协议的支持扩展,如果支持多种协议,就是会灵活变化的,它与具体的服务相关,A服务提供者可能选用的是协议1,B服务提供者可能选用协议2。
    (4) 某服务是用的什么消息协议这个信息从哪来?
    从获取的服务信息中来,因此需要一个服务信息发现者。
    把服务发现者设计出来:可灵活支持多种发现机制。

  • 设计客户端-发现者
    在这里插入图片描述

  • 设计客户端-协议层
    (1) 我们想要做到可以支持多种协议,我们的类该如何设计?
          面向接口,策略模式,组合
    (2) 编组/解组方法该定义怎样的参数和返回值?
          编组/解组的操作对象是请求/响应,请求/响应的内容是不同的。
          定义框架标准的请求/响应类
    (3) 因为客户端,服务端均需要协议支持,所以将消息协议独立为一层
    在这里插入图片描述

  • 设计客户端-网络层
    (1) 网络层的工作是什么?
    发送请求,获得响应。要发起网络请求,则需知道服务地址。
    在这里插入图片描述

  • 客户端完整类图
    在这里插入图片描述

  • 实现客户端
    按照类图设计,填码。
    在实现过程中,设计到 JDK动态代理 和 Netty网络通信。
    协议层涉及到一个重要概念:参数序列化和反序列化。

  • 服务端设计
    在这里插入图片描述
    客户端请求过来了,服务端首先需要通过RPCServer开启网络服务,接收请求。
    网络层在RPCServer中提供多线程来处理请求,消息协议层服用客户端设计的。
    RPCServer接收到请求后,将请求交给RequestHandler来处理,RequestHandler调用协议层来解组请求消息为Request对象,然后调用过程。
    在这里插入图片描述
    过程注册模块:让用户将他们的过程注册到RPC框架中来。
    过程暴露模块:想对外发布(暴露)服务
    注册/暴露可以由同一个类实现。

  • 服务端完整类图
    在这里插入图片描述

  • 实现服务端
    RPCServer中实现网络层:Netty,使用RequeatHandler
    ServiceRegister模块实现服务注册与发布
    RequestHandler中实现消息协议处理,过程调用

  • 扩展
    如何与Spring集成?

完整代码传送门:https://github.com/Go007/simple-rpc

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Netty是一个基于NIO的高性能网络通信框架,它的核心原理是通过事件驱动和异步处理机制来实现高效的网络传输。其特点是可扩展、可重用、易于维护、性能卓越。 RPC(Remote Procedure Call)是一种基于网络通信的分布式计算模型,通过这种模型,客户端调用服务端的远程方法就像调用本地方法一样简单。在RPC实践过程中,使用Netty框架可以有效提升RPC的性能和稳定性。 Netty的核心原理是基于事件驱动的模型,它的主要组成部分包括NioEventLoop、Channel、Buffer、Codec等。NioEventLoop是Netty中的核心组件之一,它是一个事件循环线程,通过不断遍历注册在它上面的Channel监听器,来处理网络传输过程中的事件,从而实现网络的异步非阻塞传输。 在RPC实践中,Netty通过对协议进行编解码,来实现远程方法的调用和响应过程。通常情况下,客户端与服务端之间需要使用一种协议来进行通信,需要对协议进行编解码处理,这个过程需要在客户端和服务端都实现一遍,使用Netty框架可以简化这个过程,使得开发人员只需要实现协议的编解码策略即可。 总之,Netty作为高性能网络通信框架,其核心原理是基于事件驱动的机制实现的。在RPC实践中,Netty可以高效地实现协议的编解码,提升RPC的性能和稳定性,因此在分布式计算中得到了广泛的应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值