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:
- Receitas do OpenRewrite (javaxmigrationtojakarta)
- Projeto Spring Boot Migrator (spring-boot-migrator)
- Suporte nativo no IntelliJ IDEA para refatoração assistida
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:
JacksonJsonParserGsonJsonParserBasicJsonParser
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.host→spring.data.redis.hostspring.data.cassandra.port→spring.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.