spring boot+netty开发简单IM应用(一)

本篇博文探讨如何结合Netty与Spring Boot构建即时通讯(IM)服务。文中详细介绍了消息协议的设计、支持的请求协议及服务的横向扩展计划,并通过自定义握手流程展示了从零开始的开发过程。

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

很早就关注netty,且现在公司的asr架构离不开netty,数据的传输基本都是通过tcp长连接进行的,所以在闲暇之余正好学习下spring boot 微服务 与netty的相结合,做一个简单的IM服务应用。

首先有几点思路需要确定:

1、消息协议的制定,这里包括了很多需要思考的地方,整体消息协议暂定未现今流行的json。

2、支持webscoket、http、https等请求协议。

3、服务可横向扩展,支持分布式扩容,加入zookeeper势在必行,当然不是现在。

看起来还是比较庞大,所以这一章先设法对服务accept做出设计以及简单的代码编写,先定义清楚Handshaking method:

客户端发起的消息:

{"uuid":"xxxx","msgType":"conn","usrId":1000@android/ios,"version":100,"success":true}

id:客户端生成的id

msgType:表示消息类型,通俗意义是那个说,我们要做什么操作,该属性主要是对应服务器上的Handler

usr:这里表示用户信息的意思,其实后边这个字符串代表2个含义,@之前是用户id,@之后是用户的手机版本,我们要获取用户的手机版本,分开写也可以,但是在这里感觉没必要分开就直接何在一起了

version:用户当前该软件的版本号,主要是为了检查用户手机上当前版本用的

服务器收到登录信息,返回给用户:

{"uuid":"xxxx","msgType":"conn","ssl":"[1]","rar":"[1,2]","ips":"[]"}

id:没什么好说的,服务器端生成的id

msgType:消息类型,通俗说即使表示响应的哪一个action,例如连接阶段用户发送act是conn的话,那么这里响应回来action也是conn,相对应

ssl:这里我们用了一个数组,其实前期用一个值也是没问题的,但是后期我们可能有还能多种加密方式,所以用数组,目前还不写这块。

rar:这里也是一个数组,表示数据传输的压缩方式,这里实际就是在解码器上会做的事情,当然目前我是还没打算写这块代码。

ips:这里表示空闲服务器列表,便于用户选择一个压力小的服务器

上面是一次客户端到服务端的Handshaking message

下面结合spring boot与netty开始写一个简单的握手流程,由于协议是自定义,自由度就相对的高了非常多,当然如果你用过其它的通讯服务相对比的话。

先上一张简单的UML图


那么,编码的第一步肯定是先把spring boot工程拉出来,通过spring的官方网站,轻松的拉出了一个spring boot 的maven工程,下面看看工程内容,pom引用有哪些



包是不是很少?实际上当maven update结束后,打开maven jar目录会发现,spring boot做了很多事情,包括集成了tomcat



然后创建你的package,创建SpringBootSampleApplication类,代码如下,@SpringBootApplication  注解代表@Configuration,@EnableAutoConfiguration,@ComponentScan。

接着写一个hello word来测试一下你的工程搭建是否成功的,创建一个controller,加上注解@RestController ,写一个方法加上@RequestMapping("/") return一个String 为"hello word",ok,启动SpringBootSampleApplication。在游览器中键入http://localhost:8080,你将看到一个hello word,证明你的工程可用。


那么接下来,阐述一下,利用spring boot扮演什么样的角色,spring boot是微架构,致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。所以利用spring boot结合netty的bootstrap 客户端 对外提供 im 能力个人认为是非常容易的,接下来首先定义好消息的pojo    SessionVO 属性就是之前定义好的Handshaking 消息内容,建立几个Handshaking Controller 服务提供给user,如下:

LoginController提供登录握手接口,入参是用户的userId,这是每个用户唯一的标识,是必需的,登录时会发送消息到service,service回传成功标识的msg,当然长时间未收到返回消息需将会抛出异常。

LogoutController登出服务的接口,实际上就是优雅的close netty的channel。

SendMsgController消息发送的服务,这里只是测试。

另外还要创建一个netty 的bootstrap客户端程序,必须是异步的,利用线程隔开各个客户端,且异步线程数是可控的等等。

后面的内容还是在下一周的分享继续吧,哈哈哈哈哈~





Spring Boot个快速开发框架,Netty个高性能的网络通信框架,WebSocket是种基于TCP协议的双向通信协议。将它们结合起来实现IM系统种非常好的选择。 以下是实现步骤: 1. 创建Spring Boot项目,添加Netty和WebSocket依赖。 2. 创建WebSocket处理器,继承自Netty的SimpleChannelInboundHandler,并实现WebSocketServerProtocolHandler.ServerHandshakeStateEvent事件。在这个处理器中,可以处理连接建立、消息发送和接收等操作。 3. 创建WebSocket服务器,使用Netty的ServerBootstrap和EventLoopGroup创建个监听端口的服务器。在服务器启动时,将WebSocket处理器添加到ChannelPipeline中。 4. 创建WebSocket客户端,使用NettyBootstrap和EventLoopGroup创建个连接到服务器的客户端。在客户端连接成功时,发送握手请求,并在握手成功后发送消息。 5. 在Spring Boot项目中创建个消息处理器,用于处理从WebSocket客户端接收到的消息。可以使用Spring的消息队列来处理这些消息。 6. 在Web界面上添加WebSocket客户端,使用JavaScript编写WebSocket客户端代码,连接到服务器并发送消息。在收到服务器发送的消息时,将其显示在Web界面上。 通过以上步骤,就可以实现个基于Spring BootNetty和WebSocket的IM系统。用户可以在Web界面上发送和接收消息,服务器和客户端之间的通信是双向的。这种实现方式具有高性能、高可靠性和高扩展性,可以应用于各种实时通信场景。
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值