Conexión remota con Dubbo, Zookeeper y Spring Boot en entorno distribuido
Versión de Spring Boot: Aliyun 2.3.7
Objetivo de la implmeentación
Permitir que un consumidor en el主机 pueda llamar a los servicios implementados en un servidor virtual.
Configuración del proyecto
Configuración del pom.xml
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.18</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient -->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>5.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.6.2</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Configuración del proveedor
El proveedor se implementa en un servidor virtual con Ubuntu 20.04.
Pasos de configuración:
- Configurar los puertos 2181 y 21880 en la máquina virtual.
- Descargar el paquete de Zookeeper que incluya la carpeta bin.
- Configurar el archivo zoo.cfg copiando zoo_sample.cfg.
- Iniciar el servicio de Zookeeper.
Archivo application.yml para el proveedor:
# Nombre de la aplicación
spring.application.name=proveedor-servidor
# Puerto de acceso web
server.port=8281
# Configuración de registro
dubbo.application.name=proveedor-servidor
dubbo.registry.address=zookeeper://192.168.241.128:2181
dubbo.scan.base-packages=com.jupiter.service
dubbo.protocol.port=21880
Implementación del servicio:
public interface BoletoService {
String obtenerBoleto();
}
@Component
@DubboService(interfaceName = "com.jupiter.service.BoletoService")
public class BoletoServiceImpl implements BoletoService, Serializable {
@Override
public String obtenerBoleto() {
return "Se obtuvo un boleto, solicitud del consumidor: " + RpcContext.getContext().getRemoteAddress();
}
}
Configuración del consumidor
El consumidor se implementa en el主机.
Archivo application.yml para el consumidor:
# Nombre de la aplicación
spring.application.name=consumidor-servidor
# Puerto de acceso web
server.port=8182
# Configuración de registro
dubbo.application.name=consumidor-servidor
dubbo.registry.address=zookeeper://192.168.241.128:2181
dubbo.protocol.port=21880
dubbo.consumer.check=false
Archivo application.properties para configuración avanzada:
dubbo:
registry:
timeout: 200000
service:
timeout: 200000
consumer:
timeout: 200000
provider:
timeout: 200000
Implementación del consumo del servicio:
@Service
public class UsuarioService {
@DubboReference(url = "dubbo://192.168.241.128:21880/")
private BoletoService boletoService;
public String comprarBoleto() {
String boleto = boletoService.obtenerBoleto();
System.out.println("Boleto obtenido del registro central: " + boleto);
return boleto;
}
}
Pruebas
Clase de prueba:
@SpringBootTest
class ConsumidorServidorApplicationTests {
@Autowired
private UsuarioService usuarioService;
@Test
void testConseguirBoleto() {
usuarioService.comprarBoleto();
}
}
Resultados esperados:
Boleto obtenido del registro central: Se obtuvo un boleto, solicitud del consumidor: [dirección del cliente]