Documentos de Académico
Documentos de Profesional
Documentos de Cultura
paradigmadigital.com/dev/implementar-microservicios-python-minutos/
Martin Fowler, uno de los firmantes del Manifiesto Ágil y una de las personas más influyentes en
el mundo del software, profundizó en el concepto de arquitecturas orientadas a microservicios
en este artículo de obligada lectura.
Sin duda este nuevo estilo de arquitectura se está imponiendo en entornos donde las
necesidades de escalabilidad son muy fuertes y el diseño en componentes independientes es
una gran ventaja a la hora de abordar problemas complejos.
En este artículo, sin embargo, queremos profundizar en una de las grandes ventajas de los
microservicios: el poliglotismo.
1/8
Estos sistemas de comunicación agnósticos nos abren la puerta a que podamos desarrollar cada
microservicio con el lenguaje y las herramientas que más nos convenga en cada caso. Por
ejemplo, si en un microservicio en concreto el rendimiento es un aspecto crítico, podemos
escoger lenguajes de bajo nivel que nos permitan afinar más este aspecto como C, C++ o Go.
Sin embargo en otros casos nos interesará escoger lenguajes de alto o nivel o que implementen
ciertas características particulares, como Python, Ruby, Groovy o Scala, que nos permitan
avanzar más rápido o se acomoden mejor al servicio que deben implementar.
Llegados a este punto debemos plantearnos qué opciones o plataformas pueden ser
interesantes a la hora de implementar estos servicios que exponen APIs REST más allá de los
lenguajes que nos ofrece la JVM y de los frameworks habituales en el ecosistema Java, en
ocasiones demasiado pesados.
Sin duda una de las mejores opciones a tener en cuenta es usar un lenguaje de alto nivel como
Python, del que podemos aprovechar muchas de sus ventajas ya que es un lenguaje
interpretado y de tipado dinámico.
Python es ampliamente utilizado, por lo que tiene una gran base de programadores. Combina
múltiples paradigmas de programación como el orientado a objetos y el funcional. Además, su
sintaxis está orientada escribir menos líneas de código pero más claras que otros lenguajes, lo
que facilita enormemente su mantenimiento.
Por otro lado, existen excelentes frameworks y bibliotecas muy asentados y orientados al
desarrollo de APIs REST y sistemas de comunicación basados en HTTP, lo que es perfecto para la
construcción de microservicios. Algunos de los frameworks más interesantes para construir APIs
REST son:
En este caso vamos a tener que definir los siguientes elementos, cada uno en un fichero Python:
models.py
En este fichero vamos a definir cómo será nuestro modelo “Customer”, esto lo hacemos a través
de la definición de una clase que herede de “Model”. Esta clase incluirá una serie de
propiedades y sus tipos de datos que serán los atributos que tendrá un cliente. El ORM de
Django convertirá esta información en una tabla en la base de datos que elijamos.
class Customer(Model):
id = UUIDField(primary_key=True)
name = CharField(max_length=45)
surname = CharField(max_length=45)
phone = CharField(max_length=45)
email = EmailField()
3/8
views.py
from rest_framework import viewsets
class CustomerViewSet(viewsets.ModelViewSet):
model = Customer
queryset = Customer.objects.all()
serializer_class = CustomerSerializer
En la vista le indicamos a Django que queremos basarnos en el modelo “Customer”, que hemos
definido para construir un API asociada a este modelo. Al heredar de “ModelViewSet” el API que
expondremos será CRUD y ofrecerá los siguientes métodos:
POST /api/customers/
GET /api/customers/
PUT /api/customers/{pk}/
DELETE /api/customers/{pk}/
GET /api/customers/{pk}/
PATCH /api/customers/{pk}/
Además le indicamos que para la representación del recurso “Customer” debe de usar la clase
“CustomerSerializer”.
urls.py
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register('customers', CustomerViewSet, 'Customer')
urlpatterns = router.urls
En el fichero de URLs se define el punto desde el cual colgará el API de customer, en este caso
será en /customers/ y desde aquí colgarán el resto de URLs asociadas a este recurso.
serializers.py
4/8
from rest_framework import serializers
class CustomerSerializer(serializers.ModelSerializer):
class Meta:
model = Customer
tests.py
from django.core.urlresolvers import reverse
class AccountTests(APITestCase):
def test_create_customer(self):
url = reverse('customer-list')
data = {
'id': '550e8400-e29b-41d4-a716-446655440000',
'name': 'John',
'surname': 'Smith',
'email': 'jsmith@test.com',
'phone': '609148275'
}
response = self.client.post(url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
self.assertEqual(Customer.objects.count(), 1)
self.assertEqual(Customer.objects.get().name, 'John')
Por último definiremos un juego de tests que pruebe nuestra API. En este caso, a modo de
ejemplo, definiremos un único test que envíe una petición POST con un body de ejemplo y haga
las siguientes comprobaciones:
También podemos activar fácilmente otros sistemas de documentación de APIs como Swagger
que se integran perfectamente con Django a través del paquete django-rest-swagger.
6/8
Conclusión
El estilo de arquitectura orientado a microservicios nos permite integrar diferentes lenguajes y
frameworks, de esta forma podemos aprovechar lo mejor de cada uno. Python es un lenguaje
moderno y muy potente para el desarrollo rápido de microservicios.
Además, combinado con los frameworks y herramientas del ecosistema Python, lo convierten,
sin duda, en una alternativa muy interesante.
7/8
Manuel Zaforas (Paradigma Digital)
8/8