Como habilitar HTTP2 em projetos Spring Boot

Valdemar Júnior
4 min readNov 26, 2024

--

Arquitetura das diferenças entre HTTP 1.1 vs HTTP 2.0

Antes de habilitarmos o HTTP 2.0 é preciso entender as diferenças e vantagens entre essas duas versões e se é válido a evolução da versão.

Diferenças entre HTTP 1.1 vs HTTP 2.0

Basicamente a versão HTTP 2.0 resolve vários problemas de performance que os criadores do HTTP 1.1 não previram e principalmente o HTTP 2.0 é muito mais rápida e eficiente.Criando um projeto de exemplo

Para um melhor entendimento da história entre as duas versões, recomendo a leitura: HTTP/2 x HTTP/1.1: como eles afetam o desempenho na web?

Outra principal diferença entre as versões é que o HTTP 2.0 é um protocolo binário, enquanto o HTTP 1.1 é textual. Com um protocolo binário é mais fácil saber o começo e fim dos pacotes, o que é bem mais complicado de fazer com protocolos textuais.

Entre as principais novas funcionalidades do HTTP 2.0, são:

  • Fluxos multiplexados: A mesma conexão TCP pode carregar diferentes recursos, como javascript, imagens e etc, conforme representado na imagem desse artigo.
  • Prioridades: Alguns recursos da página são carregados de acordo com a prioridade, por exemplo, quando um usuário está no rodapé da página, os recursos(imagens) daquela parte da página poderão ser carregados primeiros do que os recursos do topo da página.
  • Compressão do cabeçalho: Evita o envio de headers repetidos, por ser um protocolo stateless(sem estado), além de suportar um tipo de compressão dedicado aos headers.
  • Segurança: Nessa versão, as requisições são feitas em cima do protocolo HTTPS, com isso temos mais segurança e privacidade na transmissão dos dados através da rede.

Para mais detalhes sobre o assunto, recomendo ouvir o episódio do Hipsters Podcast sobre o assunto HTTP2.

As vantagens sobre usar a versão HTTP 2.0 são inumeras, mas trouxe os pontos mais importantes, mas o assunto para esse artigo é sobre a configuração dessa versão em um projeto Spring Boot.

Criando um projeto de exemplo

Se preferir pode utilizar o meu Catálogo de Projetos usando Spring CLI ou escolher qualquer projeto do meu repositório de exemplos usando Spring Boot 3.

Vamos criar um projeto de exemplo para usamos como referência para configurá-lo para usar o HTTP2. Usando o https://start.spring.io, crie um projeto simples usando as dependências abaixo:

  • Maven
  • Java 23
  • Spring Boot 3.3.x
  • Com a dependência: Spring Web

Depois de gerado. abra o projeto na sua IDE favorita e vamos começar a configurar o HTTP2.

Criando um endpoint simples

Vamos criar um endpoint simples e subir nossa aplicação:

@RestController
public class TestController {

@GetMapping
public String test() {
return "successful";
}
}

Para subir a aplicação basta executar o comando na raiz do projeto:

$ mvn clean spring-boot:run

Em seguida execute o comando:

$ curl http://localhost:8080

Que deve retornar successful.

Habilitando HTTP2 no Spring Boot

Eu pessoalmente prefiro trabalhar com o application no formato yml, vamos renomear o arquivo application.properties para application.yml. Em seguida vamos habilitar o HTTP2 e reinicializar a aplicação.

server:
http2:
enabled: true

Agora vamos chamar o endpoint novamente para validar a versão do HTTP utilizado. Para isso execute o curl abaixo:

$ curl -sI http://localhost:8080

Isso irá trazer uma resposta similar a essa:

HTTP/1.1 200
Content-Type: text/plain;charset=UTF-8
Content-Length: 10

Como podemos perceber na primeira linha, a resposta foi HTTP/1.1 200T e o motivo para isso que é o HTTP2 só funciona em protocolos HTTPS. Agora vamos habilitar o HTTPS na nossa aplicação e se é realmente esse componente que está faltando.

Habilitando o HTTPS

Para habilitarmos o HTTPS é preciso gerarmos um certificado SSL(Security Socket Layer). Para gerarmos esse certificado, podemos fazer de algumas formas:

Para propósitos de testes, iremos utilizar o certificado autoassinado. Para isso, abra um Terminal e execute o comando para gerar o certificado(Fonte: Let’s Encrypt):

$ openssl req -x509 -out localhost.crt -keyout localhost.key \
-newkey rsa:2048 -nodes -sha256 \
-subj '/CN=localhost' -extensions EXT -config <( \
printf "[dn]\nCN=localhost\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:localhost\nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth")

Esse comando irá gerar dois arquivos localhost.crt, que é chave pública e o localhost.key, que é a chave privada.

Agora iremos utilizar o comando do openssl para gerar o arquivo .p12 que possui tanto o certificado quanto a chave:

openssl pkcs12 -export -in localhost.crt -inkey localhost.key -name localhost -out localhost.p12

O resultado desse comando é o arquivo localhost.p12 que iremos usar na nossa aplicação. Agora copie esse arquico e adicione a pasta src/main/resources dentro do nosso projeto e adicione as seguintes propriedades ao nosso application.yml.

IMPORTANTE: Tenha certeza que o no valor <password> seja substituído com a senha criada ao gerar o arquivo PKCS. Para aplicações em produção é recomendado que essa senha seja adicionada a uma variável de ambiente

# Changes the server port used by Spring Boot to the default one used for HTTPS on Tomcat
server.port=8443
# The format used for the keystore. It could be set to JKS in case it is a JKS file
server.ssl.key-store-type=PKCS12
# The path to the keystore containing the certificate
server.ssl.key-store=classpath:localhost.p12
# The password used to generate the certificate
server.ssl.key-store-password=<password>
# The alias mapped to the certificate
server.ssl.key-alias=localhost

Isso deve ser o suficiente para habilitarmos o HTTPS dentro da nossa aplicação.

Vamos colocar nossa aplicação pra teste

Agora vamos reincializar nossa aplicação e executar o curl para o nosso endpoint para testar a nossa aplicação:

curl -k -sI https://127.0.0.1:8443

A resposta deve ser algo similar ao mostrado abaixo, mostrando que o HTTP2 foi habilitado com sucesso:

HTTP/2 200
content-type: text/plain;charset=UTF-8
content-length: 10

Conclusão

Agora sim temos a nossa aplicação está habilitada para utilizar o HTTP2.

Se você gostou do artigo, por favor não deixe de bater palmas 👏 (você pode fazer várias vezes), me seguir, ou até mesmo me comprar um café https://www.buymeacoffee.com/valdemarjuniorr

--

--

Valdemar Júnior
Valdemar Júnior

Written by Valdemar Júnior

Escrevo sobre lições aprendidas, estudos, dicas de produtividade e assuntos relacionados a Java, Spring e seus ecosistemas. Gosto de compartilhar conhecimento

No responses yet