[Python-es] Ejemplo de microservicios (Sistema distribuido)

Luciano Andino lucianoandino.ar en gmail.com
Vie Abr 28 06:58:48 EDT 2017


El 27 de abril de 2017, 9:20, Yamila Moreno Suárez <yamila.ms en gmail.com>
escribió:

> Buenas!
>
> Yo desconozco si existe un framework para lo que necesitas, aunque me
> sorprendería por la naturaleza de la arquitectura que planteas. En todo
> caso, he hecho aplicaciones similares y nuestra solución ha sido:
>
> 1 aplicación de API. Esta API la puedes hacer con Flask (tiene bibliotecas
> para levantar APIs), con Django (usando Django Rest Framework) o "a pelo",
> es decir, usas un micro-framework que resuelve el enrutamiento y poco más,
> y el resto (validaciones, conexión, sesiones, clases de bbdd, mapeos,
> servicios, etc) lo haces a mano siguiendo una arquitectura bastante
> estricta y controlada. Hay opciones en muchísimos lenguajes, si el que más
> conoces es python, vas a poder elegir cómodamente.
>
> 1 aplicación de backend. Al igual que el API tienes muchas opciones
> basadas en python, o en otros lenguajes.
>
> Con esto, puedes:
> - crear una imagen del back y levantar tantos contenedores como necesites
> - crear una imagen del api y levantar tantos contenedores como necesites
> - No comentas nada de bbdd, entiendo que está resuelta por otro sistema y
> que tú vas a conectarte a ella como sea.
>

Buenas tardes Yamila (a los que leen y quisieran responder también), antes
que nada, gracias por tu tiempo en contestar. Si no fui claro u omití algo
es porque todavía no tengo en claro todo.

En mi caso cuento con la experiencia de haber hecho un API REST como
frontend utilizando Flask y en la universidad me pidieron que implemente
oauth2 sin la librería oauth, es decir yo mismo crear el token y refresh
token y con esto, comunicarme con otro servicio (sería un backend),
utilizando formato REST y un token válido para recuperar datos de ese
backend (o actualizar).

Con esto me refiero a que ese backend es una "aplicacion.py" código
spaguetti o "chorizo" de más de mil lineas que se me hizo complicado de
seguir y de defender ante el profesor (con el agregado que estoy cursando
en una universidad de Moscú y el idioma es complicado).

Para dar una idea del proyecto, hice una traducción [1] del ruso al español
y por lo que entiendo, debo poder instanciar ese backend. Si en mi código
spaguetti anterior tenía en la base "sqlite.db" las tablas "Usuario",
"Habitación" y "Reserva", teniendo esta última, claves que hacían
referencia a las dos primeras. Imagino que en una topología de servicios,
ahora tendría (cada una corriendo en un puerto diferente):

1) "ServicioUsuarios.py" que brinda información de usuarios (y actualiza).
2) "ServicioHabitaciones.py" que brinda información de habitaciones.
3) "ServicioReservas.py" que informa sobre reservas (siempre con token
válido: listado completo, pasando un ID de usuario dice que reserva tiene,
o poder reservar una habitación, etc.

Imagino que cada servicio tiene sus tablas pero por ejemplo el
"ServicioReservas" no tiene información de usuarios, sólo una tabla de
reservas que lista o actualiza según se requiera. Es decir ya no tengo la
estructura de BD completa como tenía en la versión monolítica.

No tengo en claro si para estos tres servicios necesito en el backend otro
servicio que los administre o el frontend "va derecho".

También se me ocurre que la tabla usuarios estará primero en el Frontend y
que luego, cuando el usuario se interese por hacer uso de servicios de
determinado "Hotel" (backend específico), actualizaría la tabla de Usuarios
de ese servicio a través de su "ServicioUsuarios.py".

No sé si hice un embrollo, esto es bastante nuevo para mí y no sé bien cómo
dividir las tablas y qué replicar.

[1] https://drive.google.com/file/d/0B_2ALCPIGxPxblRqUFRFMERQcDQ/view



>
> Si levantas varios apis y backs (y quieres que respondan en la misma URL)
> tienes que añadir una capa por delante que se encargue de distribuir la
> carga y de mantener el estado de tu servicio. Esta capa ahora mismo se está
> resolviendo con orquestadores.
>

Creo que por el momento el api/frontend es único, pero hay más de un
backend.

>
> Si eres nuevo en docker, te paso un tuto que hice, con el que aproveché
> para aprender; es muy sencillo pero te enseña las bases:
> http://moduslaborandi.net/2016/02/docker-101-hello-world/ (y los 3
> siguientes).
>
> Lo que planteas en tu email es un sistema complejo y sofisticado; es
> improbable que exista una única herramienta que te lo resuelva, así que mi
> recomendación en todo caso es que vayas resolviendo trozos pequeños,
> asegurándote de usar buenas prácticas, de forma que después vaya a ser más
> sencillo unirlos. Por ejemplo, es muy importante no acoplar componentes de
> tu aplicación.
>

En otro documento que me pasaron el la universidad, sugería el tema de la
geolocalización a través de un CDN, pero creo que eso sería un agregado
posterior, lo voy a obviar por el momento. Esto de los microservicios se
presenta muy interesante por las ventajas y quiero empezar de a poco.

Cualquier comentario será muy bien recibido, yo leo varias veces las
respuestas.

Luciano



>
> Suerte!
> Yamila
>
>
>
>
>
>
>
>
>
>
>
>
> 2017-04-26 21:24 GMT+02:00 Luciano Andino <lucianoandino.ar en gmail.com>:
>
>> Buenas, este es mi primer email a la lista. Les consulto: Tengo que
>> desarrollar una aplicación del tipo "Hotel" (clientes, habitaciones,
>> reservas, etc) pero utilizando microservicios. A detallar:
>>
>> * Un frontend del tipo API REST oauth2 (logueandose con la cuanta de
>> gmail por ejemplo), que interactue con el backend de hotel (utilizando
>> microservicios).
>>
>> * El backend estará encapsulado en docker, porque a efectos de
>> geolocalización del usuario web, el frontend se comunicará con el backend
>> más cercano a través del UUID. Con esto quiero decir que habría más de un
>> backend. (Sistema distribuido)
>>
>> * Debo ser capaz desde un perfil de administrador, podér agregar
>> instancias backend, dar de baja, etc.
>>
>> Cuando digo "tipo Hotel", es porque tomé una variante similar, en mi caso
>> sería "alquiler de bicicletas de persona a persona", el usuario puede
>> reservar bicicletas (hacer uso) de otro usuario registrado en el sitio.
>>
>> Cuento con conocimientos (no tantos) de Flask y como aplicación
>> monolítica me queda claro cómo hacerla, pero llevándola a microservicios,
>> el tema de la comunicación entre los servicios y cómo dividir la base de
>> datos, me está dando problemas de sólo pensar. Docker también es nuevo para
>> mí.
>>
>> Existe un framework para este tipo de desarrollo o bien un ejemplo? Es
>> para la Universidad.
>>
>> Muchas gracias,
>>
>> --
>> Luciano Andino
>> Ing. en Sistemas de Información
>> UTN FRSF
>> BMSTU
>>
>>
>>
>> _______________________________________________
>> Python-es mailing list
>> Python-es en python.org
>> https://mail.python.org/mailman/listinfo/python-es
>>
>>
>
>
> --
> Yamila  Moreno Suárez
> http://dendarii.es
> http://moduslaborandi.net
>
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> https://mail.python.org/mailman/listinfo/python-es
>
>


-- 
Luciano Andino
Ing. en Sistemas de Información
UTN FRSF
BMSTU
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20170428/70f0505f/attachment.html>


Más información sobre la lista de distribución Python-es