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

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 耗时两周手撸了一个 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 一下就是感恩了~

image.png

项目的源代码地址统一放在公众号后台管理。微信搜索公众号:爱笑的架构师,回复关键字即可: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 工程

在本地新建两个工程,用于模拟客户端和服务端。

image.png


引入依赖

<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 为了暴露服务接口。

image.png

# 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);
    }
}


出现下面的日志,说明启动成功

image.png


运行客户端(服务消费者)

/**
 * 服务消费者启动入口
 * 
 * @author 雷小帅(公众号:爱笑的架构师)
 * @since 2021/12/01
 */
@SpringBootApplication
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
}

出现下面的日志,说明启动成功

image.png


测试

使用浏览器输入请求地址测试:

http://127.0.0.1:8081/hello/输入测试字符串

返回下面的字符串就说明运行成功

image.png

FAQ


1、zookeeper 连接失败

image.png

解决方法:

(1)在本地机器或者在服务器上安装运行 zookeeper 实例;

(2)在配置文件中正确配置 zookeeper 地址;


下一步计划


后面会分多篇文章详细讲解框架项目的源码,讲一讲设计思想,这个简单的 rpc 学会了,dubbo 框架你也有办法拿下了。

如果你对从零开始手写 RPC 项目感兴趣,欢迎去 Github 上下载源码试用:

https://github.com/CoderLeixiaoshuai/easy-rpc


相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
7月前
|
设计模式 缓存 算法
花了30天才肝出来,史上最全面Java设计模式总结,看完再也不会忘
Design Patterns: Elements of Reusable Object-Oriented Software(以下简称《设计模式》),一书由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides合著(Addison-Wesley,1995)。这四位作者常被称为“四人组(Gang of Four)”,而这本书也就被称为“四人组(或 GoF)”书。他们首次给我们总结出一套软件开发可以反复使用的经验,帮助我们提高代码的可重用性、系统的可维护性等,解决软件开发中的复杂问题。
103 0
|
12月前
|
XML 编解码 Java
我终于决定要放弃 okhttp、httpClient,选择了这个牛逼的神仙工具!贼爽! 上
我终于决定要放弃 okhttp、httpClient,选择了这个牛逼的神仙工具!贼爽! 上
|
11月前
|
消息中间件 JavaScript 小程序
以为很熟悉 CountDownLatch,万万没想到在生产环境翻车了.....
以为很熟悉 CountDownLatch,万万没想到在生产环境翻车了.....
|
数据采集 JavaScript Java
手撸了一个java爬虫,发现了c站这么多大佬
手撸了一个java爬虫,发现了c站这么多大佬
196 0
手撸了一个java爬虫,发现了c站这么多大佬
|
前端开发 网络协议 jenkins
三分钟,我让搞后端的学弟爱上了Eolink
突然某一天,一个特别能卷的学弟向我请教接口工具……
三分钟,我让搞后端的学弟爱上了Eolink
|
JavaScript 前端开发 程序员
巧用NodeJs帮老板解决个人需求!老板娘直呼:"牛!niu!🐂!"
大家好,我是HoMeTown 继上次用Js+Css给Boss秀完肌肉💪🏻,打出组合拳之后,(#敢在我工位装摄像头?吃我一套JS ➕ CSS组合拳!!👊🏻),今天是老板奖励我连续工作的第7/31天,不过就在今天,这个糟糕的事情终于赢来了新的转机,老板有了一个大不大,小不小的个人需求想让我看能不能写一段脚本,帮他度过难关,听完之后,我觉得是时候拿回作为程序员的尊严!展示一把真正的肌肉💪🏻了(破音~~~!)。
134 0
|
SpringCloudAlibaba 中间件 微服务
手撸RPC真的有那么难吗?
大家好,我是冰河~~ 最近,在冰河的星球群里有些小伙伴发了一张截图,大体意思就是有些小伙伴在面试时,简历上写了自己开发了RPC框架,但是在面试的过程中,面试官顺着这个RPC框架问了小伙伴们一些基础的知识点问题,结果大家都没回答上来。
391 0
手撸RPC真的有那么难吗?
|
XML 编解码 Java
我终于决定要放弃 okhttp、httpClient,选择了这个神仙工具!贼爽(二)
我终于决定要放弃 okhttp、httpClient,选择了这个神仙工具!贼爽(二)
|
开发框架 安全 Java
我终于决定要放弃 okhttp、httpClient,选择了这个神仙工具!贼爽(一)
我终于决定要放弃 okhttp、httpClient,选择了这个神仙工具!贼爽
|
人工智能 负载均衡 算法
手撸一款简单高效的线程池(四)
在前几章的内容中,我们给大家介绍了一些 C++线程池中的优化思路和实现方案。这一章中,我们来聊一聊在编程实现过程中,一些工程层面的优化。让我们的代码执行的速度,跟得上自己的思路。
213 0
手撸一款简单高效的线程池(四)