easy-RPC 框架介绍
我给这个项目起了一个名字:easy-RPC,表面意思是很简单的 rpc,学起来很容易,实际上是功能很简陋的框架。
本框架的主要目的是为了带领大家从零开始撸一个简单的RPC框架,让你感受一下造轮子的快乐,在快乐的过程中你还能学到不少东西,这不是爽歪歪吗?!
虽然在上一篇文章中已经讲到了,但是这里我还想再重复一遍。这个项目如果你认真学下来,可以掌握以下的技术:
- 底层网络层基于 netty,学完 netty 入门没有问题;
- 使用自定义注解,学完可以了解注解的基本运行机制;
- 服务注册基于 zookeeper,学完 zk 入门没有问题;
- 会用到反射机制;
- 会用到动态代理技术;
- 教你如何定义一个 xxx-spring-boot-starter,了解spring boot自动配置机制;
- 学会如何自定义配置项,并绑定到 bean;
- 学习监听 spring 容器的事件;
- ……等等
有没有一点心动呢?!
项目源代码
学习的框架项目源代码我已经全部托管到 Github 中了,大家可以随意去下载,全部免费供大家白嫖,哈哈哈,方便的话 Star 一下就是感恩了~
项目的源代码地址统一放在公众号后台管理。微信搜索公众号:爱笑的架构师,回复关键字即可:rpc
当然如果你对从零开始手写 RPC 项目感兴趣,或者你遇到问题了,或者你想进群跟其他小伙伴一起交流,都非常欢迎联系我,跟上面一样回复暗号。
好了,下面基于源码演示一下效果,继续往下看~
快速开始
环境准备
- JDK8 或以上
- Maven 3
- Zookeeper 单机或者集群实例
- IntelliJ IDEA
编译安装源码
敲黑板:以下指导文档涉及到的演示代码已存放在easy-rpc-example这个目录下。
下载源码
git clone git@github.com:CoderLeixiaoshuai/easy-rpc.git
编译安装 jar 包到本地仓库
mvn clean install
新建 Spring Boot Maven 工程
在本地新建两个工程,用于模拟客户端和服务端。
引入依赖
<dependency> <groupId>com.leixiaoshuai</groupId> <artifactId>easy-rpc-spring-boot-starter</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
服务端配置
暴露接口
定义一个服务接口
/** * Hello World * * @author 雷小帅(公众号搜:爱笑的架构师) * @since 2021/11/29 */ public interface HelloService { /** * 打招呼 * * @param name 名称 * @return 问候语 */ String sayHello(String name); }
实现接口,使用自定义注解@ServiceExpose 暴露一个服务接口
/** * Hello World * * @author 雷小帅(公众号:爱笑的架构师) * @since 2021/11/29 */ @ServiceExpose public class HelloServiceImpl implements HelloService { public String sayHello(String name) { return "「来自雷小帅的问候」:hello " + name + " , 恭喜你学会了造RPC轮子!"; } }
配置注册中心地址
当前项目只支持 zookeeper 作为注册中心。服务端(provider)使用 zookeeper 为了暴露服务接口。
# application.properties # rpc 服务暴露的端口 leixiaoshuai.easy.rpc.expose-port=6666 # zookeeper 注册中心地址 leixiaoshuai.easy.rpc.zk-address=127.0.0.1:2181
客户端配置
注入远端服务
使用自定义注解 @ServiceReference 自动注入服务端暴露的接口服务
/** * @author 雷小帅(公众号:爱笑的架构师) * @since 2021/12/1 */ @RestController public class HelloController { private static final Logger logger = LoggerFactory.getLogger(HelloController.class); @ServiceReference private HelloService helloService; @GetMapping("/hello/{name}") public String hello(@PathVariable String name) { final String rsp = helloService.sayHello(name); logger.info("Receive message from rpc server, msg: {}", rsp); return rsp; } }
配置注册中心地址
客户端配置 zookeeper 是为了订阅发现服务端暴露的服务接口
# application.properties # zookeeper 实例地址 leixiaoshuai.easy.rpc.zk-address=127.0.0.1:2181
启动测试
运行服务端(服务提供者)
/** * 服务提供者启动入口 * * @author 雷小帅(公众号:爱笑的架构师) * @since 2021/11/29 */ @SpringBootApplication public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); } }
出现下面的日志,说明启动成功
运行客户端(服务消费者)
/** * 服务消费者启动入口 * * @author 雷小帅(公众号:爱笑的架构师) * @since 2021/12/01 */ @SpringBootApplication public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } }
出现下面的日志,说明启动成功
测试
使用浏览器输入请求地址测试:
http://127.0.0.1:8081/hello/输入测试字符串
返回下面的字符串就说明运行成功
FAQ
1、zookeeper 连接失败
解决方法:
(1)在本地机器或者在服务器上安装运行 zookeeper 实例;
(2)在配置文件中正确配置 zookeeper 地址;
下一步计划
后面会分多篇文章详细讲解框架项目的源码,讲一讲设计思想,这个简单的 rpc 学会了,dubbo 框架你也有办法拿下了。
如果你对从零开始手写 RPC 项目感兴趣,欢迎去 Github 上下载源码试用:
https://github.com/CoderLeixiaoshuai/easy-rpc