Dubbo passa a suportar oficialmente Spring 6 e Spring Boot 3

Introdução ao Apache Dubbo

O Apache Dubbo é um framework de desenvolvimento de serviços RPC projetado para resolver problemas de comunicação e governança em arquiteturas de microsserviços. Oferece SDKs nativos para múltiplas linguagens, incluindo Java e Go, permitindo que os serviços tenham capacidade integrada de descoberta remota e comunicação inter-serviços. Com características avançadas como balanceamento de carga, roteamento de tráfego e extensibilidade, o Dubbo facilita a implementação de lógica personalizada para interceptação e seleção de rotas.

Contexto da atualização

O lançamento do Spring Framwork 6.0 e do Spring Boot 3.0 marcou uma mudança significativa no ecossistema Java: ambos exigem no mínimo JDK 17. Isso representa um desafio para muitas equipes ainda dependentes do JDK 8, embora versões LTS mais recentes — como o Java 11 e especialmente o Java 17 — tenham trazido melhorias substanciais em desempenho, sobretudo com o ZGC (Garbage Collector Zero). A adoção do JDK 17 tem crescido entre empresas que buscam otimizações de throughput e latência.

Diante disso, o Spring estabeleceu uma nova base tecnológica com suporte de longo prazo. Embora as versões 5.x e 2.x ainda sejam mantidas, seu ciclo de vida terminará em 2025–2026. Assim, migrar para o Spring 6 e Spring Boot 3 torna-se estratégico para garantir sustentabilidade futura.

Suporte do Dubbo ao Spring 6 e Spring Boot 3

O projeto Dubbo demonstrou agilidade ao acompanhar essas mudanças. Desde as versões RC dos novos frameworks, o time já trabalhava na compatibilidade. Após o lançamento estável do Spring Boot 3.0, foi anunciada oficialmente a compatibilidade completa a partir da versão dubbo-3.2.0-beta.3.

Agora, o starter principal pode ser integrado diretamente em projetos Spring Boot 3:

<dependency>
  <groupId>org.apache.dubbo</groupId>
  <artifactId>dubbo-spring-boot-starter</artifactId>
  <version>3.2.0-beta.3</version>
</dependency>

Exemplos completos estão disponíveis no repositório oficial apache/dubbo-samples, cobrindo desde configurações básicas até cenários complexos.

Diretrizes para migração

Para ajudar outras bibliotecas e equipes a realizarem a transição, o Dubbo compartilhou aprendizados cruciais durante sua adaptação.

Transição para Jakarta EE

Com o Jakarta EE 9, todos os pacotes foram movidos de javax.* para jakarta.*, resultado direto da transferência da stewardship da plataforma Java EE da Oracle para a Eclipse Foundation. Projetos devem atualizar suas dependências para servidores compatíveis, como Tomcat 10+, Jetty 11 ou Undertow 2.2.19.

Ferramentas recomendadas para automatizar essa migração incluem:

Substituição de spring.factories por AutoConfiguration.imports

O mecanismo antigo baseado em META-INF/spring.factories foi descontinuado no Spring Boot 3. O novo padrão utiliza o arquivo:

META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

Cada linha deve conter o nome completo da classe de autoconfiguração, por exemplo:

org.example.MyServiceAutoConfiguration
org.example.MyWebExtensionAutoConfiguration

Embora o uso de @Configuration(proxyBeanMethods = false) ainda funcione, recomenda-se adotar @AutoConfiguration para clareza semântica e alinhamento com boas práticas.

Mudança no formato padrão de logs

O formato de data nos logs agora segue rigorosamente o padrão ISO-8601:

yyyy-MM-dd'T'HH:mm:ss.SSSXXX

Exemplo: 2024-03-15T14:23:01.456+08:00. Essa alteração adiciona informação explícita de fuso horário, essencial para ambientes disrtibuídos.

Remoção do YamlJsonParser

Devido a limitações no parsing JSON, o YamlJsonParser (baseado no SnakeYAML) foi removido como opção padrão. O Spring Boot 3 agora prioriza parsers dedicados:

  1. JacksonJsonParser
  2. GsonJsonParser
  3. BasicJsonParser

Atualizações nas propriedades de configuração

Várias chaves foram renomeadas para refletir melhor sua dependência de módulos específicos:

  • spring.redis.hostspring.data.redis.host
  • spring.data.cassandra.portspring.cassandra.port

Além disso, spring.session.store-type foi removido; a detecção agora ocorre automaticamente na ordem: Redis, JDBC, Hazelcast, Mongo.

HttpMethod como classe, não enum

Seguindo a RFC 7231 (sucessora da RFC 2616), o tipo HttpMethod foi convertido de enum para classe, permitindo métodos HTTP extensíveis, como LOCK, COPY e MOVE, usados em WebDAV.

Correspondência estrita de caminhos URI

No Spring 6, os caminhos /resources e /resources/ são tratados como distintos. Para manter compatibilidade, é necessário configurar redirecionamentos explícitos via filtro Servlet, proxy reverso ou controladores dedicados.

Nova anotação @HttpExchange

O Spring 6 introduz @HttpExchange, que permite definir interfaces tipadas para clientes HTTP, reduzindo boilerplate em chamadas remotas.

Melhorias no carregamento de SPI

O SpringFactoriesLoader foi expandido para suportar múltiplos arquivos de configuração personalizados, não apenas spring.factories, permitindo composição modular de extensões.

Suporte antecipado a virtual threads (JDK 19+)

O Spring 6 habilita o uso de virtual threads (projeto Loom), permitindo escalabilidade massiva com milhares de threads leves. Aplicações podem ativar esse recurso facilmente em servidores compatíveis.

Suporte a RFC 7807 Problem Details

Erros HTTP agora podem retornar corpos estruturados no formato application/problem+json:

{
  "type": "https://example.org/problems/unknown-project",
  "title": "Unknown project",
  "status": 404,
  "detail": "No project found for id 'spring-unknown'",
  "instance": "/projects/spring-unknown"
}

Próximos passos: rumo à execução nativa

Apesar das vantagens do JVM, aplicações Java tradicionais enfrentam críticas por alto consumo de memória, tempo de inicialização lento e grande footprint de imagem. O Dubbo está investindo em suporte a compilação nativa com GraalVM, visando:

  • Compatibilidade com Spring Native
  • Imagens menores e mais eficientes
  • Inicialização em dezenas de milissegundos
  • Baixo consumo de RSS (Resident Set Size)
  • Resposta rápida ao primeiro request, eliminando a necessidade de aquecimento JIT

Esses avanços são fundamentais para microsserviços em nuvem, onde densidade de contêineres e custo operacional são fatores críticos.

Tags: dubbo Spring Boot 3 Spring 6 Jakarta EE GraalVM

Publicado em 8-19 05:50