Hay mucho material sobre microservicios, sólo buscar en google¡! Hice una presentación sobre refactorización de monolito a microservicios en Devoxx Bélgica hace un par de años y tiene buenas críticas:
Este blog mostrará cómo Docker simplifica la creación y el cierre de un microservicio. Todo el código utilizado en este blog está en github.com/arun-gupta/couchbase-javaee.
Definición de microservicios con Compose
Docker 1.13 introdujo un v3 de Docker Compose. Los cambios en la sintaxis son mínimos, pero la diferencia clave es la adición de despliegue atributo. Este atributo permite especificar réplicas, rolling update y política de reinicio para el contenedor. Nuestro microservicio iniciará un servidor de aplicaciones WldFly con una aplicación Java EE pre-desplegada. Esta aplicación hablará con una base de datos Couchbase para CRUD los datos de la aplicación. Aquí está la definición de Compose:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
versión: '3' servicios: web: imagen: arungupta/couchbase-javaee:viaje medio ambiente: - COUCHBASE_URI=db puertos: - 8080:8080 - 9990:9990 depende_de: - db db: imagen: arungupta/couchbase:viaje puertos: - 8091:8091 - 8092:8092 - 8093:8093 - 11210:11210 |
En este archivo Compose:
- En este Compose se definen dos servicios con el nombre
dbywebatributos - Nombre de imagen para cada servicio definido mediante
imagenatributo - En
arungupta/couchbase:viajeinicia el servidor Couchbase, lo configura utilizando API REST de Couchbasey cargasviaje-muestracon ~32k documentos JSON. - En
arungupta/couchbase-javaee:travelinicia WildFly y despliega el archivo WAR de la aplicación creado a partir de https://github.com/arun-gupta/couchbase-javaee. Clona ese proyecto si quieres construir tu propia imagen. medio ambientedefine variables de entorno accesibles por la aplicación desplegada en WildFly.COUCHBASE_URIse refiere al servicio de base de datos. Esto se utiliza en el código de la aplicación como se muestra en https://github.com/arun-gupta/couchbase-javaee/blob/master/src/main/java/org/couchbase/sample/javaee/Database.java.- El reenvío de puertos se realiza mediante
puertosatributo -
depende_deen el archivo de definición Compose garantiza el orden de inicio del contenedor. Pero las aplicaciones que se ejecutan dentro del contenedor deben garantizar el arranque a nivel de aplicación. En nuestro caso, WildFly se inicia con bastante rapidez, pero la base de datos tarda unos segundos en iniciarse. Esto significa que la aplicación Java EE desplegada en WildFly no puede comunicarse con la base de datos. Esto pone de manifiesto una práctica recomendada al crear aplicaciones de microservicios: debe codificar de forma defensiva y asegurarse en la inicialización de la aplicación de que los microservicios de los que depende se han iniciado, sin asumir el orden de inicio. Esto se muestra en el código de inicialización de la base de datos en https://github.com/arun-gupta/couchbase-javaee/blob/master/src/main/java/org/couchbase/sample/javaee/Database.java. Realiza las siguientes comprobaciones:- El cubo existe
- El servicio de consulta de Couchbase ya funciona
- El cubo de muestras está completamente cargado
Esta aplicación puede iniciarse mediante docker-compose up -d en un único host. O un clúster de motores Docker en modo enjambre utilizando docker stack deploy mando.
Configurar el modo enjambre de Docker
Inicialice el modo Enjambre utilizando el siguiente comando:
|
1 |
docker enjambre init |
información de docker mando:
|
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 55 56 57 58 59 60 61 62 63 64 65 66 |
Contenedores: 0 Ejecutar: 0 En pausa: 0 Detenido: 0 Imágenes: 17 Servidor Versión: 1.13.0 Almacenamiento Conductor: superposición2 Atrás Sistema de archivos: extfs Admite d_tipo: verdadero Nativo Superposición Dif: verdadero Registro Conductor: json-archivo Cgroup Conductor: cgroupfs Plugins: Volumen: local Red: puente host ipvlan macvlan null superponer Enjambre: activo NodeID: 92mydh0e09ba5hx3wtmcmvktz Es Director: verdadero ClusterID: v68ikyaff7rdxpaw1j0c9i60s Gestores: 1 Nodos: 1 Orquestación: Tarea Historia Retención Límite: 5 Balsa: Instantánea Intervalo: 10000 Número de Antiguo Instantáneas a Conserve: 0 Latido del corazón Garrapata: 1 Elecciones Garrapata: 3 Despachador: Latido del corazón Periodo: 5 segundos CA Configuración: Caducidad Duración: 3 meses Nodo Dirección: 192.168.65.2 Director Direcciones: 192.168.65.2:2377 Tiempos de ejecución: runc Por defecto Tiempo de ejecución: runc Init Binario: docker-init contenedord versión: 03e5862ec0d8d3b3f750e19fca3ee367e13c090e runc versión: 2f7393a47307a16f8cee44a37b262e8b81021e3e init versión: 949e6fa Seguridad Opciones: seccomp Perfil: por defecto Núcleo Versión: 4.9.5-moby Funcionamiento Sistema: Alpine Linux v3.5 OSType: linux Arquitectura: x86_64 CPUs: 4 Total Memoria: 1.952 GiB Nombre: moby ID: SGCM:KDRD:G3M7:PZHN:J4RL:VFFR:G2SR:EKD5:JV4J:RL3X:LF7T:XF6V Docker Raíz Dir: /var/lib/docker Depurar Modo (cliente): falso Depurar Modo (servidor): verdadero Archivo Descriptores: 31 Goroutines: 124 Sistema Tiempo: 2017-01-27T08:25:58.032295342Z EventsListeners: 1 No Proxy: *.local, 169.254/16 Nombre de usuario: arungupta Registro: https://index.docker.io/v1/ Experimental: verdadero Inseguro Registros: 127.0.0.0/8 En directo Restaurar Activado: falso |
Este cluster tiene 1 nodo, y ese es el manager. Alternativamente, un cluster multi-host puede ser fácilmente configurado usando Docker para AWS.
Despliegue de microservicios
El microservicio se puede iniciar como:
|
1 |
docker pila despliegue --componer-archivo=docker-componer.yml aplicación web |
Esto muestra la salida:
|
1 2 3 |
Creación de red webapp_default Creación de servicio webapp_web Creación de servicio webapp_db |
Compruebe que los servicios WildFly y Couchbase se están ejecutando mediante docker service ls:
|
1 2 3 |
ID NOMBRE MODO RÉPLICAS IMAGEN a9pkiziw3vgw webapp_db replicado 1/1 arungupta/couchbase:viaje hr5s6ue54kwj webapp_web replicado 1/1 arungupta/couchbase-javaee:viaje |
docker service logs -f webapp_web:|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
webapp_web.1.wby0b04t7bap@moby | ========================================================================= webapp_web.1.wby0b04t7bap@moby | webapp_web.1.wby0b04t7bap@moby | JBoss Bootstrap Medio ambiente webapp_web.1.wby0b04t7bap@moby | webapp_web.1.wby0b04t7bap@moby | JBOSS_HOME: /op/jboss/mosca salvaje webapp_web.1.wby0b04t7bap@moby | webapp_web.1.wby0b04t7bap@moby | JAVA: /usr/lib/jvm/java/papelera/java webapp_web.1.wby0b04t7bap@moby | webapp_web.1.wby0b04t7bap@moby | JAVA_OPTS: -servidor -Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.red.preferirIPv4Stack=verdadero -Djboss.módulos.sistema.paquetes=org.jboss.byteman -Djava.awt.sin cabeza=verdadero webapp_web.1.wby0b04t7bap@moby | webapp_web.1.wby0b04t7bap@moby | ========================================================================= . . . webapp_web.1.wby0b04t7bap@moby | 23:14:15,811 INFO [org.jboss.como.servidor] (ServicioServidor Hilo Piscina -- 34) WFLYSRV0010: Desplegado "airlines.war" (tiempo de ejecución-nombre : "airlines.war") webapp_web.1.wby0b04t7bap@moby | 23:14:16,076 INFO [org.jboss.como] (Controlador Bota Hilo) WFLYSRV0060: Http gestión interfaz escuchando en http://127.0.0.1:9990/management webapp_web.1.wby0b04t7bap@moby | 23:14:16,077 INFO [org.jboss.como] (Controlador Bota Hilo) WFLYSRV0051: Admin consola escuchando en http://127.0.0.1:9990 webapp_web.1.wby0b04t7bap@moby | 23:14:16,077 INFO [org.jboss.como] (Controlador Bota Hilo) WFLYSRV0025: WildFly Completo 10.1.0.Final (WildFly Núcleo 2.2.0.Final) iniciado en 98623ms - Comenzó 443 de 691 servicios (404 servicios son perezoso, pasivo o en-demanda) |
Asegúrese de esperar a que aparezca la última declaración de registro.
Microservicio de acceso
Obtener 10 aerolíneas del microservicio:
|
1 |
rizo -v http://localhost:8080/airlines/resources/airline |
Esto muestra los resultados como:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
* Prueba ::1... * Conectado a localhost (::1) puerto 8080 (#0) > GET /líneas aéreas/recursos/aerolínea HTTP/1.1 > Anfitrión: localhost:8080 > Usuario-Agente: rizo/7.43.0 > Acepte: */* > < HTTP/1.1 200 OK < Conexión: guarda-vivo < X-Powered-Por: Resaca/1 < Servidor: WildFly/10 < Contenido-Tipo: aplicación/octeto-flujo < Contenido-Longitud: 1402 < Fecha: Vie, 03 Febrero 2017 17:02:45 GMT < * Conexión #0 a host localhost dejado intacto [{"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","iata":"TQ","Indicativo":"TXW","nombre":"Alas de Texas","icao":"TXW","id":10123,"tipo":"aerolínea"}}, {"viaje-muestra":{"país":"Estados Unidos","iata":"A1","Indicativo":"atifly","nombre":"Atifly","icao":"A1F","id":10226,"tipo":"aerolínea"}}, {"viaje-muestra":{"país":"Reino Unido","iata":null,"Indicativo":null,"nombre":"Jc royal.britannica","icao":"JRB","id":10642,"tipo":"aerolínea"}}, {"viaje-muestra":{"país":"Estados Unidos","iata":"ZQ","Indicativo":"LOCAIR","nombre":"Locair","icao":"LOC","id":10748,"tipo":"aerolínea"}}, {"viaje-muestra":{"país":"Estados Unidos","iata":"K5","Indicativo":"SASQUATCH","nombre":"SeaPort Airlines","icao":"SQH","id":10765,"tipo":"aerolínea"}}, {"viaje-muestra":{"país":"Estados Unidos","iata":"KO","Indicativo":"ACE AIR","nombre":"Alaska Central Express","icao":"AER","id":109,"tipo":"aerolínea"}}, {"viaje-muestra":{"país":"Reino Unido","iata":"5W","Indicativo":"FLYSTAR","nombre":"Astraeus","icao":"AEU","id":112,"tipo":"aerolínea"}}, {"viaje-muestra":{"país":"Francia,"iata":"UU","Indicativo":"REUNIÓN,"nombre":"Aire Austral","icao":"REU","id":1191,"tipo":"aerolínea"}}, {"viaje-muestra":{"país":"Francia,"iata":"A5","Indicativo":"AIRLINAIR","nombre":"Airlinair","icao":"RLA","id":1203,"tipo":"aerolínea"}}] |
Taller sobre Docker para desarrolladores Java es un laboratorio práctico a su propio ritmo y le permite iniciarse en Docker fácilmente. Consigue un único recurso:
|
1 |
rizo -v http://localhost:8080/airlines/resources/airline/137 |
Crea un nuevo recurso:
|
1 |
rizo -v -H "Content-Type: application/json" -X POST -d '{"país":"Francia,"iata":"A5","Indicativo":"AIRLINAIR","nombre":"Airlinair","icao":"RLA","tipo":"aerolínea"}' http://localhost:8080/airlines/resources/airline |
Actualizar un recurso:
|
1 |
rizo -v -H "Content-Type: application/json" -X PUT -d '{"país":"Francia,"iata":"A5","Indicativo":"AIRLINAIR","nombre":"Airlin Air","icao":"RLA","tipo":"aerolínea","id": "19810"}' http://localhost:8080/airlines/resources/airline/19810 |
Borrar un recurso:
|
1 |
rizo -v -X BORRAR http://localhost:8080/airlines/resources/airline/19810 |
Los resultados detallados de cada uno de estos comandos se encuentran en github.com/arun-gupta/couchbase-javaee.
Eliminar microservicio
El microservicio puede eliminarse mediante el comando docker stack rm webapp:
|
1 2 3 |
Eliminación de servicio webapp_web Eliminación de servicio webapp_db Eliminación de red webapp_default |
¿Quieres empezar a usar Couchbase? Mira en Kits de inicio de Couchbase. ¿Quieres saber más sobre cómo ejecutar Couchbase en contenedores?