A Apache Software Foundation recentemente anunciou o Apache Dubbo como um projeto top-level. O Apache Dubbo é um framework RPC (remote procedure call) open source baseado em Java. Foi inicialmente desenvolvido no Alibaba, teve o código aberto em 2011, e entrou para o Apache Incubator em fevereiro de 2018. O Dubbo traz funcionalidades chave tais como chamada remota baseada em interface, tolerância a falhas e load balancing, e service registration e discovery automáticos.
Vamos dar uma olhada na arquitetura do Dubbo:
- O
Container
é responsável por inicializar, carregar e executar o serviçoProvider
. - O
Provider
registra seus serviços para oRegister
durante a inicialização. - O
Consumer
subscreve os serviços de que necessita doRegister
durante a inicialização. - O
Register
retorna a lista deProvider
s para oConsumer
, e quando uma alteração acontece, oRegister
envia os dados alterados para oConsumer
. - Com base no algoritmo de soft load balancing, o
Consumer
seleciona um dosProvider
s e executa a invocação, e quando uma falha acontece seleciona outroProvider
automaticamente. - Ambos
Consumer
eProvider
vão contar o número de invocações e tempo de consumo em memória, e enviarão as estatísticas para oMonitor
a cada minuto.
As funcionalidades do Apache Dubbo incluem:
- Uma interface transparente baseada em RPC;
- Load balancing inteligente, que suporta uma série de estratégias de load balancing;
- Service registration and discovery automáticos;
- Design de alta extensibilidade, micro-kernel e plug-in, o que garante fácil extensibilidade através de implementações de terceiros em todos os principais recursos, como protocolo, transporte e serialização;
- Roteamento de tráfego em tempo de execução, que permite alterações na configuração em tempo de execução de maneira que o tráfego pode ser roteado de acordo com diferentes regras, facilitando o suporte a publicações do tipo blue-green deployment, etc;
- Governança de serviço visualizada, que fornece ferramentas ricas para a governança e manutenção dos serviços tais como busca de metadados dos serviços, health status, e estatísticas.
Para começar a usar o Dubbo, primeiro adicione a dependência maven:
<dependencies>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.2<</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<version>2.7.2<</version>
<type>pom</type>
</dependency>
</dependencies>
Agora, vamos definir uma interface de serviço e implementá-la no provider:
package org.apache.dubbo.samples.api;
//service interface
public interface GreetingService {
String sayHello(String name);
}
//provider, implementation of service interface
public class GreetingServiceImpl implements GreetingService {
@Override
public String sayHello(String name) {
return "Hello " + name;
}
}
Agora vamos configurar o provider:
package org.apache.dubbo.demo.provider;
import org.apache.dubbo.config.ApplicationConfig;
import org.apache.dubbo.config.RegistryConfig;
import org.apache.dubbo.config.ServiceConfig;
import org.apache.dubbo.samples.api.GreetingService;
import java.io.IOException;
public class Application {
public static void main(String[] args) throws IOException {
ServiceConfig serviceConfig = new ServiceConfig();
serviceConfig.setApplication(new ApplicationConfig("first-dubbo-provider"));
serviceConfig.setRegistry(new RegistryConfig("multicast://224.5.6.7:1234"));
serviceConfig.setInterface(GreetingService.class);
serviceConfig.setRef(new GreetingServiceImpl());
serviceConfig.export();
System.in.read();
}
}
Então construir e executar:
# mvn clean package
# mvn -Djava.net.preferIPv4Stack=true -Dexec.mainClass=org.apache.dubbo.demo.provider.Application exec:java
O trecho de código a seguir demonstra como criar um consumer:
package org.apache.dubbo.demo.consumer;
import org.apache.dubbo.config.ApplicationConfig;
import org.apache.dubbo.config.ReferenceConfig;
import org.apache.dubbo.config.RegistryConfig;
import org.apache.dubbo.samples.api.GreetingService;
public class Application {
public static void main(String[] args) {
ReferenceConfig referenceConfig = new ReferenceConfig();
referenceConfig.setApplication(new ApplicationConfig("first-dubbo-consumer"));
referenceConfig.setRegistry(new RegistryConfig("multicast://224.5.6.7:1234"));
referenceConfig.setInterface(GreetingService.class);
GreetingService greetingService = referenceConfig.get();
System.out.println(greetingService.sayHello("world"));
}
}
Iniciar um novo projeto usando o Dubbo é muito simples; é possível iniciar da maneira que fizemos acima, ou através do Dubbo Spring initializr, que é basicamente um fork do Spring initializr. Além disso, além do Java, o Dubbo suporta Node.js, Python, e PHP.
Empresas como Alibaba Group, China Life, China Telecom, Dangdang, Didi Chuxing, Haier, Industrial and Commercial Bank of China, NetEase, Qunar, e Youzan estão usando o Apache Dubbo.
Maiores detalhes sobre o Dubbo podem ser encontrados em https://dubbo.apache.org. Desenvolvedores que quiserem contribuir devem acessar o contributor guide. Há também uma documentação disponível.