目录:

带你手写基于 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. 创建一个显示所有预定义WPF颜色的ListBox

    原文 Creating a ListBox that Shows All Predefined WPF Colors 在WPF中,您可以使用Colors类访问一系列预定义颜色,这些颜色定义为Color ...

  2. COM编程基础(C++)

    转自:http://www.yesky.com/20020715/1620482_1.shtml (作为一个初学者,觉得本文挺好,推荐给大家) 这篇文章是给初学者看的,尽量写得比较通俗易懂,并且尽量避 ...

  3. 最简单的IdentityServer实现——Client

    客户端控制台演示请求访问令牌,然后使用此令牌访问API 1.新建项目并添加引用 新建一个.net core的控制台程序IdentityServer.EasyDemo.Client   1 引用Iden ...

  4. WPF DataTemplateSelector的使用

    <Window x:Class="CollectionBinding.MainWindow"        xmlns="http://schemas.micros ...

  5. WPF/Silverlight 页面绑定Model验证机制升级版

    关于WPF/Silverlight的数据验证,想必大家都不陌生了. 各大牛的博客里都不泛对这方面讨论的文章. 个人比较赞赏 JV9的“Silverlight实例教程”里的Validation数据验证. ...

  6. wcf服务端代码方式及客户端代码方式

    ServiceHost  host;  // 全局 host = new ServiceHost(typeof(实现服务接口的类)); host.open(); 用代码配置端点的方法 host.add ...

  7. qmake.exe是在Qt安装编译时生成的,里面内嵌了Qt相关的一些路径(最简单的方法是保持一样的安装路径,最方便的办法是设置qt.conf文件)

    在网上直接下载别人编译好的Qt库,为自己使用省了不少事.但往往也会遇到些问题,其中Qt version is not properly installed,please run make instal ...

  8. GIS基础软件及操作(六)

    原文 GIS基础软件及操作(六) 练习六.空间分析的应用 1.加深对缓冲区分析基本原理.方法的认识:2.熟练掌握距离制图创建缓冲区技术方法.3.掌握利用缓冲区分析方法解决地学空间分析问题的能力. 1. ...

  9. C#匹配中文字符串的4种正则表达式分享

    本文介绍在C#中使用匹配中文的正则表达式,包括纯中文.有中文.中文开头.中文结尾等几个正则表达式示例.在正则表达式中,中文可以通过Unicode编码来确定正则表达式范围. 在C#中,匹配中文的正则表达 ...

  10. 恢复Win10照片查看器

    批处理文件: @echo off&cd\&color 0a&cls echo 恢复Win10照片查看器 reg add "HKLM\SOFTWARE\Microsof ...