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":[email protected]/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,证明你的工程可用。
LoginController提供登录握手接口,入参是用户的userId,这是每个用户唯一的标识,是必需的,登录时会发送消息到service,service回传成功标识的msg,当然长时间未收到返回消息需将会抛出异常。
LogoutController登出服务的接口,实际上就是优雅的close netty的channel。
SendMsgController消息发送的服务,这里只是测试。
另外还要创建一个netty 的bootstrap客户端程序,必须是异步的,利用线程隔开各个客户端,且异步线程数是可控的等等。
后面的内容还是在下一周的分享继续吧,哈哈哈哈哈~