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 |
version: '3' services: web: image: arungupta/couchbase-javaee:travel environment: - COUCHBASE_URI=db ports: - 8080:8080 - 9990:9990 depends_on: - db db: image: arungupta/couchbase:travel ports: - 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 swarm 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 |
Containers: 0 Running: 0 Paused: 0 Stopped: 0 Images: 17 Server Version: 1.13.0 Storage Driver: overlay2 Backing Filesystem: extfs Supports d_type: true Native Overlay Diff: true Logging Driver: json-file Cgroup Driver: cgroupfs Plugins: Volume: local Network: bridge host ipvlan macvlan null overlay Swarm: active NodeID: 92mydh0e09ba5hx3wtmcmvktz Is Manager: true ClusterID: v68ikyaff7rdxpaw1j0c9i60s Managers: 1 Nodes: 1 Orchestration: Task History Retention Limit: 5 Raft: Snapshot Interval: 10000 Number of Old Snapshots to Retain: 0 Heartbeat Tick: 1 Election Tick: 3 Dispatcher: Heartbeat Period: 5 seconds CA Configuration: Expiry Duration: 3 months Node Address: 192.168.65.2 Manager Addresses: 192.168.65.2:2377 Runtimes: runc Default Runtime: runc Init Binary: docker-init containerd version: 03e5862ec0d8d3b3f750e19fca3ee367e13c090e runc version: 2f7393a47307a16f8cee44a37b262e8b81021e3e init version: 949e6fa Security Options: seccomp Profile: default Kernel Version: 4.9.5-moby Operating System: Alpine Linux v3.5 OSType: linux Architecture: x86_64 CPUs: 4 Total Memory: 1.952 GiB Name: moby ID: SGCM:KDRD:G3M7:PZHN:J4RL:VFFR:G2SR:EKD5:JV4J:RL3X:LF7T:XF6V Docker Root Dir: /var/lib/docker Debug Mode (client): false Debug Mode (server): true File Descriptors: 31 Goroutines: 124 System Time: 2017-01-27T08:25:58.032295342Z EventsListeners: 1 No Proxy: *.local, 169.254/16 Username: arungupta Registry: https://index.docker.io/v1/ Experimental: true Insecure Registries: 127.0.0.0/8 Live Restore Enabled: false |
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 stack deploy --compose-file=docker-compose.yml webapp |
Esto muestra la salida:
|
1 2 3 |
Creating network webapp_default Creating service webapp_web Creating service webapp_db |
Compruebe que los servicios WildFly y Couchbase se están ejecutando mediante docker service ls:
|
1 2 3 |
ID NAME MODE REPLICAS IMAGE a9pkiziw3vgw webapp_db replicated 1/1 arungupta/couchbase:travel hr5s6ue54kwj webapp_web replicated 1/1 arungupta/couchbase-javaee:travel |
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 Environment webapp_web.1.wby0b04t7bap@moby | webapp_web.1.wby0b04t7bap@moby | JBOSS_HOME: /opt/jboss/wildfly webapp_web.1.wby0b04t7bap@moby | webapp_web.1.wby0b04t7bap@moby | JAVA: /usr/lib/jvm/java/bin/java webapp_web.1.wby0b04t7bap@moby | webapp_web.1.wby0b04t7bap@moby | JAVA_OPTS: -server -Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true webapp_web.1.wby0b04t7bap@moby | webapp_web.1.wby0b04t7bap@moby | ========================================================================= . . . webapp_web.1.wby0b04t7bap@moby | 23:14:15,811 INFO [org.jboss.as.server] (ServerService Thread Pool -- 34) WFLYSRV0010: Deployed "airlines.war" (runtime-name : "airlines.war") webapp_web.1.wby0b04t7bap@moby | 23:14:16,076 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0060: Http management interface listening on https://127.0.0.1:9990/management webapp_web.1.wby0b04t7bap@moby | 23:14:16,077 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0051: Admin console listening on https://127.0.0.1:9990 webapp_web.1.wby0b04t7bap@moby | 23:14:16,077 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: WildFly Full 10.1.0.Final (WildFly Core 2.2.0.Final) started in 98623ms - Started 443 of 691 services (404 services are lazy, passive or on-demand) |
Asegúrese de esperar a que aparezca la última declaración de registro.
Microservicio de acceso
Obtener 10 aerolíneas del microservicio:
|
1 |
curl -v https://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 |
* Trying ::1... * Connected to localhost (::1) port 8080 (#0) > GET /airlines/resources/airline HTTP/1.1 > Host: localhost:8080 > User-Agent: curl/7.43.0 > Accept: */* > < HTTP/1.1 200 OK < Connection: keep-alive < X-Powered-By: Undertow/1 < Server: WildFly/10 < Content-Type: application/octet-stream < Content-Length: 1402 < Date: Fri, 03 Feb 2017 17:02:45 GMT < * Connection #0 to host localhost left intact [{"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","iata":"TQ","callsign":"TXW","name":"Texas Wings","icao":"TXW","id":10123,"type":"airline"}}, {"travel-sample":{"country":"United States","iata":"A1","callsign":"atifly","name":"Atifly","icao":"A1F","id":10226,"type":"airline"}}, {"travel-sample":{"country":"United Kingdom","iata":null,"callsign":null,"name":"Jc royal.britannica","icao":"JRB","id":10642,"type":"airline"}}, {"travel-sample":{"country":"United States","iata":"ZQ","callsign":"LOCAIR","name":"Locair","icao":"LOC","id":10748,"type":"airline"}}, {"travel-sample":{"country":"United States","iata":"K5","callsign":"SASQUATCH","name":"SeaPort Airlines","icao":"SQH","id":10765,"type":"airline"}}, {"travel-sample":{"country":"United States","iata":"KO","callsign":"ACE AIR","name":"Alaska Central Express","icao":"AER","id":109,"type":"airline"}}, {"travel-sample":{"country":"United Kingdom","iata":"5W","callsign":"FLYSTAR","name":"Astraeus","icao":"AEU","id":112,"type":"airline"}}, {"travel-sample":{"country":"France","iata":"UU","callsign":"REUNION","name":"Air Austral","icao":"REU","id":1191,"type":"airline"}}, {"travel-sample":{"country":"France","iata":"A5","callsign":"AIRLINAIR","name":"Airlinair","icao":"RLA","id":1203,"type":"airline"}}] |
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 |
curl -v https://localhost:8080/airlines/resources/airline/137 |
Crea un nuevo recurso:
|
1 |
curl -v -H "Content-Type: application/json" -X POST -d '{"country":"France","iata":"A5","callsign":"AIRLINAIR","name":"Airlinair","icao":"RLA","type":"airline"}' https://localhost:8080/airlines/resources/airline |
Actualizar un recurso:
|
1 |
curl -v -H "Content-Type: application/json" -X PUT -d '{"country":"France","iata":"A5","callsign":"AIRLINAIR","name":"Airlin Air","icao":"RLA","type":"airline","id": "19810"}' https://localhost:8080/airlines/resources/airline/19810 |
Borrar un recurso:
|
1 |
curl -v -X DELETE https://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 |
Removing service webapp_web Removing service webapp_db Removing network 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?