• 手写RPC框架


    什么是RPC框架

    RPC(Remote Procedure Call,远程过程调用), 简单来说遵循RPC协议的就是RPC框架.

    那RCP协议是什么呢?
    RPC协议是一种用于实现远程通信的协议,允许一个计算机程序在另一个地址空间(通常是在另一台计算机上或另一个服务上)执行程序或函数,就像本地调用一样。
    在远程调用过程中,开发者无需显示处理网络细节, 底层的通讯对于客户端来说、对于开发者来说是无感的.

    RPC 框架使分布式系统的开发更加容易,它隐藏了网络通信的细节,使开发者能够专注于业务逻辑,就像调用本地函数一样调用远程服务。

    RPC框架中的关键点

    在这里插入图片描述

    通信协议

    远程过程调用底层一定是网络通信, 那通信就必然需要通信协议, HTTP和TCP等都可以选择作为RPC的通信协议.

    序列化协议

    在网络通信中, 数据以二进制形式传输的, 也就是字节流, 但是在我们的Java程序中, 一定是以Java对象进行使用的, 所以这里必然有一个转换过程.就是在发送的时候将Java对象,转成字节流, 在接收的时候,将字节流转成Java对象, 这个转换过程的一个规范,规定就是序列化协议.

    常见的序列化协议有JSON、Protocol Buffers、Thrift、Hessian. 比如SpringCloud一般使用JSON, 而Dubbo则默认使用Hessian.

    动态代理和反射

    客户端:
    我们在客户端调用某个方法时,自己并没有操作, 但是却可以在底层执行网络通信这些, 一定是代理对象在帮我们做这些事情, 所以在客户端一定是需要动态代理的.

    服务端:
    服务端在收到请求时, 请求中会携带类名、方法名、方法参数等, 那这个时候就需要真正调用对应的方法, 就会用到反射.

    目前已有的RPC框架

    目前一些常见的 RPC 框架包括 gRPC、Apache Thrift、Apache Dubbo、CORBA(Common Object Request Broker Architecture)等。

    这些框架提供不同的特性和支持不同的编程语言,但它们的核心目标是相同的:简化远程服务调用并提供高效的通信机制

    RPC框架开发方序列化协议通信协议特点
    gRPCGoogleProtocol Buffers基于HTTP/2高效的跨语言RPC框架,基于HTTP/2,使用Protocol Buffers,支持双向流式通信。
    Apache DubboApacheHessian自定义Dubbo协议面向Java的高性能RPC框架,支持分布式架构和服务治理,具有负载均衡、集群容错等功能。
    Apache ThriftApache自定义二进制协议自定义通信协议多语言支持,用于构建高效且可扩展的服务,可支持跨语言的RPC框架。
    Spring Cloud Netflix中的FeignSpringJSON/XML等基于HTTP等基于Spring Cloud的微服务框架,Feign为声明式Web服务客户端,支持负载均衡和容错特性。
    Tars RPC腾讯Tars协议自定义Tars协议由腾讯开发,用于支持分布式系统的高性能RPC框架,提供了丰富的功能和工具,适用于大规模的分布式应用程序。

    手写RPC框架介绍

    在清楚了RPC框架中的关键点之后, 这里就手写了一个简单的RPC框架.
    其实就是实现了这个过程.
    在这里插入图片描述

    这个简单的手写框架主要目的是让大家能够彻底理解RPC框架底层原理,所以这个项目使用了Java中默认的序列化协议+NIO模型+TCP协议+动态代理+反射实现了RPC调用.

    完整项目代码我放在了github上,有需要可以自取->rpc框架代码
    同时也在CSDN放了一份->rpc框架代码

    项目框架

    这个项目由四部分组成.各个模块介绍以及依赖关系如下:

    在这里插入图片描述

    项目执行流程

    本项目以 IHelloService 接口中的hello方法为例, 说明项目中每个类的具体功能和执行流程.

    在这里插入图片描述

    项目启动

    1. 启动服务端
      执行rpc-server-provider模块下的App.class类.
    2. 启动客户端
      执行rpc-client模块下的App.class类

    结果现象

    在客户端调用hello方法,传入参数hello.

    在这里插入图片描述

    IHelloService.hello方法本身并没有实现, 通过rpc调用能够执行服务端的方法,返回拼接后的字符串, 即代表执行成功.

    在这里插入图片描述

    在这里插入图片描述

    今天的分享就到这里了,有问题可以在评论区留言,均会及时回复呀.
    我是bling,未来不会太差,只要我们不要太懒就行, 咱们下期见.
    在这里插入图片描述

  • 相关阅读:
    LEAP模型能源与碳排放模型
    APS高级排程在钣金冲压行业的应用
    【系统架构设计】架构核心知识: 3.3 DSSA和ABSD
    【Java基础】Java容器相关知识小结
    python+django医院疫情防控管理系统vue
    python 将字节字符串转换成十六进制字符串
    爬虫入门四(抽屉半自动点赞、xpath使用、动作链、打码平台、scrapy框架介绍与安装及创建项目)
    Java基础
    2022年全球市场中空玻璃密封胶总体规模、主要生产商、主要地区、产品和应用细分研究报告
    C++重点---STL简介
  • 原文地址:https://blog.csdn.net/wangliangluang/article/details/133936294