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