课程链接:自己动手实现RPC框架。
Github项目地址:手写RPC
RPC,即Remote Procedure Call,远程过程调用。RPC是分布式系统常见的一种通信方法,从跨进程到跨物理机已经有几十年的历史。
跨进程交互方式:RESTful,WebService,HTTP,给予Database做数据交换,给予MQ消息队列做数据交换,以及RPC。
依赖中间件做数据交互
数据库和消息队列。
直接交互
客户端会等待服务端返回。
在RPC中,把服务端(Server)叫成Provider,服务提供者;把客户端(Client)叫成Consumer,服务消费者;stub,存根,服务描述。
现有RPC框架对比:
Registry:服务注册与发现。
第一步:创建工程,制定协议,通用工具方法
第二步:实现序列化模块
第三步:实现网络模块
第四步:实现Server模块
第五步:实现Client模块
第六步:gk-rpc使用案例
选择Maven以及JDK1.8
GroupId一般是公司名,ArtifactId一般是项目名。
在项目文件夹下创建各个模块。
因为是多模块管理,src可以删去。
在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,再开启下面的选项
包括Peer、Request、Response、ServiceDescriptor。
ReflectionUtils
两个接口:Encoder、Decoder;两个实现类:JSONEncoder,JSONDecoder。
三个抽象类:TransportClient,TransportServer,RequestHandler。
实现类HTTPTransportClient
实现类HTTPTransportServer。
新建gk-rpc-example模块。
还是这张图~
首先对协议做了制定,定义了Request,Response,以及表示协议端点的Peer。接着做了序列化模块和网络传输模块。最后是服务端和客户端模块。
不足与展望
1、安全性,基于JSON序列化做的数据传输,并且网络传输并没有安全信息的校验。序列化加密,使用HTTPS
2、服务端处理能力,jetty自带线程池,但是最好自己做,返回数据也最好做成队列的形式
3、注册中心,起到对server地址注册
4、集成能力,如何与SpringBoot结合,可以做Spring Boot Starter