netty http2 server
http2的编解码类和Http2MultiplexHandler
与netty 的http1.1类似,http2也需要相应的编解码器,另外还需要一个处理http2连接通道复用的Handler。如下:
ChannelHandler | Desc |
---|---|
io.netty.handler.codec.http2.Http2FrameCodec | 负责http2帧和消息的编解码 |
io.netty.handler.codec.http2.Http2MultiplexHandler | 负责流的连接通道复用,将Stream转换为Http2MultiplexHandlerStreamChannel |
在构建Http2FrameCodec时,可以通过Http2Settings类对流和数据帧进行设置,覆盖默认其默认值。相应方法如下:
Method | Key | Desc |
---|---|---|
headerTableSize(long) | HEADER_TABLE_SIZE | 设置表头大小 |
maxConcurrentStreams(long) | MAX_CONCURRENT_STREAMS | 设置流并数数 |
initialWindowSize(int) | INITIAL_WINDOW_SIZE | 设置初始窗口大小 |
maxFrameSize(int) | MAX_FRAME_SIZE | 设置数据帧大小上限 |
maxHeaderListSize(long) | MAX_HEADER_LIST_SIZE | 设置header数据的大小上限(多个header数据帧的大小相加) |
pushEnabled(boolean) | ENABLE_PUSH | 设置是否启用推送 |
demo
示例代码如下:
import io.netty.bootstrap.ServerBootstrap;
import io.netty.buffer.PooledByteBufAllocator;
import io.netty.channel.*;
import io.netty.channel.epoll.Epoll;
import io.netty.channel.epoll.EpollEventLoopGroup;
import io.netty.channel.epoll.EpollServerSocketChannel;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.http2.*;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.ssl.*;
import io.netty.handler.ssl.util.SelfSignedCertificate;
import io.netty.util.concurrent.DefaultThreadFactory;
import lombok.extern.slf4j.Slf4j;
import javax.net.ssl.SSLException;
import java.net.InetSocketAddress;
import java.security.cert.CertificateException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ThreadFactory;
@Slf4j
public class HttpServer {
static final String NETTY_EPOLL_ENABLE_KEY = "netty.epoll.enable";
static final String OS_NAME_KEY = "os.name";
static final String OS_LINUX_PREFIX = "linux";
static final String EVENT_LOOP_BOSS_POOL_NAME = "NettyServerBoss";
static final String EVENT_LOOP_WORKER_POOL_NAME = "NettyServerWorker";
private static final int DEFAULT_SETTING_HEADER_LIST_SIZE = 4096;
private static final int MIB_8 = 1 << 23;
private static final int DEFAULT_MAX_FRAME_SIZE = MIB_8;
private static final int DEFAULT_WINDOW_INIT_SIZE = MIB_8;
private static final int KIB_32 = 1 << 15;
private static final int DEFAULT_MAX_HEADER_LIST_SIZE = KIB_32;
public static final Http2FrameLogger