• 手写RPC框架


    课程链接:自己动手实现RPC框架
    Github项目地址:手写RPC

    1 理论篇

    1.1 RPC概念讲解

      RPC,即Remote Procedure Call,远程过程调用。RPC是分布式系统常见的一种通信方法,从跨进程到跨物理机已经有几十年的历史。
      跨进程交互方式:RESTful,WebService,HTTP,给予Database做数据交换,给予MQ消息队列做数据交换,以及RPC。

    1.2 现有框架对比

    依赖中间件做数据交互
    数据库和消息队列。
    在这里插入图片描述

    直接交互
    客户端会等待服务端返回。
    在这里插入图片描述
    在RPC中,把服务端(Server)叫成Provider,服务提供者;把客户端(Client)叫成Consumer,服务消费者;stub,存根,服务描述。

    现有RPC框架对比:
    在这里插入图片描述

    1.3 核心原理

    Registry:服务注册与发现。
    在这里插入图片描述
    在这里插入图片描述

    1.4 技术栈

    • 基础知识
      JavaCore,Maven,反射
    • 动态代理(生成Client存根实际调用对象)
      Java的动态代理
    • 序列化(Java对象与二进制数据互转)
      fastjson
      序列化:Java对象转换成二进制数组
      反序列化:二进制数据转换成Java对象
    • 网络通信(传输序列化后的数据)
      jetty,URLConnection

    2 实战篇

    第一步:创建工程,制定协议,通用工具方法
    第二步:实现序列化模块
    第三步:实现网络模块
    第四步:实现Server模块
    第五步:实现Client模块
    第六步:gk-rpc使用案例

    2.1 类图

    在这里插入图片描述

    2.2 创建工程

    选择Maven以及JDK1.8
    在这里插入图片描述
    GroupId一般是公司名,ArtifactId一般是项目名。
    在这里插入图片描述
    在项目文件夹下创建各个模块。
    在这里插入图片描述

    因为是多模块管理,src可以删去。
    在这里插入图片描述

    2.3 pom依赖配置&lombok配置

    Dependencies中刷新一下,再放到DependencyManagement,避免not Found。
    pom.xml如下:

    
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0modelVersion>
    
        <groupId>com.zkpgeekgroupId>
        <artifactId>gk-rpcartifactId>
        <packaging>pompackaging>
        <version>1.0-SNAPSHOTversion>
        <modules>
            <module>gk-rpc-commonmodule>
            <module>gk-rpc-protocolmodule>
            <module>gk-rpc-codecmodule>
            <module>gk-rpc-transportmodule>
            <module>gk-rpc-servermodule>
            <module>gk-rpc-clientmodule>
        modules>
    
        <properties>
            <java.version>1.8java.version>
            <commons.version>2.5commons.version>
            <jetty.version>9.4.20.v20190813jetty.version>
            <fastjson.version>1.2.44fastjson.version>
            <lombok.version>1.18.8lombok.version>
            <slf4j.version>1.7.26slf4j.version>
            <logback.version>1.2.3logback.version>
            <junit.version>4.12junit.version>
            <maven.compiler.source>8maven.compiler.source>
            <maven.compiler.target>8maven.compiler.target>
        properties>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>commons-iogroupId>
                    <artifactId>commons-ioartifactId>
                    <version>${commons.version}version>
                dependency>
                <dependency>
                    <groupId>org.eclipse.jettygroupId>
                    <artifactId>jetty-servletartifactId>
                    <version>${jetty.version}version>
                dependency>
                <dependency>
                    <groupId>com.alibabagroupId>
                    <artifactId>fastjsonartifactId>
                    <version>${fastjson.version}version>
                dependency>
            dependencies>
        dependencyManagement>
    
        <dependencies>
            <dependency>
                <groupId>junitgroupId>
                <artifactId>junitartifactId>
                <version>${junit.version}version>
            dependency>
            <dependency>
                <groupId>org.projectlombokgroupId>
                <artifactId>lombokartifactId>
                <version>${lombok.version}version>
            dependency>
            <dependency>
                <groupId>org.slf4jgroupId>
                <artifactId>slf4j-apiartifactId>
                <version>${slf4j.version}version>
            dependency>
            <dependency>
                <groupId>ch.qos.logbackgroupId>
                <artifactId>logback-classicartifactId>
                <version>${logback.version}version>
            dependency>
        dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.pluginsgroupId>
                    <artifactId>maven-compiler-pluginartifactId>
                    <version>3.3version>
                    <configuration>
                        <source>${java.version}source>
                        <target>${java.version}target>
                    configuration>
                plugin>
            plugins>
        build>
    project>
    

    在settings——plugins中安装插件lombok,再开启下面的选项
    在这里插入图片描述

    2.4 协议类

    包括Peer、Request、Response、ServiceDescriptor。

    2.5 反射工具类

    ReflectionUtils

    2.6 序列化模块

    两个接口:Encoder、Decoder;两个实现类:JSONEncoder,JSONDecoder。

    2.7 网络模块

    2.7.1 抽象

    三个抽象类:TransportClient,TransportServer,RequestHandler。

    2.7.2 实现Client

    实现类HTTPTransportClient

    2.7.3 实现Server

    实现类HTTPTransportServer。

    2.8 Server模块

    2.9 Client模块

    2.10 RPC使用案例

    新建gk-rpc-example模块。

    3 总结篇

    还是这张图~
    在这里插入图片描述
      首先对协议做了制定,定义了Request,Response,以及表示协议端点的Peer。接着做了序列化模块和网络传输模块。最后是服务端和客户端模块。

    • 难点1:jetty的嵌入
      Server:起到网络监听的作用
      ServletContextHandler:基于Servlet做网络的处理,要注册到server中
      ServletHolder:托管Servlet
    • 难点2:动态代理
      Proxy.newInstanceProxy:JDK自带
      RemoteInvoker implements InvocationHandler:

    不足与展望
    1、安全性,基于JSON序列化做的数据传输,并且网络传输并没有安全信息的校验。序列化加密,使用HTTPS
    2、服务端处理能力,jetty自带线程池,但是最好自己做,返回数据也最好做成队列的形式
    3、注册中心,起到对server地址注册
    4、集成能力,如何与SpringBoot结合,可以做Spring Boot Starter

  • 相关阅读:
    「Python循环结构」阿凡提拿工资
    【性能测试JMH】SpirngBoot结合 JMH进行性能测试 调优
    LeetCode:746. 使用最小花费爬楼梯【动态规划】
    tensorflow跑手写体实验
    关于推动可追溯代码来源的计划
    存储单位转换工具类
    java基础10题
    华为od德科面试数据算法解析 2022-3-20 关于员工工号问题
    redis集群节点间的内部通信机制
    快递查询、导出表格,批量操作效率更高
  • 原文地址:https://blog.csdn.net/qq_41523340/article/details/127031445