1.2.3 网络编程项目实战

本文深入探讨了Netty在网络编程中的应用,包括推送系统的功能实现与优化,以及网易邮箱后端开发中的最佳实践。文章详细介绍了网络基础知识、WebSocket协议、TCP连接管理、Netty的职责链模式、多线程模型与ByteBuf优化技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.2.3.1 推送系统功能实现及系统优化

1、网络知识:是非常底层的内容
一定要按照课程顺序,逐个理解后,再继续看下一个
学习顺序:BIO —> NIO —> Reactor —> netty
2、YY、斗鱼,都是基于websocket实现的
3、网络四元组
如何定义不同的TCP连接 【 客户端ip 客户端端口 服务器ip 服务器端口】
4、心跳机制:是定时发送一个自定义的结构体(心跳包),让对方知道自己还活着,以确保连接的有效性的机制
短连接:请求/响应之后,关闭已经建立的TCP连接,下次请求再建立一次连接
长连接:请求/响应之后,不关闭TCP连接,多次请求,复用同一个连接
为了避免频繁创建连接/释放连接带来的性能损耗,以及消息获取的实时性,采用长连接的形式
5、粘包:Nagle算法-客户端累积一定量或者缓冲一段时间再传输。服务端缓冲区堆积。导致多个请求数据粘在一起
拆包:发送的数据大于发送缓冲区,进行分片传输。服务端缓冲区堆积,导致服务端读取的请求数据不完整

自研过于复杂,采用合适的开源协议(XMPP/MQTT/WebSocket…)

如果想搞懂网络协议:建议看《计算机网络原理》—教材版
数据发送接受过程

在这里插入图片描述

网络编程底层发送接受数据过程
在这里插入图片描述

6、WebSocket协议是基于TCP的一种新的网络协议
它的出现实现了浏览器与服务器全双工(full-duplex)通信:允许服务器主动发送信息给客户端

多客户端多语言多服务器支持:浏览器、php、java、ruby、nginx、python、Tomcat、erlang、.net等等

如果不知道怎么用netty的功能,就查看netty源码的example包下的示例代码

7、WebSocket在Js中的写法(长连接)
在这里插入图片描述

8、WebSocket在Java中的写法
在这里插入图片描述

1.2.3.2 网易后端开发中的Netty最佳实践(网易邮箱)

1、区分不同连接的方式
TCP连接四元组(服务器IP+服务器端口+客户端IP+客户端端口)
TCP连接个数(四元组)
在这里插入图片描述
2、centos命令使用(测试单机支撑百万连接)
1、启动服务端WebSocketServer(服务端开启20个端口):
java -Xmx4096m -Xms4096m -Dnetease.debug=true -cp netty-all-4.1.32.Final.jar:netty-push-1.0.0.jar com.study.netty.push.server.WebSocketServer
2、查看端口的进程id:netstat -naop | grep 9001
3、查看端口的连接数:netstat -nat|grep -i “9001”|wc -l
查看服务器当前总的连接数:netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a,S[a]}’
4、启动客户端WebSocketClient(发送100万个请求):
java -Xmx4096m -Xms4096m -Dnetease.debug=false -Dnetease.pushserver.host=192.168.3.31 -cp netty-all-4.1.32.Final.jar:netty-push-1.0.0.jar com.study.netty.push.client.WebSocketClient

启动客户端遇到的问题
一、java.net.NoRouteToHostException: No route to host //是因为服务端没有关闭防火墙
关闭防火墙操作
在这里插入图片描述
二、SocketException: Too many open files//是因为超出了单个用户可用的最大进程数量

修改单个用户可用的最大进程数量为100万

进程是操作系统用来管理资源的单位 —文件句柄/描述符

open files:一个进程能打开的文件数(操作系统中:一个网络连接,也算是一个文件打开数)

1、ulimit -a //查看参数配置情况

2、修改配置文件vi /etc/security/limits.conf
键盘点击enter键,直到最后一行(# End of file)
键入i(编辑文件)
在# End of file行的下一行开始输出如下配置:

  • soft nofile 1000000
  • hard nofile 1000000
    参数说明:
    soft nofile:单个用户可用的最大进程数量(软限制)
    hard nofile:单个用户可用的最大进程数量(硬限制)
    键盘点击Esc键(退出编辑)
    键盘点击Shift+q
    在冒号后面输入wq
    关掉Xshell对该地址的所有连接,再重新开一个连接,用ulimit -a查看,就可以看到open files就已经改过来了

服务端、客户端,都需要配置

修改后的效果“单个用户可用的最大进程数量
在这里插入图片描述
三、BindException: Cannot assign requested address//可能是客户端端口绑定异常
1、指定1024~65535的端口都可以被使用:echo “net.ipv4.ip_local_port_range= 1024 65535”>> /etc/sysctl.conf
2、使配置参数立即生效:sysctl -p

四、nf_conntrack: table full, dropping packet//连接跟踪表已满,开始丢包(需要修改防火墙配置)

查看操作系统日志:tail -f /var/log/messages(可以看到错误信息nf_conntrack: table full, dropping packet)

1、修改最大跟踪连接数为100万:echo “net.nf_conntrack_max= 1000000”>> /etc/sysctl.conf

2、使配置参数立即生效:sysctl -p
如果sysctl -p出现错误:sysctl: cannot stat /proc/sys/net/nf_conntrack_max: No such file or director
直接用Xftp将/etc/sysctl.conf文件复制到windows,在末尾加上两行:
net.ipv4.ip_local_port_range= 1024 65535
net.nf_conntrack_max= 1000000

保存,用sysctl.conf将centos中对应的文件覆盖,重新开Xshell连接

五、到这里基本上就不会报啥错了,可以用top命令看到空闲内存逐渐变小,机器越来越卡,我的是60多万连接,基本上就没往上涨了,因为单机支撑百万连接,没什么作用,原因如下:

1、JAVA 自动化的GC机制,GC时会Stop The World

2、JVM内存占用不宜太大生产环境接口后台普遍 6~8G、少部分处理大数据的/文件处理型的内存会大一些

并发连接 :连接不代表有数据交互

并发请求:同一时间发起多少请求

实际大部分情况下,高并发场景是用的(这1秒内处理了多少请求): QPS(查询) / TPS(事务型请求)

3、如何优化基于netty开发代码
3.1 职责链
共享handler(共享对象)
实现共享handler:在handler类上加注解@ChannelHandler.Sharable//标记hanlder可以被多个pipeline共享使用
这个注解包路径(io.netty.channel.ChannelHandler)
有成员变量、线程安全问题的hanlder不能被共享(出于极致性能的考虑),比如:ByteToMessageDecoder、编解码器
3.2 多线程(reactor线程模型)
耗时的业务处理应该交给业务线程池(work线程池)
线程(reactor线程模型)
在这里插入图片描述
初始化职责链时,就指定work线程池
在这里插入图片描述
3.3 ByteBuf零拷贝、对象复用、内存复用
对象复用:ByteBuf对象复用-release
在这里插入图片描述
1、如果ByteBuf被占用(正在被其他线程使用),会创建一个新的ByteBuf
2、如果继承SimpleChannelInboundHandler的channelRead方法中已经调用release方法,不需要自己处理
3.4 业务逻辑设计优化
大的响应内容,要拆分为多次 写 。防止I/O线程拥堵,导致其他请求处理过慢
大的响应内容,要拆分为多次 写
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值