美文网首页
我动手写了一个mini版Dubbo RPC框架

我动手写了一个mini版Dubbo RPC框架

作者: Java架构奶思 | 来源:发表于2022-02-23 15:48 被阅读0次

    当当当,这几天给大家承诺的 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 中了,大家可以随意去下载,全部免费供大家白嫖,哈哈哈,方便的话 关注一下就是感恩了~


    好了,下面基于源码演示一下效果,继续往下看~

    快速开始

    环境准备

    • 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 项目感兴趣,或者你遇到问题了,或者你想进群跟其他小伙伴一起交流,都非常欢迎联系我,后台回复关键字:rpc

    原文:https://mp.weixin.qq.com/s/yqCv53O6A7RRH0Hs1lCKuQ

    相关文章

      网友评论

          本文标题:我动手写了一个mini版Dubbo RPC框架

          本文链接:https://www.haomeiwen.com/subject/yrwclrtx.html