带你手写基于 Spring 的可插拔式 RPC 框架(二)整体结构
前言
上一篇文章中我们已经知道了什么是 RPC 框架和为什么要做一个 RPC 框架了,这一章我们来从宏观上分析,怎么来实现一个 RPC 框架,这个框架都有那些模块以及这些模块的作用。
总体设计

在我们的整个框架里比较重要的几个模块:
rpc-procotol: 既然是可插拔是框架,我们需要支持选择底层协议,这部分是通信协议相关的模块。
rpc-spring: 我们的框架是基于 spring 开发的,这个模块是将我们的一些功能和 spring 整合起来,比如自动注入代理 bean,启动服务端 server 等等。
rpc-register: 注册中心模块,负责服务发现和容错。
rpc-monitor: 将注册中心的信息显示在网页上。
rpc-consumer: 消费端模块,用于测试。
rpc-provider: 服务端模块,用于测试。
- 注册中心模块
对于注册中心来说,可以选择 zookeeper 和 redis,我们只实现了 zookeeper,redis 希望有能力的同学可以在 github 上完善。
我们在使用 RPC 框架时,服务提供者和服务消费者都需要把自己注册进去,服务消费者可以将服务提供者的信息缓存到本地,通过注册节点删除的回调方法来去掉不可用的服务。
注册中心代理了我们写 http 请求时手动写地址的功能,帮我们自动找到可用的服务。 - 网络协议模块
服务消费端需要使用接口代理类的 invoke 方法将请求发给服务提供者的 RPC server(双方已经建立好了连接),RPC server 在死循环中一直等待接受请求,收到请求后调用本地的接口实现类进行处理,最后返回结
果给服务调用端,这样就完成了一个 RPC 服务调用的过程。
RPC 底层网络通信协议包括三个实现,netty 实现的客户端和服务端,http + Tomcat 实现的客户端和服务端,最后时 Socket 实现的客户端和服务端(性能比较低,编程练习使用)。 - 整合 Spring 模块
我们整个框架是和 Spring 整合在一起的,我们在 Spring 中自定义的一些注解(类似与 Dubbo),自动为接口成代理类并注入到了 Spring 容器中,在代码中使用 @Autowired 自动注入即可使用。RPC server 的启动也要依靠 Spring 来帮我们完成。 - 监控模块
通过这个模块可以查看所有服务的状态以及接口调用的相关信息。 - 测试模块
rpc-provider 和 rpc-consumer 都是测试类,方便于我们对代码进行测试。
效果展示
我们先提前来看看最后最后的效果,首先说明,性能表现测试根据不同的机器和不同的网络环境可能会有所不同,下面的测试结果是基于我自己的机器的。 我的电脑最多起 2000 个并发线程,多了就 OOM 了,在公司的电脑尝试过起 10000 个并发线程,没有任何问题,下面看 2000 个并发线程的表现。
测试类
public static void main(String[] args) throws Exception {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("rpc.xml");
//并行度10000
int 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 加线程测试一下。
带你手写基于 Spring 的可插拔式 RPC 框架(二)整体结构的更多相关文章
- 带你手写基于 Spring 的可插拔式 RPC 框架(一)介绍
概述 首先这篇文章是要带大家来实现一个框架,听到框架大家可能会觉得非常高大上,其实这和我们平时写业务员代码没什么区别,但是框架是要给别人使用的,所以我们要换位思考,怎么才能让别人用着舒服,怎么样才能让 ...
- 带你手写基于 Spring 的可插拔式 RPC 框架(五)注册中心
注册中心代码使用 zookeeper 实现,我们通过图片来看看我们注册中心的架构. 首先说明, zookeeper 的实现思路和代码是参考架构探险这本书上的,另外在 github 和我前面配置文件中的 ...
- 带你手写基于 Spring 的可插拔式 RPC 框架(三)通信协议模块
在写代码之前我们先要想清楚几个问题. 我们的框架到底要实现什么功能? 我们要实现一个远程调用的 RPC 协议. 最终实现效果是什么样的? 我们能像调用本地服务一样调用远程的服务. 怎样实现上面的效果? ...
- 带你手写基于 Spring 的可插拔式 RPC 框架(四)代理类的注入与服务启动
上一章节我们已经实现了从客户端往服务端发送数据并且通过反射方法调用服务端的实现类最后返回给客户端的底层协议. 这一章节我们来实现客户端代理类的注入. 承接上一章,我们实现了多个底层协议,procoto ...
- C基础 带你手写 redis sds
前言 - Simple Dynamic Strings antirez 想统一 Redis,Disque,Hiredis 项目中 SDS 代码, 因此构建了这个项目 https://github.c ...
- C基础 带你手写 redis adlist 双向链表
引言 - 导航栏目 有些朋友可能对 redis 充满着数不尽的求知欲, 也许是 redis 属于工作, 交流(面试)的大头戏, 不得不 ... 而自己当下对于 redis 只是停留在会用层面, 细节层 ...
- 第二篇 基于.net搭建热插拔式web框架(沙箱的构建)
上周五写了一个实现原理篇,在评论中看到有朋友也遇到了我的问题,真的是有种他乡遇知己的感觉,整个系列我一定会坚持写完,并在最后把代码开源到git中.上一篇文章很多人看了以后,都表示不解,觉得不知道我到底 ...
- 第三篇 基于.net搭建热插拔式web框架(重造Controller)
由于.net MVC 的controller 依赖于HttpContext,而我们在上一篇中的沙箱模式已经把一次http请求转换为反射调用,并且http上下文不支持跨域,所以我们要重造一个contro ...
- 基于Protobuf的分布式高性能RPC框架——Navi-Pbrpc
基于Protobuf的分布式高性能RPC框架——Navi-Pbrpc 二月 8, 2016 1 简介 Navi-pbrpc框架是一个高性能的远程调用RPC框架,使用netty4技术提供非阻塞.异步.全 ...
随机推荐
- PRIMARY KEY,key,unique key
主键索引(必须指定为“PRIMARY KEY”,没有PRIMARY Index). 唯一索引(unique index,一般写成unique key). 普通索引(index,只有这一种才是纯粹的in ...
- junit3和junit4的使用区别如下
junit3和junit4的使用区别如下1.在JUnit3中需要继承TestCase类,但在JUnit4中已经不需要继承TestCase2.在JUnit3中需要覆盖TestCase中的setUp和te ...
- P3979 遥远的国度 树剖
P3979 遥远的国度 树剖 题面 需要想一下的树剖题,对于询问三需要处理换跟后的情况.我们以1为树根跑一遍剖分,对于换跟进行分类讨论,算出实际答案.讨论有三种情况: (以1为树根的树上) 跟在询问节 ...
- openstack 无法创建新虚拟机报错 openstack报错:Host is not mapped to any cell
关联错误提示:Host is not mapped to any cell 控制节点上执行: root@ubsv:/home/makeit# nova-manage cell_v2 discover_ ...
- cdh版hbase构建Phoenix 遇到的坑
Phoenix 构建cdh版hbase遇到的坑 1. 安装phoenix 下载:在github上下载对应版本https://github.com/apache/phoenix 解压:略 编译: 修改根 ...
- python-selenium视频教程分享
1.python电子书 2.课件 3.前段调试工具 4.文档资料 5.python-selenium课程列表 6.sele01-sele22 百度网盘连接:链接: https://pan.baidu. ...
- 十八、centos7网络属性配置
一.为什么需要这个 服务器通常有多块网卡,有板载集成的,同时也有插在PCIe插槽的.Linux系统的命名原来是eth0,eth1这样的形式,但是这个编号往往不一定准确对应网卡接口的物理顺序.为解决这类 ...
- Spring框架AOP
aop技术是面向切面编程思想,作为OOP的延续思想添加到企业开发中,用于弥补OOP开发过程中的缺陷而提出的编程思想.AOP底层也是面向对象:只不过面向的不是普通的Object对象,而是特殊的AOP对象 ...
- JAVA-Thread 线程的几种状态
Oracle JDK 定义中,线程一共有六种状态 https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.State.html NEW:未 ...
- mysql 误删除所有用户或者忘记root密码
/etc/init.d/mysqld stop //停止数据库/etc/init.d/mysqld restart //启动数据库(1)开启特殊启动模式mysqld_safe --skip-grant ...