当前位置:   article > 正文

手写RPC框架_java 手写rpc

java 手写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如下:

<?xml version="1.0" encoding="UTF-8"?>
<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.0</modelVersion>

    <groupId>com.zkpgeek</groupId>
    <artifactId>gk-rpc</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>gk-rpc-common</module>
        <module>gk-rpc-protocol</module>
        <module>gk-rpc-codec</module>
        <module>gk-rpc-transport</module>
        <module>gk-rpc-server</module>
        <module>gk-rpc-client</module>
    </modules>

    <properties>
        <java.version>1.8</java.version>
        <commons.version>2.5</commons.version>
        <jetty.version>9.4.20.v20190813</jetty.version>
        <fastjson.version>1.2.44</fastjson.version>
        <lombok.version>1.18.8</lombok.version>
        <slf4j.version>1.7.26</slf4j.version>
        <logback.version>1.2.3</logback.version>
        <junit.version>4.12</junit.version>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>${commons.version}</version>
            </dependency>
            <dependency>
                <groupId>org.eclipse.jetty</groupId>
                <artifactId>jetty-servlet</artifactId>
                <version>${jetty.version}</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>${fastjson.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>${logback.version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.3</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89

在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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/678860
推荐阅读
相关标签
  

闽ICP备14008679号