闲话说不少了,现在正式开始一个字母一个字母敲代码!
环境信息如下:
java version “1.8.0_291”
IntelliJ IDEA 2021.1.1
maven 3.8.1(这个版本没那么重要)
根据之前的分析,乞丐版RPC分为api
、服务调用者
、服务提供者
、数据传输
四个模块,网络层已经有偌大名声的netty
封装好了底层实现,本着不重复造轮子的原则(实际是因为自己不会写),那就直接选择它了。
使用idea
搭建一个maven聚合工程 custom-rpc
,包含 rpc-api
、rpc-consumer
、rpc-provider
、rpc-protocol
四个模块。
上代码
下面定义我们常用的依赖,父pom定义依赖以及对应版本,子项目引入依赖,不需要单独指定版本,依赖版本由父pom统一管理。
custom-rpc 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.info</groupId>
<artifactId>custom-rpc</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>rpc-api</module>
<module>rpc-consumer</module>
<module>rpc-provider</module>
<module>rpc-protocol</module>
</modules>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<lombok.version>1.18.22</lombok.version>
<netty.version>4.1.70.Final</netty.version>
<fastjson.version>1.2.72</fastjson.version>
<log4j-slf4j.verison>2.11.0</log4j-slf4j.verison>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${
lombok.version}</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>${
netty.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${
fastjson.version}</version>
</dependency>
<!-- 日志实现 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>${
log4j-slf4j.verison}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
写代码,先从最简单的开始。
api 模块定义一个接口:
package com.info.api;
public interface Animal {
String run();
String speak();
}
api
模块就结束了,是的,你没看错,写完了!
下面开始写rpc-provider
,rpc-provider
模块是真正的服务提供者,需要实现api
中定义的接口,因此需要引入api
模块。
rpc-provider 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">
<parent>
<artifactId>cutom-rpc</artifactId>
<groupId>com.info</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>rpc-provider</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>com.info</groupId>
<artifactId>rpc-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
</dependency>
</dependencies>
</project>
实现 api
模块定义的接口
package com.info.provider.service.impl;
import com.info.api.Animal;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class Dog implements Animal {
@Override
public String run() {
String msg = "小狗跑起来一蹦一跳...";
log.info(msg);
return msg;
}
@Override
public String speak() {
String msg = "小狗叫起来汪汪汪...";
log.info(msg);
return msg;
}
}
rpc-provider
模块也开发完了!
本节就到这里了,下节开始我们“真正”开始实现rpc的代码,下节见。
源码我会放在 码云 ,需要的自取。
系列文章传送门如下:
手写RPC(一) 絮絮叨叨
手写RPC(二) 碎碎念
手写RPC(四) 核心模块网络协议模块编写 ---- netty服务端
手写RPC(五) 核心模块网络协议模块编写 ---- 自定义协议
手写RPC(六) 核心模块网络协议模块编写 ---- 实现编解码器
手写RPC(七) 核心模块网络协议模块编写 ---- 实现客户端
手写RPC(八) provider、consumer 实现
手写RPC(九) 测试
手写RPC(十) 优化
关于 LengthFieldBasedFrameDecoder 不得不说的事