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

很早就关注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+netty开发简单IM应用(一)_第1张图片

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

spring boot+netty开发简单IM应用(一)_第2张图片


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

spring boot+netty开发简单IM应用(一)_第3张图片


然后创建你的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,netty)