【Netty】Netty的一些项目案例

简介

由于网上已经有很多大佬已经做了很多相关项目案例。所以我们应该站在巨人的肩膀上,多向大佬们学习。下面主要是我收集到Netty项目,具体项目怎么实现的,我就不讲了,大佬们已经做得很简单明了。

1.IM聊天类

Netty 入门与实战:仿写微信 IM 即时通讯系统

来自lightningMan大佬的:https://github.com/lightningMan

Netty 入门与实战:仿写微信 IM 即时通讯系统

使用Netty实现了单聊和群聊,将Netty从基础到项目一体化,可以说是入门Netty不错的选择。

单聊流程

单聊指的是两个用户之间相互聊天。下面我们来看一下,用户单聊的基本流程

单聊流程
  1. 如上图,A 要和 B 聊天,首先 A 和 B 需要与服务器建立连接,然后进行一次登录流程,服务端保存用户标识和 TCP 连接的映射关系
  2. A 发消息给 B,首先需要将带有 B 标识的消息数据包发送到服务器,然后服务器从消息数据包中拿到 B 的标识,找到对应的 B 的连接,将消息发送给 B
  3. 任意一方发消息给对方,如果对方不在线,需要将消息缓存,对方上线之后再发送
    我们把客户端与服务端之间相互通信的数据包称为指令数据包,指令数据包分为指令和数据,每一种指令对应客户端或者服务端的一种操作,数据部分对应的是指令处理需要的数据。

下面我们先来看一下,要实现单聊,客户端与服务端分别要实现哪些指令:

单聊的指令

指令图示

指令图示

指令列表

指令内容 客户端 服务端
登录请求 发送 接收
登录响应 接收 发送
客户端发消息 发送 接收
服务端发消息 接收 发送
登出请求 发送 接收
登出响应 接收 发送

群聊流程

群聊指的是一个组内多个用户之间的聊天,一个用户发到群组的消息会被组内任何一个成员接收,下面我们来看一下群聊的基本流程

image.png

如上图,要实现群聊,其实和单聊类似

  1. A,B,C 依然会经历登录流程,服务端保存用户标识对应的 TCP 连接
  2. A 发起群聊的时候,将 A,B,C 的标识发送至服务端,服务端拿到之后建立一个群聊 ID,然后把这个 ID 与 A,B,C 的标识绑定
  3. 群聊里面任意一方在群里聊天的时候,将群聊 ID 发送至服务端,服务端拿到群聊 ID 之后,取出对应的用户标识,遍历用户标识对应的 TCP 连接,就可以将消息发送至每一个群聊成员

下面,我们再来看一下群聊除了需要实现上述指令之外,还需要实现的指令集

群聊要实现的指令集

指令图示

image.png

指令列表

指令内容 客户端 服务端
创建群聊请求 发送 接收
群聊创建成功通知 接收 发送
加入群聊请求 发送 接收
群聊加入通知 接收 发送
发送群聊消息 发送 接收
接收群聊消息 接收 发送
退出群聊请求 发送 接收
退出群聊通知 接收 发送

Netty

我们使用 Netty 统一的 IO 读写 API 以及强大的 pipeline 来编写业务处理逻辑,在后续的章节中,我会通过 IM 这个例子,带你逐步了解 Netty 的以下核心知识点。

  • 服务端如何启动
  • 客户端如何启动
  • 数据载体 ByteBuf
  • 长连自定义协议如何设计
  • 粘包拆包原理与实践
  • 如何实现自定义编解码
  • pipeline 与 channelHandler
  • 定时发心跳怎么做
  • 如何进行连接空闲检测

客户端使用 Netty 的程序逻辑结构

上面这幅图展示了客户端的程序逻辑结构

  1. 首先,客户端会解析控制台指令,比如发送消息或者建立群聊等指令
  2. 然后,客户端会基于控制台的输入创建一个指令对象,用户告诉服务端具体要干什么事情
  3. TCP 通信需要的数据格式为二进制,因此,接下来通过自定义二进制协议将指令对象封装成二进制,这一步称为协议的编码
  4. 对于收到服务端的数据,首先需要截取出一段完整的二进制数据包(拆包粘包相关的内容后续小节会讲解)
  5. 将此二进制数据包解析成指令对象,比如收到消息
  6. 将指令对象送到对应的逻辑处理器来处理

服务端使用 Netty 的程序逻辑结构

同类型的项目还有:
琪琪IMhttps://gitee.com/qiqiim/qiqiim-server

2.RPC类

SOFABolt

蚂蚁金融服务集团开发的一套基于 Netty 实现的网络通信框架。https://github.com/sofastack/sofa-bolt

SOFABolt 是蚂蚁金融服务集团开发的一套基于 Netty 实现的网络通信框架。

  • 为了让 Java 程序员能将更多的精力放在基于网络通信的业务逻辑实现上,而不是过多的纠结于网络底层 NIO 的实现以及处理难以调试的网络问题,Netty 应运而生。
  • 为了让中间件开发者能将更多的精力放在产品功能特性实现上,而不是重复地一遍遍制造通信框架的轮子,SOFABolt 应运而生。

Bolt 名字取自迪士尼动画-闪电狗,是一个基于 Netty 最佳实践的轻量、易用、高性能、易扩展的通信框架。 这些年我们在微服务与消息中间件在网络通信上解决过很多问题,积累了很多经验,并持续的进行着优化和完善,我们希望能把总结出的解决方案沉淀到 SOFABolt 这个基础组件里,让更多的使用网络通信的场景能够统一受益。 目前该产品已经运用在了蚂蚁中间件的微服务 (SOFARPC)、消息中心、分布式事务、分布式开关、以及配置中心等众多产品上。

功能介绍

SOFABolt 的基础功能包括:
基础通信功能 ( remoting-core )

基于 Netty 高效的网络 IO 与线程模型运用
连接管理 (无锁建连,定时断链,自动重连)
基础通信模型 ( oneway,sync,future,callback )
超时控制
批量解包与批量提交处理器
心跳与 IDLE 事件处理

协议框架 ( protocol-skeleton )

命令与命令处理器
编解码处理器
心跳触发器

私有协议定制实现 - RPC 通信协议 ( protocol-implementation )

RPC 通信协议的设计
灵活的反序列化时机控制
请求处理超时 FailFast 机制
用户请求处理器 ( UserProcessor )
双工通信

3.MQTT类

陆陆大神的:https://github.com/1ssqq1lxr/iot_push

MQTT 协议是 IBM 开发的即时通讯协议,相对于 IM 的实际上的准标准协议 XMPP 来说,MQTT 更小,更快,更轻量。MQTT 适合于任何计算能力有限,工作在低带宽、不可靠的网络中的设备,包括手机,传感器等等。

功能已实现:

发布订阅功能
遗言通知
会话session数据
发布保留消息
主题过滤(/test 会接受到 /test/yy 的主题消息)
实现标准的 qos0 qos1 qos2消息确认机制
ssl加密
支持ws协议
集成spring容器

最后

如果对 Java、大数据感兴趣请长按二维码关注一波,我会努力带给你们价值。觉得对你哪怕有一丁点帮助的请帮忙点个赞或者转发哦。
关注公众号【爱编码】,小编会一直更新文章的哦。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,753评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,668评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,090评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,010评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,054评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,806评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,484评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,380评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,873评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,021评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,158评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,838评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,499评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,044评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,159评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,449评论 3 374
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,136评论 2 356

推荐阅读更多精彩内容