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

带你手写基于 Spring 的可插拔式 RPC 框架(一)介绍

阅读更多

概述

首先这篇文章是要带大家来实现一个框架,听到框架大家可能会觉得非常高大上,其实这和我们平时写业务员代码没什么区别,但是框架是要给别人使用的,所以我们要换位思考,怎么才能让别人用着舒服,怎么样才能让我们的框架性能优异。通过自己写一个框架,我们能学到的有很多,能让我们脱离 CURD,在更高的层面上去思考。

目的

写这个框架最主要的目的是要让大家了解整个框架的设计思想和用到的技术,并不是让大家关注代码,当然我实现的代码一定不是完美的,还有很多需要改进的地方,希望大家不吝赐教,一起进步。

提前准备

如果把所有细节给大家讲清楚,那完全可以出一本书了。我们的文章当然也会将细节,不过希望大家有一些知识储备,这样我们才能重点去关注设计思想,了解如何去设计这个 RPC 框架,把自己想不通的地方给想明白了。

提前学习的知识

  1. Netty 框架,希望大家对这个框架有个基础的了解,能够编写简单的客户端服务端通信的 Demo,如果没学过可以临时补一下。传送门->Netty
  2. 动态代理,其实不仅仅是动态代理,基本的设计模式是每个程序员必备的,而动态代理使用的又非常广泛,大家至少要对动态代理的概念有所了解。
  3. Dubbo 的使用经历,如果你用过 Dubbo 的话对于理解我们接下来的文章有很大的帮助。

解决了什么问题

这个框架到底解决了什么问题?我们在什么场景下需要使用这个框架那?我们先来了解一个概念。
微服务架构
微服务架构旨在将原来传统的单体的 web 程序进行解耦,按功能进行划分,将原来的大应用拆分成一个一个小的服务。这样很大程度上提高了整个系统的可伸缩行,可以高效的应对各种各样的并发和数据压力。
来看官方定义:
1、一些由独立的服务共同组成系统
2、单独部署,跑在自己的进程中
3、每个服务为独立的业务开发
4、分布式管理
5、非常强调隔离性

微服务已经成为目前互联网公司的标配了,使用微服务时我们需要思考一个问题,原来是在一个程序内,现在被拆分成不同的程序,而且很有可能部署在不同的服务器上。那么服务之间如何通信那?

RPC
RPC 是一种远程调用协议,他可以高效准确的完成服务之间的相互调用,而且最重要的是用户不需要关心 RPC 协议的底层实现,网络传输使用 Http,Netty,还是 Socket 都可以。
有人可能会有疑问,我用 http 请求,里面写上目标的 ip,端口,加上参数不是也能调用服务并且返回数据吗?为什么要引入 RPC 这个概念那?

如果你能思考到这,说明你已经很厉害了,懂得在使用工具时思考为什么。
对于直接使用 http 请求来说,适合接口较少,服务之间相互调用不多的情况,而且需要指定地址,端口等等信息。优点就是简单直接,但是无法应对高并发以及复杂服务交互的情况。
RPC 就是为了解决上面的问题而生的,首先用户只需要调用服务即可,连接和发送数据交给底层协议去完成,另外对于高并发支持非常好,另外提供服务治理,注册中心等功能。适合大型网站,服务复杂,高并发的情况。

从一个点看 RPC 的架构
使用过 Dubbo 等 RPC 框架的应该知道,我们可以像调用本地方法一样调用另一个服务器上的服务,有的人可能不明白这句话时什么意思,代码演示一下。

UserService 是另一个服务器上的服务,我们可以像调用本地方法一样调用,不用管底层协议,不够用管 UserService 在哪个服务器上。

Copy
UserService userService = ProxyFactory.getProxy(UserService.class);
User user = userService.get("11112");

那么我们是如何把在另外一个服务器上的服务拿到我们本地来的那?有人看上面的 ProxyFactory 可能就已经猜出来了,使用的是动态代理,我们在本地获取到了接口的代理类,在 invoke 方法中将参数传给对应的服务,服务端在接收到数据后,使用反射调用对应的实现类,完成处理后将结果返回给调用端。

如果你不明白上面的解释,我们用一张图来解释这个过程:

简单点说,RPC 帮我们把对应的请求发过去,服务端有一个服务器一直接收这种请求,收到数据后调用服务对应的处理方法处理后返回给调用端。

 

 

分享到:
评论

相关推荐

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

    RPC是一种远程调用的通信协议,例如dubbo、thrift等,我们在互联网高并发应用开发时候都会使用到类似的...- 手写RPC框架第一章《自定义配置xml》 - 手写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框架涉及了网络编程、序列化、多线程、服务治理等多个领域的知识,是一个很好的学习和实践分布式系统设计的平台。通过这个项目,开发者不仅可以提升技术水平,还能对分布式系统的运行机制有更...

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

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

    手写RPC框架Feign

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

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

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

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

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

    手写RPC框架1

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

    手写RPC框架V1.zip

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

    基于Python和PyTorch框架完成的一个手写数字识别实验源码(带MNIST手写数字数据集).zip

    基于Python和PyTorch框架完成的一个手写数字识别实验源码(带MNIST手写数字数据集).zip 基于Python和PyTorch框架完成的一个手写数字识别实验源码(带MNIST手写数字数据集).zip 基于Python和PyTorch框架完成的一个手写...

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

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

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

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

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

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

    手写rpc的项目

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

    手写spring框架(仿真版)

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

    仿 Spring 手写 IoC、AOP 框架.rar

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

    从零开始手写 dubbo rpc 框架-12-generic泛化调用.pdf

    Dubbo RPC 框架是一种基于 Netty 实现的 Java RPC 框架,主要用于个人学习和理解 RPC 底层实现原理。本文将详细介绍 Dubbo RPC 框架中的 Generic 调用机制。 Generic 调用机制是 Dubbo RPC 框架中的一种泛化调用...

Global site tag (gtag.js) - Google Analytics