带你手写基于 Spring 的可插拔式 RPC 框架(一)介绍
目录:
带你手写基于 Spring 的可插拔式 RPC 框架(一)介绍
带你手写基于 Spring 的可插拔式 RPC 框架(二)整体结构
带你手写基于 Spring 的可插拔式 RPC 框架(三)通信协议模块
带你手写基于 Spring 的可插拔式 RPC 框架(四)代理类的注入与服务启动
带你手写基于 Spring 的可插拔式 RPC 框架(五)注册中心
源码在第五篇博客的末尾
概述
首先这篇文章是要带大家来实现一个框架,听到框架大家可能会觉得非常高大上,其实这和我们平时写业务员代码没什么区别,但是框架是要给别人使用的,所以我们要换位思考,怎么才能让别人用着舒服,怎么样才能让我们的框架性能优异。通过自己写一个框架,我们能学到的有很多,能让我们脱离 CURD,在更高的层面上去思考。
目的
写这个框架最主要的目的是要让大家了解整个框架的设计思想和用到的技术,并不是让大家关注代码,当然我实现的代码一定不是完美的,还有很多需要改进的地方,希望大家不吝赐教,一起进步。
提前准备
如果把所有细节给大家讲清楚,那完全可以出一本书了。我们的文章当然也会将细节,不过希望大家有一些知识储备,这样我们才能重点去关注设计思想,了解如何去设计这个 RPC 框架,把自己想不通的地方给想明白了。
提前学习的知识
- Netty 框架,希望大家对这个框架有个基础的了解,能够编写简单的客户端服务端通信的 Demo,如果没学过可以临时补一下。传送门->Netty
- 动态代理,其实不仅仅是动态代理,基本的设计模式是每个程序员必备的,而动态代理使用的又非常广泛,大家至少要对动态代理的概念有所了解。
- Dubbo 的使用经历,如果你用过 Dubbo 的话对于理解我们接下来的文章有很大的帮助。
解决了什么问题
这个框架到底解决了什么问题?我们在什么场景下需要使用这个框架那?我们先来了解一个概念。
微服务架构
微服务架构旨在将原来传统的单体的 web 程序进行解耦,按功能进行划分,将原来的大应用拆分成一个一个小的服务。这样很大程度上提高了整个系统的可伸缩行,可以高效的应对各种各样的并发和数据压力。
来看官方定义:
1、一些由独立的服务共同组成系统
2、单独部署,跑在自己的进程中
3、每个服务为独立的业务开发
4、分布式管理
5、非常强调隔离性
微服务已经成为目前互联网公司的标配了,使用微服务时我们需要思考一个问题,原来是在一个程序内,现在被拆分成不同的程序,而且很有可能部署在不同的服务器上。那么服务之间如何通信那?
RPC
RPC 是一种远程调用协议,他可以高效准确的完成服务之间的相互调用,而且最重要的是用户不需要关心 RPC 协议的底层实现,网络传输使用 Http,Netty,还是 Socket 都可以。
有人可能会有疑问,我用 http 请求,里面写上目标的 ip,端口,加上参数不是也能调用服务并且返回数据吗?为什么要引入 RPC 这个概念那?
如果你能思考到这,说明你已经很厉害了,懂得在使用工具时思考为什么。
对于直接使用 http 请求来说,适合接口较少,服务之间相互调用不多的情况,而且需要指定地址,端口等等信息。优点就是简单直接,但是无法应对高并发以及复杂服务交互的情况。
RPC 就是为了解决上面的问题而生的,首先用户只需要调用服务即可,连接和发送数据交给底层协议去完成,另外对于高并发支持非常好,另外提供服务治理,注册中心等功能。适合大型网站,服务复杂,高并发的情况。
从一个点看 RPC 的架构
使用过 Dubbo 等 RPC 框架的应该知道,我们可以像调用本地方法一样调用另一个服务器上的服务,有的人可能不明白这句话时什么意思,代码演示一下。
UserService 是另一个服务器上的服务,我们可以像调用本地方法一样调用,不用管底层协议,不够用管 UserService 在哪个服务器上。
UserService userService = ProxyFactory.getProxy(UserService.class);
User user = userService.get("11112");
那么我们是如何把在另外一个服务器上的服务拿到我们本地来的那?有人看上面的 ProxyFactory 可能就已经猜出来了,使用的是动态代理,我们在本地获取到了接口的代理类,在 invoke 方法中将参数传给对应的服务,服务端在接收到数据后,使用反射调用对应的实现类,完成处理后将结果返回给调用端。
如果你不明白上面的解释,我们用一张图来解释这个过程:

简单点说,RPC 帮我们把对应的请求发过去,服务端有一个服务器一直接收这种请求,收到数据后调用服务对应的处理方法处理后返回给调用端。
带你手写基于 Spring 的可插拔式 RPC 框架(一)介绍的更多相关文章
- 带你手写基于 Spring 的可插拔式 RPC 框架(二)整体结构
前言 上一篇文章中我们已经知道了什么是 RPC 框架和为什么要做一个 RPC 框架了,这一章我们来从宏观上分析,怎么来实现一个 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技术提供非阻塞.异步.全 ...
随机推荐
- 深入WPF中的图像画刷(ImageBrush)之1——ImageBrush使用举例
原文:深入WPF中的图像画刷(ImageBrush)之1--ImageBrush使用举例 昨天我在<简述WPF中的画刷(Brush) >中简要介绍了WPF中的画刷的使用.现在接着深入研究 ...
- Python实现多线程下载
#!/usr/bin/python # -*- coding: utf-8 -*- # filename: paxel.py '''It is a multi-thread downloading t ...
- OpenGL(八) 显示列表
OpenGL在即时模式(Immediate Mode)下绘图时,程序中每条语句产生的图形对象被直接送进绘图流水线,在显示终端立即绘制出来.当需要在程序中多次绘制同一个复杂的图像对象时,这种即时模式会消 ...
- CefSharp For WPF响应页面点击事件
初始化 <!--浏览器--> <cefSharpWPF:ChromiumWebBrowser Name="webBrowser" Grid.Row="0 ...
- js table鼠标点击时变色
<head> <title></title> <script type="text/javascript"> ...
- vs2015 cordova环境安装【个人遇到的几个问题】
原文:vs2015 cordova环境安装[个人遇到的几个问题] 问题1: vs2015,设置 Debug Android 设备[真机调试] Exception in thread "m ...
- 微信小程序把玩(三十八)获取设备信息 API
原文:微信小程序把玩(三十八)获取设备信息 API 获取设备信息这里分为四种, 主要属性: 网络信息wx.getNetWorkType, 系统信息wx.getSystemInfo, 重力感应数据wx. ...
- Windows+Idea安装Hadoop开发环境
前言:这种问题,本来不应该写篇博客的,但是实在是折磨我太久了,现在终于修好了,必须记一下,否则对不起自己的时间,对自己的博客道歉 *** 简介 环境:Windows 10+JDK1.8+Intelli ...
- Python中的参数传递问题
首先需要说明python中元组,列表,字典的区别. 列表: 什么是列表呢?我觉得列表就是我们日常生活中经常见到的清单. 例如:lst = ['arwen',123] 向list中添加项有两种方法:ap ...
- 浅析 C++ 调用 Python 模块
浅析 C++ 调用 Python 模块 作为一种胶水语言,Python 能够很容易地调用 C . C++ 等语言,也能够通过其他语言调用 Python 的模块. Python 提供了 C++ 库,使得 ...