six-finger-web
一个Web后端框架的轮子从处理Http请求【基于Netty的请求级Web服务器】 到mvc【接口封装转发)】,再到ioc【依赖注入】,aop【切面】,再到 rpc【远程过程调用】最后到orm【数据库操作】全部自己撸一个(简易)的轮子。 githubhttps://github.com/bin392328206/six-finger-web
为啥要写这个轮子
其实是这样的,小六六自己平时呢?有时候喜欢看看人家的源码比如Spring,但是小六六的水平可能不怎么样,每次看都看得晕头转向,然后就感觉里面的细节太难了,然后我就只能观其总体的思想,然后我就想我如果可以根据各位前辈的一些思考,自己撸一个简单的轮子出来,那我后面去理解作者的思想是不是简单点呢?于是呢 six-finger-web就面世了,它其实就是我的一个学习过程,然后我把它开源出来,希望能帮助那些对于学习源码有困难的同学。还有就是可以锻炼一下自己的编码能力,因为平时我们总是crud用的Java api都是那些,久而久之,很多框架类的api我们根本就不熟练了,所以借此机会,锻炼一下。
特点
- 内置由 Netty 编写 HTTP 服务器,无需额外依赖 Tomcat 之类的 web 服务(刚好小六六把Netty系列写完,顺便用下)
- 代码简单易懂(小六六自己写不出框架大佬那种高类聚,低耦合的代码),能力稍微强一点看代码就能懂,弱点的也没关系,小六六有配套的从0搭建教程。
- 支持MVC相关的注解确保和SpringMVC的用法类似
- 支持Spring IOC 和Aop相关功能
- 支持类似于Mybatis相关功能
- 支持类似于Dubbo的rpc相关功能
- 对于数据返回,只支持Json格式
絮叨
前面是已经写好的章节,下面我给大家来一一走一遍搭建流程
- 适合初中级Java程序员修炼手册从0搭建整个Web项目(一)
- 适合初中级Java程序员修炼手册从0搭建整个Web项目(二)
- 适合初中级Java程序员修炼手册从0搭建整个Web项目(三)
- 适合初中级Java程序员修炼手册从0搭建整个Web项目(四)
- 适合初中级Java程序员修炼手册从0搭建整个Web项目(五)
- [适合初中级Java程序员修炼手册从0搭建整个Web项目](六)
- [适合初中级Java程序员修炼手册从0搭建整个Web项目](七)
- [适合初中级Java程序员修炼手册从0搭建整个Web项目](八)
昨天已经实现了一个rpc,但是呢我们还没把他们整合到一个容器里面,让我们来回顾一下dubbo的架构图
我们把Spring容器给它补上去把!
来看看总的结构
其实代码呢?全是人家开源的,我就是搬过来然后自己跑了一下流程,把整个流程走通,然后再给大家梳理梳理。
这个要怎么讲呢?其实也就是二大块
- 整合Spring
- 基于Netty的通信
其他的呢?都是这个的拓展吧?我会一一给大家讲下的,但是我也是讲大概的流程,因为代码不是我写的,然后里面的操作我自己也不是很懂,但是总的意思我还是可以讲清楚了。
基于Spring
首先我们想,我们用Spring能做什么,还不是可以代替我们之前的服务注册,服务代理这些,那么我们就基于注解来实现一下我们的服务端的服务注册。
首先我们来看看服务端的注册的实现类
其实就是多了一个注解,@RpcService。这个注解的作用是啥呢?
其实就是可以通过注解来切面来完成服务的注册,然后结合spring的拓展点就很容易就能做到了
在spring包下的三个拓展类就是做这样的事情的,其实呢?我大概总结一下干了啥,然后你们再根据这个去跟源码
- 自定义包扫描注解,我们知道在Spring中它是默认只扫描他们自己定义的注解变成Beandifinition的,但是给了我们拓展点
- 然后再bean的初始化过程中,通过前置通知做服务的注册,后置通知就是bean的属性注入嘛,@RpcReference就是下面这个注解了
网络异常,图片无法展示|
生成这个注解的代理对象,然后再注入到使用这个类的类中,这样的话,就能通过代理对象调用远程服务了
这个就是整合Spring的全部过程了,代码不多,但是真的都是核心,小六六也说的比较白话,不知道大家懂了没有。就是我们服务端的服务的注册,和客户端代理对象的生成,放到spring的生命周期中。
再一个就是基于Netty的通信方式,这个得好好讲讲东西还蛮多
然后我给大家捋捋顺序哈,我们知道rpc框架呢?肯定是有服务端 和客户端,对吧,然后上面我们提到得,我们已经在客户端生成了代理对象了是吧,那么我们接下来就是要调用服务端了,那么服务端首当其冲的当然是我们NettyClientTransport,
NettyClientTransport->sendRpcRequest
这个类就是首先去zk 拿到远程ip 然后去自己的客户端的Netty拿一个channel然后往服务端发送消息,然后我们知道Netty的pipeline的调用链机制是吧(不知道去补补Netyy) 然后它就会去到我们Encode 这个类了
RpcMessageDecoder->encode
然后在这里面会经过我们的系列化,我们的数据压缩,其实这就是为啥rpc比我们传统http请求快的一个原因吧,
然后这里面涉及到了2个组件,一个是序列化组件,一个是压缩组件。
具体里面我就不说了,大家自己去看吧
然后我们继续我们的流程,经过序列化,压缩之后,数据就要经过我们的网络模型了,最后到我们服务端接收了,
然后就到我们的服务端Netty的类了,也是先解压,反解码 RpcMessageDecoder
之后再去
处理完成然后就走了,这样整个过程就都清楚了
测试
- Server
网络异常,图片无法展示|
- Client
网络异常,图片无法展示|
结尾
RPC到这算是完了,但是呢?dubbo的源码有机会还是去看看吧,因为我自己公司的技术栈是Cloud,对于Dubbo其实并不熟悉,所以就只能去慢慢理解人家的东西,不过我感觉自己也学到了不少,如果大家一边跟源码,一边看我的博客,肯定没有问题,但是如果直接看可能也有些地方不清楚的,嗯。接下来就是ORM ,这样整个Web的轮子也算是完整了。