首页 > 其他分享 >Netty--聊天业务

Netty--聊天业务

时间:2024-06-12 14:54:42浏览次数:20  
标签:Netty netty -- work 线程 聊天 import 事件

1.聊天模块细分微服务:
用户服务:处理用户身份验证、授权和管理。包括用户注册、登录、个人信息管理等功能。
聊天服务:处理实时聊天功能,包括消息发送、接收和存储。可使用WebSocket等技术来实现实时通信。
好友服务:管理用户的好友关系,包括好友请求、好友列表和好友关系的维护。
群组服务:管理用户群组的创建、加入和退出操作,以及群组消息的发送和接收。
消息推送服务:负责将消息实时推送给在线用户。可以使用消息队列、推送通知或长连接等技术来实现。
历史记录服务:负责存储和检索聊天记录,用于用户查看历史消息。
图片/文件服务:处理聊天中的图片和文件上传、下载和存储。
搜索服务:提供全文搜索功能,用于用户搜索聊天记录、好友和群组等。
分析服务:分析聊天数据,提供统计和报表功能,用于监控系统性能和用户行为。
:::

 

Netty 是基于 Java NIO 的异步事件驱动的网络应用框架,使用 Netty 可以快速开发网络应用,Netty 提供了高层次的抽象来简化 TCP 和 UDP 服务器的编程,但是你仍然可以使用底层的 API。

Netty 的内部实现是很复杂的,但是 Netty 提供了简单易用的API从网络处理代码中解耦业务逻辑。Netty 是完全基于 NIO 实现的,所以整个 Netty 都是异步的。

Netty 是最流行的 NIO 框架,它已经得到成百上千的商业、商用项目验证,许多框架和开源组件的底层 rpc 都是使用的 Netty,如Dubbo、Elasticsearch 等等。

 

优点:

API使用简单,学习成本低。
高度可定制的线程模型——单线程、一个或多个线程池。
功能强大,内置了多种解码编码器,支持多种协议。
社区活跃,发现BUG会及时修复,迭代版本周期短,不断加入新的功能。
Dubbo、Elasticsearch都采用了Netty,质量得到验证。
更好的吞吐量,更低的等待延迟,更少的资源消耗

各部分介绍:
BossGroup 和 WorkerGroup:
bossGroup 和 workerGroup 是两个线程池, 它们默认线程数为 CPU 核心数乘以 2
bossGroup 用于接收客户端传过来的请求,接收到请求后将后续操作交由 workerGroup 处理

Selector(选择器):
检测多个通道上是否有事件的发生

TaskQueue(任务队列):
上面的任务都是在当前的 NioEventLoop ( 反应器 Reactor 线程 ) 中的任务队列中排队执行 , 在其它线程中也可以调度本线程的 Channel 通道与该线程对应的客户端进行数据读写

Channel:
Channel 是框架自己定义的一个通道接口,
Netty 实现的客户端 NIO 套接字通道是 NioSocketChannel
提供的服务器端 NIO 套接字通道是 NioServerSocketChannel
当服务端和客户端建立一个新的连接时, 一个新的 Channel 将被创建,同时它会被自动地分配到它专属的 ChannelPipeline

ChannelPipeline:
是一个拦截流经 Channel 的入站和出站事件的 ChannelHandler 实例链,并定义了用于在该链上传播入站和出站事件流的 API

ChannelHandler:
分为 ChannelInBoundHandler 和 ChannelOutboundHandler 两种
如果一个入站 IO 事件被触发,这个事件会从第一个开始依次通过 ChannelPipeline中的 ChannelInBoundHandler,先添加的先执行。
若是一个出站 I/O 事件,则会从最后一个开始依次通过 ChannelPipeline 中的 ChannelOutboundHandler,后添加的先执行,然后通过调用在 ChannelHandlerContext 中定义的事件传播方法传递给最近的 ChannelHandler。
在 ChannelPipeline 传播事件时,它会测试 ChannelPipeline 中的下一个 ChannelHandler 的类型是否和事件的运动方向相匹配。
如果某个ChannelHandler不能处理则会跳过,并将事件传递到下一个ChannelHandler,直到它找到和该事件所期望的方向相匹配的为止。

2.搭建服务器netty服务器
A.创建WebSocketNettyServer 类编写服务器启动代码
服务端实现步骤:

创建bossGroup线程组: 处理网络事件–连接事件
创建workerGroup线程组: 处理网络事件–读写事件
创建服务端启动助手
设置bossGroup线程组和workerGroup线程组
设置服务端通道实现为NIO
参数设置
创建一个通道初始化对象
向pipeline中添加自定义业务处理handler
启动服务端并绑定端口,同时将异步改为同步
关闭通道和关闭连接池
package com.my.server;

import com.my.handler.WebSocketNettyHandler;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.logging.LoggingHandler;
import lombok.Data;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
* netty服务端
* 实现DisposableBean 在容器销毁前会调用destroy 方法进行线程组的关闭
*/
@Data
@Component
public class WebSocketNettyServer implements DisposableBean {

/**
* 自定义入站规则
*/
@Autowired
private WebSocketNettyHandler webSocketNettyHandler;

/**
* 通道初始化对象
*/
@Autowired
private WebSocketChannelInit webSocketChannelInit;

/**
* boos线程组
*/
private EventLoopGroup boos;

/**
* work线程组
*/
private EventLoopGroup work;


/**
* 自定义启动方法
* @param port
*/
public void start(int port) {

// 设置boos线程组
boos = new NioEventLoopGroup(1);
// 设置work线程组
EventLoopGroup work = new NioEventLoopGroup();
// 创建启动助手
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(boos,work)
.channel(NioServerSocketChannel.class)
.handler(new LoggingHandler())
.childHandler(webSocketChannelInit);
// 绑定ip和端口启动服务端
ChannelFuture sync = null;
try {

// 绑定netty的启动端口
sync = serverBootstrap.bind(port).sync();
} catch (InterruptedException e) {

e.printStackTrace();
close();
}
System.out.println("netty服务器启动成功"+"--端口:"+port);
sync.channel().closeFuture();
}

/**
* 容器销毁前关闭线程组
* @throws Exception
*/
@Override
public void destroy() throws Exception {

close();
}

/**
* 关闭方法
*/
public void close() {

if (boos!=null) {

boos.shutdownGracefully();
}
if (work!=null) {

work.shutdownGracefully();
}
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
B.**创建一个通道初始化对象 **WebSocketChannelInit
这里面主要添加了编解码器和自定义入站规则和对WebSocket的支持

package com.my.server;

import com.my.config.NettyConfig;
import com
1
2
3
文章知识点与官方知识档案匹配,可进一步学习相关知识
网络技能树首页概览45266 人正在系统学习中
最低0.
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/Kaka_csdn14/article/details/131545615

标签:Netty,netty,--,work,线程,聊天,import,事件
From: https://www.cnblogs.com/gaoyanbing/p/18243947

相关文章

  • 高一高考集训欢乐赛
    大石碎胸口——万能青年旅店久违的头图渔王还想继续做渔王而海港已经不知去向此刻他醉倒在洗浴中心没有潮汐的梦胸口已暮色苍茫肥胖的城市递给他一个传统的方法来克制恐慌卖掉武器风暴喉咙换取饮食背叛能让你获得自由停电之后暂时摆脱了坚硬的时刻倒转......
  • codelity
    source:https://app.codility.com/programmers/trainings/5/three_letters/classSolution{publicstringsolution(intA,intB){//ImplementyoursolutionhereStringBuilderstr=newStringBuilder();if(A>B){......
  • 2024.06.02《构建之法》阅读笔记
    在以往自己书写代码的时候,每次完成一个小功能都要自己来测试一下,但是这样做的救过并不理想。因为自己写的软件,一些自己可以想到的方面都进行了解决,而一些不能解决的问题是测试也不能够解决的。但是这样写好的程序还有没有BUG呢?而且只写BUG是否容易出现?是否能够解决呢?所以,这时就应......
  • 2024.06.03
    importosimportopenpyxlimportdatetimefromtkinterimport*fromtkinterimportmessagebox#Createthemainwindowjzr=Tk()jzr.title('个人账本记录')jzr.geometry('400x600')jzr.config(bg='lightyellow')#Createatextboxtodisplay......
  • CSP历年复赛题-P5662 [CSP-J2019] 纪念品
    原题链接:https://www.luogu.com.cn/problem/P5662题意解读:n件物品,t天每天有不同的价格,类似股票,初始有m金币,每天都可以无限次买卖,问最后最多可以达到多少金币。解题思路:考试中一定要学会面向数据编程!1、对于 10%10% 的数据,......
  • 2024.06.04《个人总结》
      (大二下)课程总结——软件工程 1)回顾你的课程计划(第一周的计划),你完成的程度如何?请列出具体数据和实际例子。  1.你在这门课的计划是什么?参考一些学校的教学,你对这个课程有什么期待?你打算怎样度过这个课程?    计划就是尽力跟上建民老师的节奏同时,还能主动学习......
  • 2024.06.05
    【题目描述】编写程序,使用牛顿迭代法求方程在x附近的一个实根。【练习要求】请给出源代码程序和运行测试结果,源代码程序要求添加必要的注释。【输入格式】请在一行中输入方程系数a、b、c、d和实数x,数据中间以空格为间隔。【输出格式】对每一组输入的数据,输出牛顿迭代法求出的实根(......
  • 2024.06.06
    完成概率论、计网作业并提交python实验:importrefromcollectionsimportCounterimportrequestsfromlxmlimportetreeimportpandasaspdimportjiebaimportmatplotlib.pyplotaspltfromwordcloudimportWordCloudheaders={"User-Agent":"Mozilla/5.0(Wi......
  • Zgo - Writing to a file
     packagemainimport("bufio""fmt""io""os")funcmain(){buffer:=[]byte("Datatowrite\n")f1,err:=os.Create("f1.txt")iferr!=nil{fmt.Pri......
  • Mariadb版本的JDBC驱动,连接云上Mysql出现连接超时
    记录一下一个小问题的解决,Mariadb驱动连接云上Mysql的时候,如果频繁连接偶尔出现读取超时的现象。通过分析报错的堆栈发现,在 org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol#postConnectionQueries这个方法里面有一个判断,usePipelineAuth默认为true,导致设置sock......