赞
踩
课程链接:自己动手实现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如下:
<?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>
在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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。