关于项目
该项目主要环境构成为netty,阅读本篇文章后你可以学到:
- 熟练掌握netty,掌握网络编程开发等相关技术点与痛点,甚至可以手写一个简单服务器中间件,类似于tomcat、nginx的功能。
- 熟悉H5+构建app移动端的方式。如果你已经玩腻了纯B/S的项目,那么这个项目一定可以让你如得至宝。
- 熟练掌握SpringBoot的开发模式。SpringBoot可以作为一个技术脚手架整合其他许多复杂的技术让开发简约化,那么熟悉它则可以让你的工作高效而优雅。
- 快速上手部分运维知识。项目会打包至云服务器上。
*阅读前提示
该项目章节共11章,前十章讲解项目,最后一章总结。
讲解部分目录可能过长,可以自行暂停阅读,或者选择对自身有益部分阅读。
项目源码会更新至GitHub上,请选择需要部分食用。
Thanks♪(・ω・)ノ。
目录(内容持续更新)
第【1】章 netty介绍&相关知识
初识netty,学习阻塞与非阻塞,同步与异步,理解BIO/NIO/AIO以及netty的线程模型
【1-1】初始netty
Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients.
引用自官网的解释:Netty是一个异步事件驱动的网络应用程序框架。用于快速开发可维护的、高性能的服务器和客户端。
【1-2】阻塞和非阻塞,同步和异步的概念
首先有四个相关独立的概念:
- 阻塞
- 非阻塞
- 同步
- 异步
两两组合可以衍生出新的概念:
阻塞 | 非阻塞 | |
---|---|---|
同步 | 同步阻塞(BIO) | 同步非阻塞(NIO) |
异步 | 异步阻塞 | 异步非阻塞(AIO) |
引用一个我认为非常通俗的例子,出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。
- 老张把水壶放到火上,立等水开。(同步阻塞 BIO)老张觉得自己有点傻
- 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞 NIO)
- 老张还是觉得自己有点傻,于是变高端了,买了把会响笛的那种水壶。水开之后,能大声发出嘀~~~~的噪音。
- 老张把响水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。(异步非阻塞 AIO)
- 老张把响水放到火上,站旁边傻等水开。(异步阻塞)
同步和阻塞是一对同义词,异步和非阻塞也是一对同义词。
比如上例,同步或异步仅仅只针对水壶而言。普通水壶不会响,老张没办法接收到水烧开了的通知,只能自己每隔一段时间主动的去轮询一眼水烧开了没有。但是响水壶如果烧开了会自己通知老张:“我没声音了,水开了,你可以喝了!”。这样老张几乎不用主动轮询也可以知道水开了没。这样就叫异步。
而阻塞和非阻塞是针对老张而言。如果老张在从烧水到水壶烧开的期间,持续等待水开,这就叫阻塞。如果是同步状态还好,毕竟老张也不知道水啥时候开。如果是异步,那老张就傻了,水开了会主动来通知,而老张却还缺心眼一样的站旁边啥等着,这明显毫无意义。所以一般异步配合非阻塞使用,老张在等待响水壶烧开期间可以出去抽根烟或者看会电视,这样老张的功能性就大大增强,效率也变高。
【1-3】BIO讲解
BIO是同步阻塞IO,Block IO。 举个例子:去上厕所,坑满,我就一直等,等到有坑位释放,立马过去蹲坑。
【1-4】NIO讲解
NIO是同步非阻塞IO,New IO或者Non-Block IO。 举个例子:还是去上厕所,坑位满了,此时我可以出去做点别的事情,比如抽烟玩手机,然后召唤个分身时不时的回来瞅一眼有没有坑位释放,如果有,自己过去占坑。
【1-5】BIO NIO AIO的区别与理解
BIO优缺点很明显,有点则是模型简单,编码简单。缺点主要瓶颈在线程上,由于每个连接都会创建一个线程,虽然线程消耗的比较小,但是一台机器实际上能建立的有效线程有限。每创建一个线程就要为这个线程工作存储器,JDK1.5以后一个线程大概消耗1MB的内存,且随着线程数量的增加,CPU切换线程上下文的消耗随之增加,在高过某个阀值之后,继续增加线程,性能不增反降。而同样是因为一个线程对应一个连接,所以编码很简单。
NIO是基于事件驱动思想完成。主要思想是解决BIO的大并发问题,即如上所述缺点:线程瓶颈。对于NIO来说,已经不是一个连接对应一个线程,而是有效的请求对应一个线程,当连接没有数据时,是不会有工作线程来处理的!NIO的缺点在于编码复杂,模型复杂,需要处理半包问题。优点是性能瓶颈高。
NIO和BIO的不同在于,BIO会引入多线程,每个线程单独对应一个连接;NIO则使用单线程或者少量的多线程,一个请求对应一个线程。
【1-6】再看netty
Netty是一个Java的开源框架,提供了异步的事件驱动的网络应用程序框架以及脚手架,用于快速开发高性能高可用性的网络服务器以及客户端程序。Netty简化了网络编程开发的一些规范。
Netty社区非常的活跃,项目迭代的速度相当快。很多主流商业的软件也用到了Netty,比如Doubbe底层就是Netty。
【1-7】netty的三种线程模型
可以称为Reactor线程模型。
-
单线程模型
-
多线程模型
-
*主从线程模型
第【2】章 使用netty编写第一个hello netty 服务器
从零开始使用netty编写服务器,在网页访问后返回hello netty,主要对服务器启动类,channel初始化器以及助手类讲解,最后会对channel的生命周期进行讲解
【2-1】使用maven构建netty基础依赖
【2-2】构建hello服务器
- 构建主从线程组
- 定义服务器启动类
- 为服务器设置Channel
- 设置处理从线程池的初始化器
- 监听启动和关闭服务器
【2-3】设置channel初始化器
【2-4】编写自定义助手类
【2-5】hello服务器启动讲解
【2-6】netty生命周期
第【3】章 使用netty构建websocket(ws)服务器
理解实时通信,使用netty的websocket编写服务端启动类、子处理器以及助手类。 理解JS相关的websocket api,简单使用hbuilder编写通信页面与netty交互并且使用web浏览器与手机端浏览器进行测试数据交互
【3-1】实时通信概念讲解
【3-2】编写ws服务端启动类
【3-3】编写ws子处理器initialzer
【3-4】编写chatHandler对消息的处理
【3-5】js的ws相关api介绍
【3-6】简单实用hbuilder工具编写前端ws
【3-7】测试web端携手移动端与后端netty聊天通信
第【4】章 使用MUI与H5+构建移动端app
零基础讲解MUI、H5+以及hbuilder开发工具,构建慕信轻聊的基本骨架
【4-1】MUI,H5+,Hbuilder介绍
【4-2】创建项目,页面基本结构讲解
【4-3】自定义标题栏样式
【4-4】真机调试与原生标题栏样式更改
【4-5】首页底部tab选项卡的使用,MUI图标库讲解
【4-6】使用阿里图标库构建自己的icon库
【4-7】tab选项卡切换页面(上)
【4-8】tab选项卡切换页面(下)
第【5】章 使用springboot整合netty搭建后台
对数据库表设计进行讲解并且使用springboot作为主要后台框架,并且整合mybatis以及netty,重构netty server并且整合
【5-1】数据库表设计
【5-2】使用mybatis逆向工具
【5-3】搭建springboot2.0工程
【5-4】springboot整合mybatis
【5-5】整合netty server
【5-6】完成netty整合springboot并且测试
第【6】章 用户注册/登录/个人信息
开发用户注册登录以及个人信息页面相关功能模块,其中涉及到高性能分布式文件存储服务器fastdfs的搭建,并且使用nginx发布可使用http进行web访问并且下载用户头像和二维码
【6-1】注册登录页面讲解与后端接口开发1
【6-2】注册登录页面讲解与后端接口开发2
【6-3】登录注册页面的判断事件与js自定义util
【6-4】登录注册前后端联调
【6-5】首页禁止返回和用户自动登录讲解
【6-6】开发我的个人页面
【6-7】动态初始化个人信息
【6-8】打开个人头像页面
【6-9】增加可选择菜单
【6-10】为菜单增加事件绑定
【6-11】选择照片与裁剪插件
【6-12】文件服务器概览
【6-13】安装tracker服务
【6-14】安装storage服务
【6-15】配置client并且上传测试图片
【6-16】nginx安装与fastdfs配置(上)
【6-17】nginx安装与fastdfs配置(下)
【6-18】fastdfs 整合springboot
【6-19】后端上传图片功能开发
【6-20】上传图片前后端联调与测试
【6-21】头像上传后跨页面调用自定义事件刷新
【6-22】上传头像细节部分处理与openwindow的bug处理
【6-23】下载头像到相册
【6-24】修改昵称页面
【6-25】修改昵称后端接口
【6-26】修改昵称前后端联调
【6-27】用户二维码生成
【6-28】我的二维码作业布置
【6-29】我的二维码作业讲解
【6-30】用户退出以及简单小结
第【7】章 发现页面与通讯录相关功能开发
用户可以通过搜索其他用户账号进行好友添加,或者通过用户的唯一二维码进行扫码添加,发送添加请求后其他用户可以拒绝或者同意好友请求
【7-1】发现页面编码
【7-2】搜索朋友账号接口(上)
【7-3】搜索朋友账号接口(下)
【7-4】搜索朋友前后端联调
【7-5】搜索结果页讲解以及webview传参
【7-6】发送添加好友请求接口编码
【7-7】前后端连天发送好友请求
【7-8】查询好友请求接口
【7-9】朋友接受到请求页面联调开发
【7-10】好友请求HTML动态渲染
【7-11】同意或忽略事件动态绑定
【7-12】同意或忽略controller
【7-13】同意或忽略的service编写
【7-14】好友请求忽略或拒绝前后台联调
【7-15】构建扫描器
【7-16】扫码器颜色自定义
【7-17】扫码添加好友联调
【7-18】延时加载预处理数据
【7-19】mui 自带索引列表模板讲解
【7-20】通讯录列表整合
【7-21】图文列表和通讯录整合增加用户头像显示
【7-22】查询用户的所有好友列表接口
【7-23】手机端获取好友列表保存到本地
【7-24】定义通讯录好友列表模型
【7-25】通讯录列表渲染展现
【7-26】好友请求接收方更新通讯录
第【8】章 聊天页面开发
构建手机端上的聊天页面模型,建立会话,接受发送消息,netty控制点对点消息发送,控制会话重连,聊天记录的本地保存与左滑删除,消息标记未读,消息牵手等。
【8-1】聊天页面讲解与展示
【8-2】header动态改为好友昵称,动态滚动到最新消息
【8-3】发送按钮的颜色状态改变
【8-4】弹出软键盘重新设置聊天窗口高度
【8-5】发送消息前置条件网络状态判断
【8-6】监听网络连接事件
【8-7】发送消息html渲染
【8-8】接收消息html渲染
【8-9】发送消息与接收消息时的铃声播放
【8-10】手机端websocket模型定义和发送消息
【8-11】websocket接受消息的渲染_x264
【8-12】服务器断开后的重连机制
【8-13】chatHandler初步重构
【8-14】构建聊天业务模型
【8-15】chatHandler - 处理客户端连接
【8-16】chatHandler - 保存聊天消息到数据库
【8-17】chatHandler - 处理消息发送
【8-18】chatHandler - 签收单条或多条消息
【8-19】客户端onopen联调,初始化用户和channel关系
【8-20】客户端发送消息与接收联调
【8-21】接收方获得消息后重构渲染
【8-22】客户端签收消息
【8-23】websocket新增好友类型联调
【8-24】保存聊天记录到本地
【8-25】从本地获取聊天记录
【8-26】初始化聊天记录和渲染
【8-27】聊天快照业务简单讲解
【8-28】保存聊天快照到本地
【8-29】获取聊天快照
【8-30】已读未读消息的设置与快照调用
【8-31】展示聊天快照
【8-32】未读消息小红点标记
【8-33】点击快照开始聊天
【8-34】未读消息标记已读
【8-35】开发获取未读消息列表接口
【8-36】前端获取未读消息列表
【8-37】批量签收并且展示未读消息
【8-38】聊天快照左滑删除效果
【8-39】聊天快照右滑删除聊天记录与快照
第【9】章 使用netty编写心跳检测
app不会主动和服务端切断,只会有可能发生离线或者关机或者飞行模式,所以需要在后台控制心跳,检测客户端的读写请求来判断是否清除无用的channel。同时手机端也要保持一定的keepalive。未接受到的消息在用户下次打开后重新获取。 ...
【9-1】心跳机制的概念与飞行模式
【9-2】心跳HeartBeatHandler编码
【9-3】配置空闲handler与超时时间设置
【9-4】手机端与netty的心跳测试
【9-5】前端keepalive保持,与心跳测试
第【10】章 后端云部署与app云打包
本章节做为上线部分,需要购买云服务器,采用腾讯云,会对其进行讲解,然后搭建基本环境,包含JDK、tomcat、MariaDB、fastdfs、nginx,springboot打包与部署。最后对手机app进行云打包
【10-1】云服务器购买推荐及安全组介绍与关联
【10-2】文件传输工具的使用
【10-3】命令行工具的简单使用
【10-4】云服务器配置JDK环境
【10-5】云服务器安装tomcat
【10-6】云服务器离线安装MariaDB
【10-7】云服务器MariaDB安全设置与客户端连接调试
【10-8】云服务器安装图片服务器的注意事项以及nginx反向代理tomcat服务器
【10-9】springboot工程打包
【10-10】打包文件上传到云服务器并且进行tomcat部署
【10-11】app云打包
第【11】章 总结
项目总结