Este blog mostrará cómo una simple aplicación Java puede hablar con una base de datos o base de datos como servicio (DBaaS) utilizando el descubrimiento de servicios en DC/OS.

¿Por qué Service Discovery?
Una aplicación suele constar de varios componentes, como un servidor de aplicaciones, una base de datos, un servidor web, un servidor de almacenamiento en caché y un servidor de mensajería. Normalmente, se ejecutan varias réplicas de cada componente en función de las necesidades de la aplicación. Desplegar esta aplicación utilizando un marco de orquestación de contenedores significa que cada réplica se ejecutaría como un contenedor. Por lo tanto, una aplicación se despliega normalmente como una aplicación multicontenedor.
A cada contenedor se le asigna una dirección IP única durante toda su vida. Pero los contenedores son efímeros y pueden terminar y ser reprogramados en un host diferente por el marco de orquestación. En ese caso, normalmente se asigna a un contenedor una dirección IP diferente. Esto significa que una aplicación desplegada en un servidor de aplicaciones no puede confiar en la dirección IP de la base de datos. Aquí es donde se requiere el descubrimiento de servicios.
Así, a varias réplicas de un componente se les asigna un nombre lógico. Por ejemplo, web para todos los contenedores del servidor de aplicaciones y db para todos los contenedores de base de datos. Ahora, una aplicación puede comunicarse con los contenedores de base de datos utilizando el nombre de servicio lógico. Esto permite reprogramar los contenedores de base de datos en cualquier parte del clúster, y también escalar hacia arriba y hacia abajo de forma dinámica.
Veamos cómo se puede lograr esto en DC/OS con una sola instancia de servidor de aplicaciones y servidor de base de datos. Este blog utilizará WildFly para el servidor de aplicaciones y Couchbase para la base de datos.
Clúster Couchbase en Mesos con DC/OS proporcionan más detalles sobre cómo configurar un Couchbase en DC/OS.
Este blog utilizará los siguientes pasos principales:
- Configuración del clúster DC/OS
- Definición de la aplicación Marathon
- Despliegue de la aplicación
El código fuente completo utilizado en este blog se encuentra en github.com/arun-gupta/dcos-java-database.
Muchas gracias a @unterstein por crear el plugin de Maven y ayudarme a entender el funcionamiento interno de DC/OS.
Configuración del clúster DC/OS
El clúster DC/OS puede crearse fácilmente mediante la aplicación Plantilla de CloudFormation. Las instrucciones detalladas, incluidos los requisitos del sistema y las capturas de pantalla y la configuración, están disponibles en Instalar DC/OS en AWS.
La salida de CloudFormation se ve como se muestra:

Anote el valor indicado para las teclas DirecciónDns y PublicSlaveDnsAddress. El valor de la primera clave se puede utilizar para acceder a DC/OS GUI y tiene el siguiente aspecto:

Configure DC/OS CLI como se explica en CLI. En resumen, se utilizan los siguientes comandos:
dcos config set core.dcos_url http://${DnsAddress}Sustituir${DnsAddress}con el valor correspondiente de la salida de CloudFormation.dcos auth logindcos config show core.dcos_acs_token. Si aún no lo ha hecho, clone el repositorio desde github.com/arun-gupta/dcos-java-database. Crear un nuevo archivo.dcos-tokeny copiar la salida del comando en este archivo.dcos package install marathon-lb
Definición de la aplicación Marathon
Marathon framework se utiliza para programar contenedores en DC/OS. Se puede definir una aplicación de maratón proporcionando una definición de aplicación.
Como se mencionó anteriormente, este blog mostrará cómo una simple aplicación Java puede hablar con una base de datos. Usaremos una aplicación Java EE desplegada en WildFly y usaremos Couchbase como base de datos. La definición de la aplicación tiene el siguiente aspecto:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
{ "id":"/webapp", "apps":[ { "id":"base de datos", "cpus":4, "mem":4096, "instancias":1, "contenedor":{ "tipo":"DOCKER", "docker":{ "imagen":"arungupta/couchbase:travel", "red":"USUARIO" } }, "ipAddress":{ "networkName":"dcos" } }, { "id":"web", "dependencias":[ "/webapp/base de datos" ], "cpus":2, "mem":4096, "instancias":1, "contenedor":{ "tipo":"DOCKER", "docker":{ "imagen":"arungupta/wildfly-couchbase-javaee:travel", "red":"USUARIO", "portMappings":[ { "hostPort":0, "containerPort":8080, "protocolo":"tcp" } ] } }, "ipAddress":{ "networkName":"dcos" }, "env":{ "COUCHBASE_URI":"database-webapp.marathon.containerip.dcos.thisdcos.directory" }, "etiquetas":{ "HAPROXY_0_VHOST":"DCOS-PublicSlaveLo-DD2EGGFVCJA0-1604955948.us-west-1.elb.amazonaws.com", "HAPROXY_GROUP":"externo" } } ] } |
¿Cuáles son los puntos clave en la definición de esta aplicación?
- La aplicación tiene dos contenedores:
base de datosyweb. El contenedor web depende del contenedor de base de datos definido mediantedependenciasatributo. base de datosusos del contenedorarungupta/couchbase:viajeImagen Docker. Esta imagen se crea a partir de github.com/arun-gupta/couchbase-javaee/tree/master/couchbase. Utiliza la imagen base de Couchbase y utiliza API REST de Couchbase para preconfigurar la base de datos. También se carga un cubo de muestra en la base de datos.webusos del contenedorarungupta/wildfly-couchbase-javaee:travelimagen. Esta imagen se crea a partir de github.com/arun-gupta/couchbase-javaee/blob/master/Dockerfile. Se trata de una aplicación Java EE 7 integrada en WildFly. La aplicación utilizaCOUCHBASE_URIcomo variable de entorno para conectarse a la base de datos Couchbase. El valor de esta variable de entorno se configura para utilizar el descubrimiento de servicios DNS y se obtiene como se explica en Redes virtuales.
Asegúrese de cambiar el valor de HAPROXY_0_VHOST para que coincida con el valor de ${PublicSlaveDnsAddress} de la salida de CloudFormation. La etiqueta HAPROXY_0_VHOST indica a Marathon-LB que exponga el contenedor Docker, el servidor de aplicaciones WildFly en nuestro caso, en el equilibrador de carga externo con un host virtual. La dirección 0 en la clave de la etiqueta corresponde al índice servicePort, comenzando por 0. Si tuvieras múltiples definiciones servicePort, las iterarías como 0, 1, 2, y así sucesivamente. Desplegar una aplicación con equilibrio de carga interno y externo con marathon-lb proporciona más detalles sobre cómo configurar marathon-lb.
Descubrimiento de servicios y equilibrio de carga proporcionan más detalles sobre el descubrimiento de servicios y el equilibrio de carga en DC/OS.
Despliegue de la aplicación con Maven
La aplicación puede desplegarse utilizando dcos-maven-plugin.
Plugin parece:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<plugin> <groupId>dcos</groupId> <artifactId>dcos-maven-plugin</artifactId> <version>0.2</version> <configuration> <dcosUrl>http://DCOS-ElasticLoadBa-1TH4TXIU5P783-1163025470.us-west-1.elb.amazonaws.com/</dcosUrl> <deployable>grupo</deployable> <ignoreSslCertificate>verdadero</ignoreSslCertificate> </configuration> <executions> <execution> <id>dcos:desplegar</id> <phase>instale</phase> <goals> <goal>despliegue</goal> </goals> </execution> </executions> </plugin> |
Los puntos principales de este fragmento son:
- La versión del plugin es 0.2. Esto indica que el plugin aún se encuentra en las primeras fases de desarrollo.
dcosUrles el valor de${DnsAddress}de la salida de CloudFormation. Esta dirección se utiliza para el despliegue de la aplicación.<deployable>permite diferentes tipos de despliegue - aplicación, grupo o pods. Este elemento es una sugerencia para el plugin y es probable que desaparezca en una versión futura a medida que se consolide la API de Marathon. Siga #11 para más detalles.
Encontrará más detalles y la configuración del complemento en dcos-maven-plugin.
Despliegue la aplicación:
|
1 |
mvn instale |
Se muestra la siguiente salida:
|
1 2 3 4 5 6 7 8 |
[INFO] --- dcos-maven-plugin:0.2:despliegue (dcos:despliegue) @ dcos-java-base de datos --- [INFO] Acerca de a ejecutar DC/OS despliegue [INFO] aplicación definición: /Usuarios/arungupta/espacios de trabajo/dcos-java-base de datos/aplicación-definición.json [INFO] dcos ficha: /Usuarios/arungupta/espacios de trabajo/dcos-java-base de datos/.dcos-ficha [INFO] dcos url: http://DCOS-ElasticLoadBa-1TH4TXIU5P783-1163025470.us-west-1.elb.amazonaws.com/ [INFO] ignore ssl certificado: verdadero [INFO] desplegable: grupo [INFO] Respuesta de DC/OS [200] {"version":"2017-03-07T13:27:49.970Z","deploymentId":"dbc80f96-28cb-4040-8d0d-78452e461ec1"} |
Estos son algunos de los resultados actualizados de la consola DC/OS.
Primera actualización de la pestaña Servicios:

Dos aplicaciones en el servicio:

La aplicación de base de datos tiene una tarea:

Estado de la tarea de base de datos:
Registros de la tarea de base de datos:

Muestra la salida de la API REST de Couchbase para configurar el servidor.
Estado de la tarea web:

Registros de la tarea web:

Muestra que la aplicación Java EE se ha desplegado correctamente.
Accede a la aplicación:
|
1 |
rizo http://DCOS-PublicSlaveLo-DD2EGGFVCJA0-1604955948.us-west-1.elb.amazonaws.com/airlines/resources/airline |
La dirección es el valor de la clave ${PublicSlaveDnsAddress} de la salida de CloudFormation. Una salida formateada, por ejemplo con jq...parece:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
[ { "viaje-muestra": { "país": "Estados Unidos", "iata": "Q5", "Indicativo": "MILE-AIR", "nombre": "40-Mile Air", "icao": "MLA", "id": 10, "tipo": "aerolínea" } }, { "viaje-muestra": { "país": "Estados Unidos", . . . "icao": "RLA", "id": 1203, "tipo": "aerolínea" } } ] |
¡Eso es!
Como ya se ha mencionado, el código fuente completo utilizado en este blog se encuentra en github.com/arun-gupta/dcos-java-database.
Este blog mostró cómo una aplicación Java simple puede hablar con una base de datos utilizando el descubrimiento de servicios en DC/OS.
Para más información, consulte:
- Documentos de DC/OS
- Couchbase en contenedores
- Couchbase Portal para desarrolladores
- Haga preguntas sobre Foros de Couchbase o Stack Overflow
- Descargar Couchbase
[...] Fuente: http://www.couchbase.com/service-discovery-java-database-dcos/ […]
[...] Service Discovery with Java and Database application in DC/OS explica por qué el descubrimiento de servicios es un aspecto importante para una aplicación multicontenedor. En ese blog también se explica cómo se puede hacer para DC/OS. [...]
[...] Service Discovery with Java and Database application in DC/OS explica por qué el descubrimiento de servicios es un aspecto importante para una aplicación multicontenedor. En ese blog también se explica cómo se puede hacer para DC/OS. [...]
Hola Arun.
Me preguntaba por qué no podemos utilizar un equilibrador de carga como haproxy para hacer el registro del servicio. Publica un nombre de servicio lógico que reenviaría la petición a uno de los servicios disponibles en cs/os. ¿Por qué tanto alboroto con el registro de servicios? Es dinámico, escalable y tecnológicamente transparente.
Saludos cordiales, Alexander