使用spring容器管理和配置netty
为了使程序达到方便配置和管理,spring的ioc容器是特效药之一。本文将使用ioc来管理和配置netty服务器
- 服务端使用Reactor多线程模型,详见 李林锋老师的博文 Netty系列之Netty高性能之道
在本程序中Reactor Thread Acceptor对应BossGroup,Reactor Thread
Pool对应WorkerGroup
1. netty和spring的maven依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.0.10.Final</version>
</dependency>
java代码结构解析
1. 服务器管理接口
public interface Server {
public interface TransmissionProtocol{
}
// 服务器使用的协议
public enum TRANSMISSION_PROTOCOL implements TransmissionProtocol {
TCP,UDP
}
TransmissionProtocol getTransmissionProtocol();
// 启动服务器
void startServer() throws Exception;
void startServer(int port) throws Exception;;
void startServer(InetSocketAddress socketAddress) throws Exception;
// 关闭服务器
void stopServer() throws Exception;
InetSocketAddress getSocketAddress();
}
2. 服务器初始化配置接口
public interface NettyServer extends Server
{
/**
* ServerBootstrap创建成功后会有一个ChannelInitializer(即pipeline factory), 本方法主要用于获取这个
* ChannelInitializer
*
* @return
*/
public ChannelInitializer<? extends Channel> getChannelInitializer();
/**
* 设置自己的ChannelInitializer
*
* @param initializer
* pipeline的工厂类,主要为每个新的链接创建一个pipeline
*/
public void setChannelInitializer(ChannelInitializer<? extends Channel> initializer);
/**
* 获取netty server的configuration
*
* @return .
*/
public NettyConfig getNettyConfig();
}
3. 基本服务器配置类
public abstract class AbstractNettyServer implements NettyServer
{
private static final Logger LOG = LoggerFactory.getLogger(AbstractNettyServer.class);
//用于管理所有的channel
public static final ChannelGroup ALL_CHANNELS = new DefaultChannelGroup("NADRON-CHANNELS", GlobalEventExecutor.INSTANCE);
protected final NettyConfig nettyConfig;
protected ChannelInitializer<? extends Channel> channelInitializer;
public AbstractNettyServer(NettyConfig nettyConfig,
ChannelInitializer<? extends Channel> channelInitializer)
{
this.nettyConfig = nettyConfig;
this.channelInitializer = channelInitializer;
}
@Override
public void startServer(int port) throws Exception
{
nettyConfig.setPortNumber(port);
nettyConfig.setSocketAddress(new InetSocketAddress(port));
startServer();
}
@Override
public void startServer(InetSocketAddress socketAddress) throws Exception
{
nettyConfig.setSocketAddress(socketAddress);
startServer();
}
@Override
public void stopServer() throws Exception
{
LOG.debug("In stopServer method of class: {}", this.getClass()
.getName());
ChannelGroupFuture future =