J'ai construit un pipeline simple pour servir du contenu HTTP / 1.1 avec Netty, et je cherche à voir comment je peux le convertir en HTTP / 2. Je vois différentes classes pour la conversion entre les cadres et la négociation, mais je ne peux pas comprendre comment les assembler dans un pipeline. Le code suivant est en Kotlin. Le principal problème que j'ai concerne la négociation ALPN et la conversion des trames dans les deux sens.

val bootstrap = ServerBootstrap()
bootstrap.group(transport.bossGroup, transport.workerGroup)
    .channelFactory(transport.factory)
    .childHandler(object : ChannelInitializer<SocketChannel>() {
        public override fun initChannel(ch: SocketChannel) {
            ch.pipeline().addLast("ssl", sslContext.newHandler(ch.alloc()))

            ch.pipeline().addLast("codec", HttpServerCodec())
            ch.pipeline().addLast("keepAlive", HttpServerKeepAliveHandler())
            ch.pipeline().addLast("aggregator", HttpObjectAggregator(65536))

            ch.pipeline().addLast("burstLimiter", burstLimiter)

            ch.pipeline().addLast(
                "readTimeoutHandler",
                ReadTimeoutHandler(60)
            )
            ch.pipeline().addLast(
                "writeTimeoutHandler",
                WriteTimeoutHandler(60)
            )

            ch.pipeline().addLast("streamer", ChunkedWriteHandler())
            ch.pipeline().addLast("handler", CustomHandler(httpHandler))
        }
    })
3
QuyNguyen2013 28 févr. 2021 à 05:45

2 réponses

Meilleure réponse

Je pense que la solution la plus simple serait d'utiliser le Http2MultiplexHandler avec le Http2StreamFrameToHttpObjectCodec. Cela vous permettra de parler HTTP2 tout en vous fournissant les mêmes «objets» dans votre gestionnaire qu'avec HTTP1.

Ce serait donc quelque chose comme:

ch.pipeline().addLast(Http2FrameCodecBuilder.forServer().build());
ch.pipeline().addLast(new Http2MultiplexHandler(new ChannelInitializer<Channel>() {
    @Override
    protected void initChannel(Channel ch) {
        ch.pipeline().addLast(new Http2StreamFrameToHttpObjectCodec(true));
        // Add all your other handlers that act on HTTP1 objects
    }
});

Si vous avez également besoin d'ajouter des gestionnaires pour SSL, etc., cela dépend un peu de votre cas d'utilisation.

Pour un exemple plus détaillé, vous pouvez également consulter les exemples de multiplex http2 qui font partie de netty lui-même. Ceux-ci gèrent H1 / H2 en même temps en fonction de ce que le client demande.

1
Norman Maurer 4 mars 2021 à 14:59

Qu'en est-il d'une solution sans code - par exemple front-end netty avec Apache - laissez Apache faire le HTTP / 2 pour vous? Et puis il suffit de transmettre le trafic à votre pipeline voir le guide Apache HTTP2 How To

0
Mr R 4 mars 2021 à 04:55