前言

上一篇文章中我们已经知道了什么是 RPC 框架和为什么要做一个 RPC 框架了,这一章我们来从宏观上分析,怎么来实现一个 RPC 框架,这个框架都有那些模块以及这些模块的作用。

总体设计

在我们的整个框架里比较重要的几个模块:
rpc-procotol: 既然是可插拔是框架,我们需要支持选择底层协议,这部分是通信协议相关的模块。
rpc-spring: 我们的框架是基于 spring 开发的,这个模块是将我们的一些功能和 spring 整合起来,比如自动注入代理 bean,启动服务端 server 等等。
rpc-register: 注册中心模块,负责服务发现和容错。
rpc-monitor: 将注册中心的信息显示在网页上。
rpc-consumer: 消费端模块,用于测试。
rpc-provider: 服务端模块,用于测试。

  1. 注册中心模块
    对于注册中心来说,可以选择 zookeeper 和 redis,我们只实现了 zookeeper,redis 希望有能力的同学可以在 github 上完善。
    我们在使用 RPC 框架时,服务提供者和服务消费者都需要把自己注册进去,服务消费者可以将服务提供者的信息缓存到本地,通过注册节点删除的回调方法来去掉不可用的服务。
    注册中心代理了我们写 http 请求时手动写地址的功能,帮我们自动找到可用的服务。
  2. 网络协议模块
    服务消费端需要使用接口代理类的 invoke 方法将请求发给服务提供者的 RPC server(双方已经建立好了连接),RPC server 在死循环中一直等待接受请求,收到请求后调用本地的接口实现类进行处理,最后返回结
    果给服务调用端,这样就完成了一个 RPC 服务调用的过程。
    RPC 底层网络通信协议包括三个实现,netty 实现的客户端和服务端,http + Tomcat 实现的客户端和服务端,最后时 Socket 实现的客户端和服务端(性能比较低,编程练习使用)。
  3. 整合 Spring 模块
    我们整个框架是和 Spring 整合在一起的,我们在 Spring 中自定义的一些注解(类似与 Dubbo),自动为接口成代理类并注入到了 Spring 容器中,在代码中使用 @Autowired 自动注入即可使用。RPC server 的启动也要依靠 Spring 来帮我们完成。
  4. 监控模块
    通过这个模块可以查看所有服务的状态以及接口调用的相关信息。
  5. 测试模块
    rpc-provider 和 rpc-consumer 都是测试类,方便于我们对代码进行测试。

效果展示

我们先提前来看看最后最后的效果,首先说明,性能表现测试根据不同的机器和不同的网络环境可能会有所不同,下面的测试结果是基于我自己的机器的。 我的电脑最多起 2000 个并发线程,多了就 OOM 了,在公司的电脑尝试过起 10000 个并发线程,没有任何问题,下面看 2000 个并发线程的表现。

测试类

    public static void main(String[] args) throws Exception {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("rpc.xml");//并行度10000int parallel = 2000;//开始计时long a1 = System.currentTimeMillis();CountDownLatch signal = new CountDownLatch(1);CountDownLatch finish = new CountDownLatch(parallel);for (int index = 0; index < parallel; index++) {CalcParallelRequestThread client = new CalcParallelRequestThread(signal, finish, index,applicationContext);new Thread(client).start();}//n个并发线程瞬间发起请求操作signal.countDown();finish.await();long a2 = System.currentTimeMillis();String tip = String.format("RPC调用总共耗时: [%s] 毫秒", a2 - a1);System.out.println(tip);}

2000 并发 1秒多,还是比较快的。感兴趣的可以试试在自己的电脑起 1w 或者 10w 加线程测试一下。

转载于:https://www.cnblogs.com/paulwang92115/p/11116929.html

带你手写基于 Spring 的可插拔式 RPC 框架(二)整体结构相关推荐

  1. 带你手写基于 Spring 的可插拔式 RPC 框架(四)代理类的注入与服务启动

    上一章节我们已经实现了从客户端往服务端发送数据并且通过反射方法调用服务端的实现类最后返回给客户端的底层协议. 这一章节我们来实现客户端代理类的注入. 承接上一章,我们实现了多个底层协议,procoto ...

  2. 手把手带你手写SpringMVC,剑指优秀开源框架灵魂

    劲爆福利!! 只需要1块钱,就可以获得一门课. 简直就是白送有木有?! 这门课就是慕课网出品的微课: 仅需2小时 手写MINI Spring MVC框架 Java程序员对Spring MVC这个名字都 ...

  3. 手写基于Spring Cloud的TCC分布式事务框架

    如何简单实现TCC分布式事务框架 最近听到很多其他公司的小伙伴谈分布式事务的问题,各种业务场景都有,可能就是这两年很多公司都在往微服务发展,现在各个子系统都拆分.建设的差不多了,实现了模块化开发,但是 ...

  4. tomcat配置url跳转_架构成长之路:还不清楚原理就晚了,Java技术大咖带你手写Tomcat...

    推荐阅读 手把手教你手写SpringMVC,剑指优秀开源框架灵魂 纯手写实现高可用的RPC框架,Java架构师必备技能 前言 Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打 ...

  5. spring源码分析01-(前期准备)spring核心原理解析和手写简易spring

    1.本文主要介绍内容 本文会把Spring中核心知识点大概解释下.可以对Spring的底层有一个整体的大致了解.主要内容包括: 手写简易spring框架,帮助更好理解spring. 代码点击链接自取 ...

  6. BP神经网络实现手写数字识别Python实现,带GUI手写画板

    BP神经网络实现手写数字识别 BP神经网络模型 用tkinter编写用于手写输入的画板 程序运行的效果截图 在B站看了一个机器学习基础的视频( 链接)后,发现到资料里面有一个用BP神经网络对手写数字进 ...

  7. 手写实现Spring(IOC、DI),SpringMVC基础功能

    手写实现Spring(IOC.DI),SpringMVC功能 spring和springMVC的用法相信大家都不陌生,我简单讲下我实现的思路 spring阶段 事项 配置 配置web.xml: ini ...

  8. 从 0 开始手写一个 Spring MVC 框架,向高手进阶

    转载自   从 0 开始手写一个 Spring MVC 框架,向高手进阶 Spring框架对于Java后端程序员来说再熟悉不过了,以前只知道它用的反射实现的,但了解之后才知道有很多巧妙的设计在里面.如 ...

  9. 自己手写一个Spring MVC框架

    想要了解Spring MVC框架的原理,探究框架是如何设计的,不错的学习方式是阅读源码,然后自己手写一个框架.本文带领大家简化的手写一个Spring MVC框架. Spring框架对于Java后端程序 ...

最新文章

  1. 怎么证明正态分布积分结果为1?I^2是什么意思 (极坐标 分部积分法 雅可比行列式在积分坐标变换中 )
  2. DAY2-python基础1
  3. 找不到暑期实习怎么办?
  4. 网站数据库中“密码加密”方法思考
  5. SpringCloud整合nacos服务时无法发现服务
  6. 奥林匹克公园的《老北京四重奏》
  7. 参考TinyOS官方网站实现BlinkToRadio
  8. windows服务与其他进程使用MemoryMappedFile
  9. python从入门到精通需要多久-python从入门到精通需要多久?你需要先明白这两个点...
  10. 51cto,一个创造能让IT人员成长的论坛
  11. 【翻译】Adaptive Convolutions for Structure-Aware Style Transfer
  12. 企业微信再进化:打通视频号上线微信客服,丰富人即服务理念
  13. 苹果8a1660是什么版本_苹果a1780是什么版本
  14. 为什么手机浏览器打不开html文件,手机浏览器打不开网页的解决方法
  15. win10镜像文件能直接安装吗
  16. 平面设计必须知道的尺寸列表
  17. 剑指Offer-22反转链表
  18. Database connections will be migrated
  19. Java 实现位运算计算加减乘除
  20. 关于git提交报错Please tell me who you are.

热门文章

  1. 构筑你的本地资料库——ScrapBook
  2. Web Components 简述
  3. Hive On Tez,Tez 和 MapReduce engine 性能对比
  4. insertionSortList
  5. 我所理解的OOP——UML六种关系
  6. 从 Domino 7.x 升级到 Domino 8.0.1 后服务器性能下降
  7. 支付宝技术风险负责人陈亮:把事情做到极致,技术的差异性才会体现出来
  8. vue全家桶+Koa2开发笔记(5)--nuxt
  9. 贴现率 vs 折现率
  10. jquery如何判断div是否隐藏