背景
我们即将迎来一个万物互联的时代。而在这样的时代里,最大的机遇是什么呢?有人说是智能硬件的普及,有人说是人工智能的天下,有人说是大数据的时代……都没错。但我认为,万物互联,首先不是得让万物都连上网么?
从大型机、到个人PC时代,再到智能手机的普及……每一次硬件的变革,都是设备体积的减小和芯片密度的增加。同时,每一次革新,连上网的设备数量都在呈指数级的增涨。我们可以想象,到了万物互联的时代,连上网的设备数量必定还要有一个数量级的增涨。
目前大部分物联网设备,对于网络有一个共通的特点:就是本身通信的数据量不大,但是对数据流量敏感,往往需要长连接以保持即时的响应。基于这样的特点,物联网采用HTTP轮询的方式自然是不靠谱不专业的,即浪费流量资源又对服务器产生过多的压力负担。
所以,我们需要一个基于TCP/UDP协议的通信框架来满足节省数据流量的需求,同时由于需要最大限度地挖掘服务器潜力,同时维护尽可能多的长连接,所以我们需要异步IO的TCP/UDP协议的通信框架。
通过这样的圈定,Netty就进入了我们的视线中。基于Java NIO技术,让它能同时维护和响应大量的长连接。另外,它已经在电信软件、网络游戏、企业级应用及大型分布式服务开源系统中广泛使用,因此稳定性、健壮性有可靠保障。
Netty已经解决了大量Java NIO底层的bug,并且在Linux服务器环境下,Java NIO和AIO的实现方式相同,所以基于Java的异步IO网络框架,Netty有着很大的市场占有率。(关于Java的几种IO模式的网络编程异同,可参考我另一篇文章《BIO、NIO、AIO的编程对比》)
开发环境配置
IDE
Netty是一个java项目,所以用我们常用的Java项目开发工具就可以开发基于Netty的应用。例如:Eclipse、IntelliJ IDEA等。
引入库
Netty官网地址:http://netty.io/
Netty是由一系列jar库构成的,官网上下载jar包,或者通过Maven引入对应的库就可以正常使用。例如我使用的稳定版本为4.0.28.Final。Maven引入方式为:
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.0.28.Final</version>
</dependency>
Netty官方出了多个版本,主要包括:
- 3.x
- 4.0.x
- 4.1.x
- 5.x
很多朋友不知道如何选择,还有一些认为版本号越大说明越新则越好。这是不对的。下面简单介绍一下各版本的特点:
- 3.x 已经不建议使用,现在还在维护只是因为一些老项目还在广泛的使用它。
- 4.0.x 稳定版。当你不知道用哪个版本时,使用这个版本不会有问题。
- 4.1.x 是基于4.0.x的新版本。它完全兼容4.0.x的API,并且支持一些新的特性。例如:HTTP/2、异步DNS解析器等。所以当你的项目已经稳定运行4.0.x之后,想尝试新的特性的时候,可以开始使用4.1.x。
- 5.x 一个未完成就被废弃的版本。详细被废弃的原因见作者在github上的说明:Remove master branch。
基于此,我们选择了4.0.x作为主要使用的Netty版本。
打包、部署
基于Netty开发的项目,通常都是非Web的Java应用。所以只需要打包为一个普通的jar包就可以正常使用。
为了jar包更方便运行,我们一般会给jar包指定一个入口类及入口的main函数。运行jar包,就会直接从这个入口类的main函数开始执行。例如我们可以在Maven中这样配置:
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.okeytime.smartwatch.server.corelogic.SmartWatchServer</mainClass>
</manifest>
</archive>
</configuration>