目录:

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

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

带你手写基于 Spring 的可插拔式 RPC 框架(三)通信协议模块

带你手写基于 Spring 的可插拔式 RPC 框架(四)代理类的注入与服务启动

带你手写基于 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 在哪个服务器上。

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

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

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

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

带你手写基于 Spring 的可插拔式 RPC 框架(一)介绍的更多相关文章

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

    前言 上一篇文章中我们已经知道了什么是 RPC 框架和为什么要做一个 RPC 框架了,这一章我们来从宏观上分析,怎么来实现一个 RPC 框架,这个框架都有那些模块以及这些模块的作用. 总体设计 在我们 ...

  2. 带你手写基于 Spring 的可插拔式 RPC 框架(五)注册中心

    注册中心代码使用 zookeeper 实现,我们通过图片来看看我们注册中心的架构. 首先说明, zookeeper 的实现思路和代码是参考架构探险这本书上的,另外在 github 和我前面配置文件中的 ...

  3. 带你手写基于 Spring 的可插拔式 RPC 框架(三)通信协议模块

    在写代码之前我们先要想清楚几个问题. 我们的框架到底要实现什么功能? 我们要实现一个远程调用的 RPC 协议. 最终实现效果是什么样的? 我们能像调用本地服务一样调用远程的服务. 怎样实现上面的效果? ...

  4. 带你手写基于 Spring 的可插拔式 RPC 框架(四)代理类的注入与服务启动

    上一章节我们已经实现了从客户端往服务端发送数据并且通过反射方法调用服务端的实现类最后返回给客户端的底层协议. 这一章节我们来实现客户端代理类的注入. 承接上一章,我们实现了多个底层协议,procoto ...

  5. C基础 带你手写 redis sds

    前言 - Simple Dynamic Strings  antirez 想统一 Redis,Disque,Hiredis 项目中 SDS 代码, 因此构建了这个项目 https://github.c ...

  6. C基础 带你手写 redis adlist 双向链表

    引言 - 导航栏目 有些朋友可能对 redis 充满着数不尽的求知欲, 也许是 redis 属于工作, 交流(面试)的大头戏, 不得不 ... 而自己当下对于 redis 只是停留在会用层面, 细节层 ...

  7. 第二篇 基于.net搭建热插拔式web框架(沙箱的构建)

    上周五写了一个实现原理篇,在评论中看到有朋友也遇到了我的问题,真的是有种他乡遇知己的感觉,整个系列我一定会坚持写完,并在最后把代码开源到git中.上一篇文章很多人看了以后,都表示不解,觉得不知道我到底 ...

  8. 第三篇 基于.net搭建热插拔式web框架(重造Controller)

    由于.net MVC 的controller 依赖于HttpContext,而我们在上一篇中的沙箱模式已经把一次http请求转换为反射调用,并且http上下文不支持跨域,所以我们要重造一个contro ...

  9. 基于Protobuf的分布式高性能RPC框架——Navi-Pbrpc

    基于Protobuf的分布式高性能RPC框架——Navi-Pbrpc 二月 8, 2016 1 简介 Navi-pbrpc框架是一个高性能的远程调用RPC框架,使用netty4技术提供非阻塞.异步.全 ...

随机推荐

  1. IOC DI SL的一些理论

    本文来自圣杰的简书 圣杰 yubinfeng的 这篇文章也很不错 很简单

  2. linux的各个子系统

    Linux基本的子系统主要有CPU.Memory.IO.Network. 在这些子系统中,它们之间相互之间高度依赖.不论什么一个子系统的高负载都会引起其它子系统出现故障. 比如: 大量的页调入请求对内 ...

  3. WPF绘制自定义窗口

    原文:WPF绘制自定义窗口 WPF是制作界面的一大利器,下面就用WPF模拟一下360的软件管理界面,360软件管理界面如下: 界面不难,主要有如下几个要素: 窗体的圆角 自定义标题栏及按钮 自定义状态 ...

  4. 大约laravel错误的解决方案

    2015-3-13 夜晚 9:13 执行laravel发生错误Indirect modification of overloaded element of BbsArticle has no effe ...

  5. python win32api 使用小技巧

    前些日子,由于需要,用python写了个小插件,通过win32api 访问外部程序的窗口 并且做些小操作. 因为原来对win32api 不怎么熟悉 所以只好求救.群里有个QQ:32034767 唐骁勇 ...

  6. WPF字体图标——IconFont

    原文:WPF字体图标--IconFont 版权声明:本文为[CSDN博主:松一160]原创文章,未经允许不得转载. https://blog.csdn.net/songyi160/article/de ...

  7. C类型和存储方式的语言变量

    变量的作用域:有效射程变量 >局部变量 1.在函数中的局部变量,量在该函数结束后自己主动撤销 2.函数内的复合语句中的局部变量(比方for语句),这个变量在复合语句结束后自己主动撤销.这个变量能 ...

  8. fail2ban防止暴力破解

    安装fail2ban: 将fail2ban 上传到服务器,解压: [root@xuegod1 tmp]# tar -zxvf fail2ban-0.8.14.tar.gz [root@xuegod1 ...

  9. 数据源Source 目标Target

    数据源Source-目标Target 数据源实现INotifyPropertyChanged接口,实现“通知”目标实现依赖属性 举例 后台的数据源,实现INotifyPropertyChanged接口 ...

  10. 采用WebService客户端调用WSDL/SOAP网络报错的解决办法

    WebService接口是网络传输控制的重要途径,在Windows系统下运行客户端时,平时一直能正确运行,但某天可能突然会发生调用wsdl soap邮件标头无法识别等莫名其妙的错误提示,出现这种情况一 ...