Pip.Services Toolkit: como una "clave maestra" para el desarrollo de microservicios





Por el momento, hay muchos marcos listos para usar para desarrollar aplicaciones utilizando una arquitectura de microservicio. Como regla general, los marcos se dividen en dos tipos, para un lenguaje que puede funcionar con diferentes plataformas, pero el desarrollo se lleva a cabo en un idioma, un ejemplo de SpringBoot, Nancy, etc. Y el segundo tipo, para la plataforma, puede funcionar con diferentes lenguajes de programación, pero el código solo se puede ejecutar en la plataforma elegida, un ejemplo de ServiceFabric, AWS Lambda. Pero prácticamente no existen marcos multilingües capaces de trabajar en diferentes plataformas.



Nuestro equipo desarrolla sistemas empresariales basados ​​en microservicios, los cuales contienen componentes escritos en diferentes idiomas y a menudo necesitan trabajar en diferentes plataformas, por lo que el problema descrito anteriormente es más que relevante para nosotros. Dado que no pudimos encontrar ninguna solución preparada que cumpliera con dichos requisitos, desarrollamos nuestra propia solución: Pip.Services Toolkit . Esta herramienta nos permitió desarrollar microservicios en muchos lenguajes de programación y no preocuparnos realmente por dónde se ejecutará esta aplicación, en la nube o en las instalaciones.



El propósito del artículo es familiarizar al lector con las capacidades del proyecto sin entrar en los detalles de la implementación. Si está interesado en aprender más sobre esta herramienta, por favor, debajo de cat ...



¿Qué es Pip.Services?



Durante el desarrollo, nuestro objetivo era crear una herramienta bastante versátil capaz de cubrir muchas tareas. Durante el proceso de diseño, se determinaron los principios básicos, que formaron la base del producto:



  • Los componentes del sistema deben estar poco conectados para poder modificarlos fácilmente y agregar nuevas funciones.
  • ciclo de vida muy largo: el objetivo era crear una herramienta que permitiera ser compatible en diferentes idiomas durante el mayor tiempo posible.
  • la capacidad de desarrollar aplicaciones para arquitectura de microservicio y monolítica
  • Las aplicaciones desarrolladas deben poder implementarse en cualquier plataforma, ya sea en las instalaciones o en una solución en la nube, y la nube tampoco debe depender del operador.
  • Soporte del número máximo de lenguajes de programación utilizados en el desarrollo manteniendo los principios de la propia herramienta, así como la compatibilidad de los servicios escritos en diferentes lenguajes entre sí durante las comunicaciones.


El kit de herramientas de Pip.Services representa un amplio conjunto de herramientas que le permite desarrollar microservicios y aplicaciones monolíticas utilizando lenguajes de programación populares. El Pip.Services Toolkit ha desarrollado herramientas para trabajar con todas las funciones y estructuras de datos necesarias, cuya necesidad puede surgir del desarrollador, en ausencia de las cosas necesarias, puede agregarlas fácilmente usted mismo.



El kit de herramientas de Pip.Services es un verdadero políglota, al tiempo que se adhiere a los siguientes conceptos:



Implementación simétrica en el código



  • , , . ,






  • — ,
  • — ,


Para una representación más visual de la estructura, pasemos al diagrama estructural del juego de herramientas.







Como se mencionó al principio del artículo, la caja de herramientas es multilingüe. Por el momento, hay implementaciones en 6 lenguajes de programación, entre ellos hay populares (Java, Node.js, Python, .Net Core) y en desarrollo (Go, Dart): esta es una capa gris en el diagrama.

Como puede ver, se basa en un conjunto de paquetes con primitivas en varios idiomas y plantillas comunes diseñadas para el desarrollo rápido de sus propios componentes: la capa verde del diagrama. Sobre su base, se implementa una biblioteca de los componentes principales del kit de herramientas.

Ya sobre la base de los componentes básicos, se implementan los componentes del usuario y del sistema: esta es la segunda capa verde.



La capa azul del diagrama es un conjunto de bibliotecas básicas para trabajar en ciertas direcciones: implementación de contenedores (IoC), trabajo con datos, intercambio síncrono (RPC) e intercambio asincrónico (mensajería). Son capaces de funcionar como componentes independientes, pero también proporcionan interfaces y principios básicos para construir implementaciones específicas de componentes adicionales para trabajar con tecnologías específicas. Como se muestra en el diagrama en la parte superior de la pila, como ejemplo, implemente contenedores para AWS y Azure, implemente la manipulación de datos en MongoDb y el almacenamiento en caché distribuido y el bloqueo en Memcached y Redis.



Microservicios en el kit de herramientas de Pip.Services: una mirada al interior



La práctica de desarrollo muestra que, entre muchos tipos diferentes de diseños, se prefiere crear un microservicio a partir de componentes poco acoplados. El kit de herramientas de Pip.Services no impone restricciones sobre la estructura de microservicios a los desarrolladores.



Cada desarrollador es libre de elegir su propio camino. Pero el diseño de componentes tiene un fuerte apoyo en Pip.Services Toolkit. Gracias a este enfoque, se resuelven una serie de tareas:



  • Se simplifica el desarrollo y la prueba de componentes individuales.
  • Cada componente puede aislarse del resto del código y sus dependencias en las pruebas se pueden reemplazar con simulaciones simples.
  • Es posible reconfigurar un microservicio en una plataforma específica, reemplazar los servicios de infraestructura, la comunicación o las bases de datos simplemente cambiando la composición de los componentes del microservicio en el archivo de configuración sin ningún cambio de código.
  • . . , .
  • , , :



  • . :
  • , ( ).
  • , , ( ).
  • Componentes adicionales para almacenamiento en caché, monitoreo, configuración, sincronización, etc. Como regla general, estos componentes se agregan del conjunto estándar, lo que brinda una amplia variedad de opciones para la integración con varios servicios de infraestructura y plataformas (gris).
  • Se puede implementar una biblioteca cliente para simplificar el uso del microservicio. Proporciona una interfaz fácil de usar para trabajar con el microservicio y oculta los detalles de la comunicación de bajo nivel (azul).


Para crear un microservicio y configurar componentes en Pip.Services Toolkit, se utiliza un archivo de configuración. Aquí hay un ejemplo de dicha configuración:



config.yml



---
# Container descriptor
- descriptor: "pip-services:context-info:default:default:1.0"
 name: "hello-world"
 description: "HelloWorld microservice"
# Console logger
- descriptor: "pip-services:logger:console:default:1.0"
 level: "trace"
# Performance counter that post values to log
- descriptor: "pip-services:counters:log:default:1.0"
# Controller
- descriptor: "hello-world:controller:default:default:1.0"
 default_name: "World"
# Shared HTTP Endpoint
- descriptor: "pip-services:endpoint:http:default:1.0"
 connection:
   protocol: http
   host: 0.0.0.0
   port: 8080
# HTTP Service V1
- descriptor: "hello-world:service:http:default:1.0"
# Heartbeat service
- descriptor: "pip-services:heartbeat-service:http:default:1.0"
# Status service
- descriptor: "pip-services:status-service:http:default:1.0"

      
      





El contenedor en el que se envuelve el microservicio lee dicha configuración, basada en descriptores, utilizando fábricas, crea los componentes necesarios, les pasa parámetros de configuración, une los componentes entre sí e inicia procesos activos.



Este enfoque le permite diseñar servicios unificados y realizar un ajuste "fino" para una tarea específica utilizando variables de entorno directamente en el entorno ejecutable.



Pasar de monolito a microservicios sin cambiar el código



Por otra parte, cabe destacar la posibilidad de cambiar la arquitectura utilizada por la aplicación sin realizar cambios en el código fuente. Consideremos esta oportunidad con un ejemplo.



Supongamos que existe una fachada que utiliza un cliente para trabajar con un servicio. Por ejemplo, con un servicio que implementa la lógica de trabajar con balizas bluetooth (balizas). Cuando se inicia en modo de aplicación monolítica, el archivo de configuración contendrá las siguientes secciones con descriptores de componentes:



# Beacons components
- descriptor: "pip-services-beacons:persistence:mongodb:default:*"
- descriptor: "pip-services-beacons:controller:default:default:*"
- descriptor: "pip-services-beacons:client:direct:default:*"

      
      





Esta configuración en realidad crea el servicio de balizas como parte de la fachada en forma de código monolítico, y la interacción entre ellas se realiza a través del cliente directo, pero dentro de un único contenedor, como se puede ver en el diagrama a continuación.







Pero si cambia un poco el texto de configuración, el servicio de balizas se convertirá en un microservicio separado y la fachada funcionará con él a través del cliente http. Para hacer esto, elimine las secciones con controlador y persistencia en la configuración de la fachada, y cambie el tipo de cliente de directo a http: para un funcionamiento correcto, debe especificar la dirección y el puerto de las balizas de microservicio que ahora se ejecutan por separado y reiniciar la fachada para que lea la nueva configuración. También necesita ejecutar un microservicio separado con balizas, para esto puede usar la siguiente configuración:



# Beacons components

- descriptor: "pip-services-beacons:client:http:default:*"

connection:

protocol: "http"

host: "any.where.com"

port: 8086













# Http Endpoint 
- descriptor: "pip-services:endpoint:http:default:*"
  root_path: ""
  connection:
    protocol: "http"
    host: "0.0.0.0"
    port: 8086

# Beacons API V1
- descriptor: "pip-services-beacons:service:http:default:1.0"

# Hearbeat service
- descriptor: "pip-services:heartbeat-service:http:default:1.0"

# Status service
- descriptor: "pip-services:status-service:http:default:1.0"

      
      





Desde un punto de vista arquitectónico, ahora se verá así:







Como puede ver, de esta manera es posible crear aplicaciones primero en forma de monolitos, sin gastar muchos recursos en la implementación, pero tan pronto como necesite escalar, solo necesita cambiar la configuración y fácilmente Pasar a los microservicios es uno de los beneficios clave de Pip.Services Toolkit.



Herramientas adicionales del proyecto Pip.Services



Pip.Services no solo incluye el kit de herramientas de Pip.Services. En el curso de nuestro trabajo, hemos desarrollado una serie de herramientas adicionales para la conveniencia de desarrollar microservicios:

- Biblioteca de microservicios listos para usar: contiene un catálogo de microservicios listos para usar divididos en seis categorías :



  • – . , , , ..
  • – , , ,
  • – ,
  • – , , .
  • – , ,
  • — , , ;
  • Los puntos de referencia son un conjunto de utilidades para probar el rendimiento de aplicaciones y microservicios desarrollados.


- Biblioteca de plantillas : incluye varias categorías con plantillas, incluidas plantillas para el desarrollo de microservicios, personalización del espacio de trabajo, plantillas de CI / CD y plantillas de fachada.

- PowerShell Selenium WebDriver : controlador desarrollado para trabajar con Selenium desde PowerShell.

Todas estas herramientas están disponibles en el sitio web de Pip.Services.



Conclusión



Al final del artículo, me gustaría agregar que el Pip.Services Toolkit es un conjunto de patrones y componentes que simplifica el desarrollo de sistemas de microservicios usando una variedad de lenguajes de programación y proporciona implementación en varias plataformas locales y en la nube. El conjunto incluye patrones que facilitan la creación de microservicios altamente personalizables utilizando componentes débilmente acoplados que implementan funciones típicas en la transmisión y procesamiento de datos, trabajando con bases de datos, transfiriendo información usando varios protocolos síncronos y asincrónicos, funciones de monitoreo, manejo de errores y mucho más. Al mismo tiempo, Pip.Services Toolkit es fácilmente extensible y puede coexistir con otras bibliotecas y marcos gracias a un diseño basado en la composición, en lugar de la herencia.



Los principios generales y la estructura, así como la simetría de la implementación, permiten a los desarrolladores cambiar fácilmente de un idioma a otro en el menor tiempo posible. Y la interoperabilidad proporciona compatibilidad total de microservicios escritos en diferentes idiomas desde el primer momento.



Todos los microservicios de nuestra biblioteca se prueban y se utilizan en sistemas reales. Gracias al uso de Pip.Services Library en nuestros proyectos, pudimos reducir el tiempo de desarrollo del backend hasta en un 30%.



Pip.Services se está desarrollando activamente, casi todos los meses se agregan o amplían nuevas herramientas y microservicios.



La mayor parte de la información necesaria ya está en el sitio, pero todavía la complementamos activamente con nuevos materiales y continuamos trabajando en ella.



A noviembre de 2020, en base a este conjunto de herramientas, se han implementado más de mil microservicios con un alto grado de confiabilidad, alta velocidad de desarrollo y facilidad de integración. Como resultado, los líderes de la compañía tomaron la decisión de transferir completamente el producto al estado de código abierto para compartir con la sociedad soluciones exitosas en arquitectura, así como para garantizar el desarrollo posterior del proyecto mediante los esfuerzos de un mayor número de desarrolladores experimentados.



El artículo fue pensado únicamente como una descripción general, sin ejemplos detallados de implementación, así que no patees demasiado. En las siguientes publicaciones, intentaremos descubrir cómo implementar un microservicio funcional usando este kit de herramientas.



Si tienes alguna duda sobre esta caja de herramientas, pregúntala en los comentarios oa través de los canales de comunicación indicados en nuestro sitio web y definitivamente te responderemos.



Enlaces: www.pipservices.org



All Articles