[适合初中级Java程序员修炼手册从0搭建整个Web项目](九)

简介: 前言“文本已收录至我的GitHub仓库,欢迎Star:https://github.com/bin392328206种一棵树最好的时间是十年前,其次是现在

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格式


絮叨

前面是已经写好的章节,下面我给大家来一一走一遍搭建流程


昨天已经实现了一个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的轮子也算是完整了。

相关文章
|
12天前
|
JavaScript 前端开发 开发工具
web项目规范配置(husky、eslint、lint-staged、commit)
通过上述配置,可以确保在Web项目开发过程中自动进行代码质量检查和规范化提交。Husky、ESLint、lint-staged和Commitlint共同作用,使得每次提交代码之前都会自动检查代码风格和语法问题,防止不符合规范的代码进入代码库。这不仅提高了代码质量,还保证了团队协作中的一致性。希望这些配置指南能帮助你建立高效的开发流程。
30 5
|
19天前
|
JavaScript 前端开发 数据安全/隐私保护
Web开发者必看:手把手教你如何轻松播放m3u8流地址,解锁视频播放新技能,让你的项目更上一层楼!
【10月更文挑战第23天】随着互联网技术的发展,m3u8格式因良好的兼容性和高压缩率被广泛用于网络流媒体传输。本文介绍如何在Web端播放m3u8流地址,包括引入视频播放器(如Video.js)、创建播放器容器、初始化播放器及播放m3u8流的具体步骤。此外,还涉及处理加密m3u8流的示例。
68 1
|
27天前
|
JSON 搜索推荐 API
Python的web框架有哪些?小项目比较推荐哪个?
【10月更文挑战第15天】Python的web框架有哪些?小项目比较推荐哪个?
47 1
|
1月前
|
前端开发 JavaScript API
惊呆了!学会AJAX与Fetch API,你的Python Web项目瞬间高大上!
在Web开发领域,AJAX与Fetch API是提升交互体验的关键技术。AJAX(Asynchronous JavaScript and XML)作为异步通信的先驱,通过XMLHttpRequest对象实现了局部页面更新,提升了应用流畅度。Fetch API则以更现代、简洁的方式处理HTTP请求,基于Promises提供了丰富的功能。当与Python Web框架(如Django、Flask)结合时,这两者能显著增强应用的响应速度和用户体验,使项目更加高效、高大上。
50 2
|
2月前
|
前端开发 Python
前后端分离的进化:Python Web项目中的WebSocket实时通信解决方案
在现代Web开发领域,前后端分离已成为一种主流架构模式,它促进了开发效率、提升了应用的可维护性和可扩展性。随着实时数据交互需求的日益增长,WebSocket作为一种在单个长连接上进行全双工通讯的协议,成为了实现前后端实时通信的理想选择。在Python Web项目中,结合Flask框架与Flask-SocketIO库,我们可以轻松实现WebSocket的实时通信功能。
56 2
|
1月前
|
监控 Java Maven
springboot学习二:springboot 初创建 web 项目、修改banner、热部署插件、切换运行环境、springboot参数配置,打包项目并测试成功
这篇文章介绍了如何快速创建Spring Boot项目,包括项目的初始化、结构、打包部署、修改启动Banner、热部署、环境切换和参数配置等基础操作。
120 0
|
3月前
|
测试技术 开发者 Python
FastAPI的神奇之处:如何用Python引领Web开发的新浪潮,让你的项目一鸣惊人?
【8月更文挑战第31天】在现代软件开发中,Web应用至关重要,而FastAPI作为高性能Python Web框架,凭借简洁的语法与高效的开发体验,备受开发者青睐。本文将介绍FastAPI的基础概念、使用方法及最佳实践,涵盖路由、模板、请求对象等核心概念,并探讨其优势与社区扩展,助您高效构建Web应用。
109 1
|
3月前
|
存储 JSON 数据安全/隐私保护
"FastAPI身份验证与授权的奥秘:如何用Python打造坚不可摧的Web应用,让你的项目一鸣惊人?"
【8月更文挑战第31天】在现代Web开发中,保证应用安全性至关重要,FastAPI作为高性能Python框架,提供了多种身份验证与授权方式,包括HTTP基础认证、OAuth2及JWT。本文将对比这些机制并附上示例代码,展示如何使用HTTP基础认证、OAuth2协议以及JWT进行用户身份验证,确保只有合法用户才能访问受保护资源。通过具体示例,读者可以了解如何在FastAPI项目中实施这些安全措施。
137 1
|
3月前
|
存储 数据库 开发者
Web2py的神秘力量:如何用Python打造快速原型设计与开发,让你的项目一鸣惊人?
【8月更文挑战第31天】在现代软件开发中,快速原型设计至关重要。Web2py作为一款Python Web框架,凭借其简洁的语法和高效开发流程受到开发者青睐。本文通过在线调查问卷系统的案例,展示Web2py在快速原型设计中的应用,包括需求分析、数据库设计、表单创建及路由实现,并提供示例代码,帮助读者理解其最佳实践。
25 1
|
3月前
|
开发者 Java 安全
Struts 2 实战秘籍:Action 驱动业务,配置文件成就高效开发!
【8月更文挑战第31天】Struts 2 框架作为 Apache 软件基金会的顶级项目,广泛应用于企业级 Web 应用开发。其核心组件 Action 类处理用户请求,而配置文件定义请求与 Action 类间的映射关系。掌握 Action 组件的最佳实践包括继承 `ActionSupport` 类、实现 `execute` 方法及使用类型安全的方法;配置文件的最佳实践则涉及组织 Action 到包中、定义全局结果及使用通配符映射。遵循这些最佳实践,可构建高效、可维护的 Web 应用程序。
41 0

热门文章

最新文章