服务端怎么进行开发,或者说,用Netty怎样实现服务端的功能?
首先,需要对Netty有一个直观的了解,知道框架内部的几个重要的组件,以及组件之间的相互关系。这就需要初学者主动去学习一下了,官网和图书馆都有相关的资料,只要肯下功夫,这不是什么难题。
其次,还要求我们对SpringBoot有一定程度的了解,基于注解编程的方式,以及,简单的Java反射的应用。
下面,我们来着重分析一下,服务端开发中涉及到的内容:
1. 后台线程
通常情况下,NIO方面的网络编程,都会涉及到三种功能的线程:
A. 接受外部连接(或者建立与服务端连接)操作的线程;----- IO密集型的操作
B. 对二进制信息进行编解码转换的线程; ----- CPU密集型的操作
C. 业务逻辑处理方面的线程(可能涉及数据库操作); ----- 绝大多数情况下是IO密集型的操作,个别也有CPU密集的情况出现
我们在使用Netty的时候,任何网络状态的变化都会产生对应的事件,(比如 接受新的连接,连接可读,写入完成等等)每一类的事件都会有对应的Handler进行处理,总所周知,Handler里面写的是代码或者说是函数,而执行代码就需要线程调用对应的函数。Netty将线程池封装到了EventLoopGroup(通过类的继承实现的),A类线程构成bossGroup,B类线程构成workerGroup,C类线程需要自己创建线程池。如果程序只监听一个端口,那么bossGroup的线程数设置为1就足够了。workerGroup的数据量与CPU的核心数保持一致就好,如果程序中没有C类线程,那么,C类线程的事情估计就会由B类线程来完成,那么workerGroup的线程数量就会大一些(默认好像是CPU核心数的两倍)。C类线程的数量和配置数据库连接池的连接数量一样,要根据程序和经验来配置,少了的话服务端的性能达不到峰值,多了的话反而会降低服务器的性能。
2. Pipeline
Netty将通信双方的交互数据的处理过程(记录收发的二进制信息,将二进制信息进行编解码,对收发的数据进行业务处理等等)串成了一条链子,链子的每个节点都会对应的功能。这就是Pipeline组件,它将一系列的ChannelHandler连接起来,共同完成交互数据的处理过程。
我们的Demo程序涉及到的ChannelHandler如下:
A. LoggingHandler 记录网络交互过程中传输的二进制信息,开发时可以用来判断收发信息是否正确,以十六进制的形式显示;
B. GenericPackageCodec 通用编解码处理器,完成二进制与包头、Json串和包尾的相互转换;
C. GenericPackageClassifierCodec 通用包的分类编解码处理器,完成 Json串 和 Java对象 的相互转换;
D. NettyServerHander 完成服务端的业务处理。
3. NettyConfigure
上面我们介绍了主要的设计思路,有了大体的思路之后,我们需要将这些组件的相互关系进行设置,于是,就会构建一个NettyConfigure类,这个类是我自定义的Java类,存放配置信息,然后,用配置信息生成组件对象。
4. NettyServer
既然是服务端程序,自然要有一个对应的封装类,完成服务端程序的启动和停止。
如果上面所述的思路都理清楚了,就可以进入编码阶段了。后续我会将代码贴出来,大家可以多提一些意见和建议,但是,还是由衷的希望,先去学习一下Netty框架,看看核心组件的源代码,了解了实现原理,再进行讨论。莫要抄袭代码去完成作业,想要进步,还是要多吃苦才好。