手撸 RPC 轮子系列文章目录:

  • 「从零开始造 RPC 轮子系列」01 我为什么要去造一个轮子?
  • 「从零开始造 RPC 轮子系列」02 演示轮子,是驴是马拉出来遛遛]
  • (TODO)「从零开始造 RPC 轮子系列」03 完事具备,只差一个环境搭建
  • (TODO)「从零开始造 RPC 轮子系列」04 手绘 4 张图带你入门 RPC 服务框架
  • (TODO)「从零开始造 RPC 轮子系列」05 用通俗的语言介绍 RPC 框架的架构原理

正文开始

大家好,我是雷小帅,最近我手写了一个mini版dubbo RPC框架,请查收说明书!

当当当,这几天给大家承诺的 RPC 框架终于上线了,撒花撒花撒花~

本来是打算先讲原理和源码,但是可能有些枯燥,大家总喜欢直接看效果,那这一次我把顺序反过来,直接先演示一下运行效果。

看到效果后也许能激发你的学习兴趣呢?!

既然说了是手把手从零开始,那我一定会把你教懂,让你有机会跟面试官吹牛*

easy-RPC 框架介绍

我给这个项目起了一个名字:easy-RPC,表面意思是很简单的 rpc,学起来很容易,实际上是功能很简陋的框架。

本框架的主要目的是为了带领大家从零开始撸一个简单的RPC框架,让你感受一下造轮子的快乐,在快乐的过程中你还能学到不少东西,这不是爽歪歪吗?!

虽然在上一篇文章中已经讲到了,但是这里我还想再重复一遍。这个项目如果你认真学下来,可以掌握以下的技术:

  1. 底层网络层基于 netty,学完 netty 入门没有问题;
  2. 使用自定义注解,学完可以了解注解的基本运行机制;
  3. 服务注册基于 zookeeper,学完 zk 入门没有问题;
  4. 会用到反射机制;
  5. 会用到动态代理技术;
  6. 教你如何定义一个 xxx-spring-boot-starter,了解spring boot自动配置机制;
  7. 学会如何自定义配置项,并绑定到 bean;
  8. 学习监听 spring 容器的事件;
  9. ……等等

有没有一点心动呢?!

项目源代码

学习的框架项目源代码我已经全部托管到 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);@ServiceReferenceprivate 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

耗时两周手撸了一个 RPC 轮子,是驴子是马拉出来遛遛相关推荐

  1. 手撸的一个快递查询系统,竟然阅读量过1.8w

    一.目的 做这个项目的初衷是因为我去年在微信卖老家水果,好多朋友下单后都问我快递单号,每天发货后我都要挨个甄别这个人是哪个快递信息,很麻烦一部小心就搞错了.基于这件小事我有了自助快递查询的这个想法.将 ...

  2. 99%的程序员都在用Lombok,原理竟然这么简单?我也手撸了一个!|建议收藏

    世界上只有一种英雄主义,就是看清生活的真相之后依然热爱生活. 对于 Lombok 我相信大部分人都不陌生,但对于它的实现原理以及缺点却鲜为人知,而本文将会从 Lombok 的原理出发,手撸一个简易版的 ...

  3. 99%的程序员都在用Lombok,原理竟然这么简单?我也手撸了一个!|建议收藏!!!...

    世界上只有一种英雄主义,就是看清生活的真相之后依然热爱生活. 对于 Lombok 我相信大部分人都不陌生,但对于它的实现原理以及缺点却鲜为人知,而本文将会从 Lombok 的原理出发,手撸一个简易版的 ...

  4. 我手撸了一个划线翻译工具!

    来源 :https://yuanlehome.github.io/20200612/ 这里将要介绍的是一种在 Linux 平台实现的划词翻译工具,当然在考虑自己实现一个如此功能的工具前,本人也是在网上 ...

  5. 99%的程序员都在用Lombok,原理竟然这么简单?我也手撸了一个!

    世界上只有一种英雄主义,就是看清生活的真相之后依然热爱生活. 对于 Lombok 我相信大部分人都不陌生,但对于它的实现原理以及缺点却鲜为人知,而本文将会从 Lombok 的原理出发,手撸一个简易版的 ...

  6. 耗时两周的P2PQQ终于完成了!!!

    头几天,一时兴起,想在linux下做一个基于p2p的通讯软件,于是利用了假期最后的两周,经过努力奋斗,终于取得阶段性的结束,虽然还有一些细节需要修改,但是整体的代码已经写完了.改好好休息了,这一段,几 ...

  7. 【编程实践】为了带你搞懂RPC,我们手写了一个RPC框架

    如今分布式系统大行其道的年代,RPC 有着举足轻重的地位.风靡的 Duboo.Thrift.gRpc 等框架各领风骚,深入了解RPC是新手也是老鸟的必修课.你知道 RPC 的实现原理吗?想动手实现一个 ...

  8. 向高手进阶,从 0 开始手写实现一个 RPC 框架!

    前言 在实际后台服务开发中,比如订单服务(开发者A负责)需要调用商品服务(开发者B负责),那么开发者B会和A约定调用API,以接口的形式提供给A.通常都是B把API上传到Maven私服,然后B开始写A ...

  9. spring 数组中随机取几个_准备几个月,面试阿里耗时两周,最终凭借这些知识拿下阿里offer...

    朋友去阿里进行的技术面,历经了二个多小时,面试的是Java开发工程师,出来后立马拿手机记录了面试问的知识点,知识点包括Java基础和高级.spring.多线程.网络.数据库.算法.Redis.分布式. ...

最新文章

  1. c#.net配置mysql数据库连接池_C#MySQL连接池
  2. Xen虚拟机迁移技术
  3. Codeforces 1480B. The Great Hero(阅读模拟题,注意数据范围和攻击顺序)
  4. 【caffe-Windows】cifar实例编译之model的生成
  5. kafka java api 删除_使用Java API创建(create),查看(describe),列举(list),删除(delete)Kafka主题(Topic)...
  6. 95-170-044-源码-Time-flink时间Processing Time源码分析
  7. Windows 无法删除文件夹的只读
  8. 内推| 阿里全球化分析师战队集结令
  9. 小甲鱼 P61 IO缓冲区
  10. python read_csv chunk_Python chunk读取超大文件
  11. HDOJ:1863畅通工程
  12. Vue 使用特殊字体
  13. springframework(九)AOP的advices,中规中矩的使用方式
  14. python基础:模块的使用——time使用——时间记录器实现
  15. Java中将汉语转成拼音的方法
  16. js笔记十:vscode代码提示(20211221补充)
  17. 看士兵突击 一、二集有感--------是单纯 OR 笨?
  18. 小白用户也能看懂的卷积神经网络5
  19. oracle12c命令行安装grid,oracle12c-RAC安装部署之GRID安装-grid设置
  20. 如何使Windows 10中的任务栏图标居中

热门文章

  1. 数组转这种格式 county_list:{ 110101: “东城区“, 110102: “西城区“, 110105: “朝阳区“, 110106: “丰台区“,
  2. build.gradle配置
  3. mysql 改列定义_如何更改MySQL列定义?
  4. 计算机鼠标不出现在电脑屏幕上,电脑一打开就这样了,台式的,电脑屏幕不出现鼠标,求大神帮助...
  5. 一种解决退出远程桌面后,电脑自动睡眠的方法
  6. Python自动化 | 通过键盘控制鼠标来玩赛尔号
  7. 借助MATLAB与SIMULINK仿真嵌入式C算法
  8. 支付宝 二维码/账号/转账码/生成方式/生成不可修改金额码
  9. iOS小技能:短信验证码的Checklist、格式校验、获取验证码处理流程(限制60s)
  10. 《巴黎评论》启示录连载之一村上春树