带你手写基于 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技术提供非阻塞.异步.全 ...
随机推荐
- PBS 作业调度应用
PBS(Portable Batch System),最初由 NASA 的 Ames 研究中心开发,主要为了提供一个能满足异构计算网络需要的软件包,用于灵活的批处理(Portable Batch Pr ...
- python3获取天气预报
#!/usr/local/bin/python3 #coding=utf-8 ''' Created on 2011-2-25 @author: http://www.cnblogs.com/txw1 ...
- HDU4099-Revenge of Fibonacci(trie树+数学基础)
Revenge of Fibonacci Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 204800/204800 K (Java/ ...
- Angular route传参
从 router-link-page1 跳转 router-link-page2 和 router-link-page3 通过自定义路由 设置router-link-page2的路由后有3个参数,pa ...
- aspnetboilerplate && .net core 使用原生sql
利用aspnetboilerplate提供的工具类IDbContextProvider private readonly IDbContextProvider<XXXDbContext> ...
- Emgu-WPF学习使用 - 颜色映射
原文:Emgu-WPF学习使用 - 颜色映射 string sFile = ""; if (!String.IsNullOrEmpty(AppConstUtils.GDefault ...
- 测试WPF绑定bug
1.低级错误:有没有绑错2.去属性那里打断点,get.set有没有进3.xaml加上twoway,UpdateSourceTrigger=PropertyChanged
- dotnet pack 打包文件版本号引起 "Could not load file or assembly" 问题
如果不是遇到,真的不会想到,代码世界的问题真是千奇百怪,这次遇到的是 dotnet pack 打包文件版本号引起的问题. 之前进行 nuget 打包都是在 Visual Studio build 时进 ...
- CSS常见的选择器
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- PHP获得指定日期所在月的第一天和最后一天
function getdays($day){ $firstday = date('Y-m-01',strtotime($day)); $lastday = date('Y-m-d',strtotim ...