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 https://${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-token聽y 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":"database", "cpus":4, "mem":4096, "instances":1, "container":{ "type":"DOCKER", "docker":{ "image":"arungupta/couchbase:travel", "network":"USER" } }, "ipAddress":{ "networkName":"dcos" } }, { "id":"web", "dependencies":[ "/webapp/database" ], "cpus":2, "mem":4096, "instances":1, "container":{ "type":"DOCKER", "docker":{ "image":"arungupta/wildfly-couchbase-javaee:travel", "network":"USER", "portMappings":[ { "hostPort":0, "containerPort":8080, "protocol":"tcp" } ] } }, "ipAddress":{ "networkName":"dcos" }, "env":{ "COUCHBASE_URI":"database-webapp.marathon.containerip.dcos.thisdcos.directory" }, "labels":{ "HAPROXY_0_VHOST":"DCOS-PublicSlaveLo-DD2EGGFVCJA0-1604955948.us-west-1.elb.amazonaws.com", "HAPROXY_GROUP":"external" } } ] } |
驴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:viaje聽Imagen 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>https://DCOS-ElasticLoadBa-1TH4TXIU5P783-1163025470.us-west-1.elb.amazonaws.com/</dcosUrl> <deployable>group</deployable> <ignoreSslCertificate>true</ignoreSslCertificate> </configuration> <executions> <execution> <id>dcos:deploy</id> <phase>install</phase> <goals> <goal>deploy</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 install |
Se muestra la siguiente salida:
|
1 2 3 4 5 6 7 8 |
[INFO] --- dcos-maven-plugin:0.2:deploy (dcos:deploy) @ dcos-java-database --- [INFO] About to execute DC/OS deploy [INFO] app definition: /Users/arungupta/workspaces/dcos-java-database/app-definition.json [INFO] dcos token: /Users/arungupta/workspaces/dcos-java-database/.dcos-token [INFO] dcos url: https://DCOS-ElasticLoadBa-1TH4TXIU5P783-1163025470.us-west-1.elb.amazonaws.com/ [INFO] ignore ssl certificate: true [INFO] deployable: group [INFO] Response from 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 |
curl https://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 |
[ { "travel-sample": { "country": "United States", "iata": "Q5", "callsign": "MILE-AIR", "name": "40-Mile Air", "icao": "MLA", "id": 10, "type": "airline" } }, { "travel-sample": { "country": "United States", . . . "icao": "RLA", "id": 1203, "type": "airline" } } ] |
隆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