`
bianhao92115
  • 浏览: 2206 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

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

阅读更多

前言

上一篇文章中我们已经知道了什么是 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 个并发线程的表现。

测试类

Copy
    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 加线程测试一下。

分享到:
评论

相关推荐

    Netty4.1实战-手写RPC框架.pdf

    RPC是一种远程调用的通信协议,例如dubbo、thrift等,我们在互联网高并发应用开发时候都会使用到类似的服务。本专题主要通过三个章节实现一个rpc...- 手写RPC框架第二章《netty通信》 - 手写RPC框架第三章《RPC中间件》

    基于netty的手写rpc框架

    在本项目中,我们将基于Netty实现一个手写的RPC框架。Netty是Java领域的一个高性能、异步事件驱动的网络应用程序框架,常用于构建高效的服务器和客户端。 首先,我们需要理解RPC框架的基本组成部分: 1. **服务...

    springIOC手写框架分析

    springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC...

    基于Netty4核心原理的Java手写RPC框架设计源码

    本项目为《Netty4核心原理与手写RPC框架实战》一书的配套代码示例工程,涵盖223个文件,主要包括63个Java源文件、130个GIF图片、7个XML配置文件、4个PNG图片、4个JPG图片、3个Shell脚本、3个JavaScript文件、2个属性...

    java 手写rpc框架 rpc-server and rpc-client

    在这个Java手写RPC框架的项目中,我们主要关注两个核心部分:`rpc-server`和`rpc-client`。 ### 1. RPC服务器(rpc-server) `rpc-server`是RPC框架的提供者端,它承载了服务的实现并对外发布。以下是一些关键知识...

    手写RPC框架代码(带注释)

    框架是Netty,代码主要分为 provider registry protocol和consumer等。 实现本地调用LPC和远程调用RPC,对比了二者的速度。 RPC部分代码参考书籍:《Netty4核心原理与手写rpc实战》

    Java使用传统socket手写的远程RPC框架调用框架

    通过以上介绍,我们可以看到这个基于Java Socket的手写RPC框架是如何利用核心概念实现远程服务调用的。它简化了分布式系统间的通信,提高了开发效率。然而,实际生产环境中,为了提高性能、稳定性和可扩展性,我们...

    手写rpc rpc简单源码 rpc源码学习 rpc过程了解 rpc通信原理

    下面将详细解释RPC的核心概念、工作原理以及手写RPC的基本流程。 一、RPC核心概念 1. **客户端(Client)**:发起RPC调用的一方,它通常需要知道服务接口和方法,但不需要关心服务是如何实现的。 2. **服务端...

    手写RPC框架1

    本文将探讨手写RPC框架的一些核心概念和组件。 首先,RPC架构的核心是网络传输。在实现RPC时,我们需要设计一个能够发送网络请求的机制,将目标类、方法信息以及参数从客户端传输到服务端。常见的网络传输库有BIO...

    手写RPC框架Feign

    Feign是Netflix公司开源的一款声明式、基于HTTP的RPC(远程过程调用)客户端框架,它使得编写Web服务客户端变得更加简单。Feign的设计理念是通过简单的接口定义来封装服务调用,让开发者能够专注于业务逻辑,而不是...

    手写RPC框架V1.zip

    本资源“手写RPC框架V1.zip”提供了作者手动实现的一个RPC框架的源代码,包括`rpc-server`和`rpc-client`两个部分,便于学习者深入理解RPC的工作原理。 ### RPC框架概述 RPC框架的核心目标是简化分布式系统间的通信...

    02-01-11-基于Spring JDBC手写定制自己的ORM框架1

    在本课程"02-01-11-基于Spring JDBC手写定制自己的ORM框架1"中,我们将探讨如何利用Spring的JdbcTemplate设计理念,来构建一个自定义的ORM(对象关系映射)框架。ORM框架的主要目的是简化Java应用程序与数据库之间的...

    基于Netty4核心原理的RPC框架设计源码工程

    该项目是《Netty4核心原理与手写RPC框架实战》一书的配套代码示例工程,由223个文件构成,其中Java源代码63个,GIF图像130个,XML配置7个,PNG图片4个,JPG图片4个,Shell脚本3个,JavaScript和CSS各3个,批处理文件...

    基于Java的MyRPCFromZero手写RPC框架设计与实现源码解析

    该项目为基于Java语言的MyRPCFromZero RPC框架,精心设计了344个文件,涵盖179个类文件、153个Java源文件、6个XML配置文件、2个属性文件,以及必要的Git忽略和LICENSE文件等。旨在从零开始,逐步解析并实现一个易于...

    基于spring+springMvc+mybatis 开发的企业门户网站

    在手写Spring 源码的过程中会摘取整体框架中的核心逻辑,简化代码实现过程保留核心功能,例如:I0C、AOP、Bean生命周期、上下文、作用域、资源处理等内容实现。 能学到什么:①工厂模式、策略模式、观察者模式等都是...

    手写spring框架(仿真版)

    通过对spring框架的理解和学习,手写一套属于自己的spring框架。这里面只是一个最简单的方式,真正的spring比这复杂的多。这里只是帮助喜欢spring的同学,对spring有个更深的理解和学习。

    基于Java语言的手写Spring、Mybatis框架及数据结构设计源码项目

    本项目为基于Java语言开发的手写Spring和Mybatis框架,并融入了数据结构设计,包含共计220个文件,其中Java源文件194个,HTML文件7个,Gradle文件6个,XML文件4个,文本文件2个,Git忽略文件1个,LICENSE文件1个,...

    仿 Spring 手写 IoC、AOP 框架.rar

    本教程将带你深入理解这两个概念,并通过手写一个简易的IoC和AOP框架来加深理解。 **依赖注入(IoC)** 依赖注入是Spring的核心特性之一,它允许开发者将对象的创建和管理权交给框架,从而降低组件之间的耦合度。在...

    手写rpc的项目

    本文将详细介绍手写RPC框架的基本原理,并提供相关知识点。 首先,了解RPC的基本概念。RPC使得客户端可以调用服务器上的方法,而无需知道底层网络协议或细节。这个过程通常包括以下步骤: 1. **序列化与反序列化**...

Global site tag (gtag.js) - Google Analytics