Code Monkey home page Code Monkey logo

lab-insurance's Introduction

Open Asset Management System (beta)

Build Status Codacy code quality

Introducción

Este proyecto está constituido por un conjunto de módulos para gestionar productos de ahorro e inversión.

Tecnológicamente está basado en:

  • Spring Cloud

  • Spring Boot

  • Spring Integration

  • MongoDB

  • RabbitMQ

Esta aplicación incluye los siguientes proyectos:

Proyecto Información Imágenes

lab-insurance-asset

Microservicios de gestión de activos.

lab-insurance-asset-api
lab-insurance-asset-core

lab-insurance-portfolio

Microservicios de gestión de carteras.

lab-insurance-portfolio-api
lab-insurance-portfolio-core

lab-insurance-legal-entity

Microservicios de gestión de entidades legales.

lab-insurance-financial-services

Microservicios de servicios financieros.

lab-insurance-order

Microservicios de gestión de órdenes.

lab-insurance-broker

Microservicios de integración con brokers.

lab-insurance-contract

Microservicios de contratación.

lab-insurance-agreement

Microservicios de acuerdos marco.

lab-insurance-fees

Microservicios de gastos y comisiones.

lab-insurance-scheduler

Programador de tareas.

lab-insurance-zuul

Proxy.

lab-insurance-bdd

Pruebas de integración

n/a

lab-insurance-cloud-config-server

Servidor de configuración.

lab-insurance-cloud-config-server

lab-insurance-ng

Frontend.

lab-insurance-eureka

Eureka.

labcabrera/lab-insurance-eureka

lab-insurance-cloud-config

Repositorio de configuración.

n/a

lab-insurance-sso

Servidor de autenticación.

Domain model

Actualmente la aplicación cuenta con un modelo de dominio común para todos los módulos. La idea es desacoplar el modelo de los diferentes módulos y que simplemente intercambien los objetos de alto nivel (por ejemplo no queremos tener visibilidad de todos los módulos de los elementos que componen la cartera de un contrato). De este modo cada módulo estaría perfectamente desacoplado del resto y podría ser desarrollado con otro ciclo de vida independiente.

Como estoy en proceso de refactor la idea es definir las entidades en el módulo de domain-hateoas para reducir el acoplamiento, aunque esto aún está en la lista de cosillas por hacer.

Contratación

La contratación está separada en dos módulos. Un gateway que simplemente provee de los servicios REST comunes y hace de dispatcher para encolar los mensajes en RabbitMQ.

Después tenemos el otro módulo (core) que procesa los mensajes obtenidos de RabbitMQ.

Esencialmente el flujo es sencillo:

  • El cliente invoca al gateway con un bean de tipo ContractCreationData que contiene toda la información necesaria para crear el contrato.

  • El gateway traslada el bean a un canal de de entrada donde se definirá el flujo a través de DSL, por ejemplo parte de este flujo será controlar las validaciones.

  • Como parte del flujo DSL el gateway encolará la petición en RabbitMQ y se quedará esperando la respuesta (este proceso puede hacerse de forma síncrona para por ejemplo una contratación web o asíncrona por ejemplo para procesos batch).

  • El módulo core persistirá el contrato y devolverá el mensaje a RabbitMQ donde lo recogerá el gateway.

Posteriormente realizaremos una petición de aprobación del contrato a través del gateway. Esto generará un mensaje en la cola de aprobación que será procesado por el módulo insurance-contract-creation-core.

Una vez reciba el mensaje informará a los diferentes módulos registrados en el sistema para que realicen las operaciones necesarias de forma asíncrona:

  • Generación del portfolio

  • Generación de la documentación del contrato

  • etc.

Finalmente procesaremos la acción de recepción del pago inicial. Esto establecerá las fechas de las órdenes y encolará el mensaje para que se procese el pago.

Los diferentes mensajes que se procesarán de forma asíncrona, eso nos asegura por ejemplo que si un componente no está disponible en un determinado momento no afectará al proceso de contratación/aprobación. También facilita la integración de módulos adicionales ya que para extender la funcionalidad simplemente tendremos que modificar el DSL y no el comportamiento de ningún componente.

Development

Ejecutando el proyecto

Una vez montado el proyecto deberemos arrancar mongodb y rabbitmq. Para ello en la carpeta /docker/environment hay un docker-compose para arrancarlos en local.

También deberemos arrancar también el servidor de configuration. Podemos hacerlo también desde el docker-compose específico, arrancándolo desde nuestro IDE o utilizar el desplegado actualmente en AWS (en fase de desarrollo está aún como público para no tener que estar levantándolo cada dos por tres).

Después tenemos el proyecto insurance-bdd donde tenemos stories de diferentes operativas. Los test se encargan de arrancar los diferentes módulos utilizados.

RabbitMQ

Se puede acceder a la consola de administración desde:

Las credenciales son las del usuario por defecto de la imagen docker: guest:guest.

RabbitMQ vs Eureka

En la comunicación entre los microservicios generalmente utilizaremos RabbitMQ para aquellas operativas que implican procesos de escritura (por ejemplo la generación de una orden), mientras que para las operaciones de escritura utilizaremos descubrimiento de servicios a través de Eureka (por ejemplo la consulta de la posición de una cartera).

Nomenclatura de los módulos:

  • Los módulos ${name}-core hacen referencia a proyectos de integración sin interface web.

  • Los módulos ${name}-gateway hacen referencia a los módulos web que generalmente explotan los servicios core utilizando AMQP y exponen una API REST.

Git cloud config

El repositorio utilizado para la configuración es:

Temporalmente podremos utilizar la instancia desplegada en Amazón:

References

lab-insurance's People

Contributors

labcabrera avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

lab-insurance's Issues

Abstracción de los estados de las entidades e histórico de acciones

El modelo actual es una versión cero que simplemente tiene un String para identificar el estado de las entidades y una información de auditoría básica.

Unificar el sistema para tener un modelo común y poder gestionar las acciones, transiciones y los estados de forma más sencilla.

Carga inicial

Acordar un sistema de carga inicial de sistema con la parametrización básica

Ahora mismo mongo se arranca con un script de la carpeta resources a modo de poc.

Estudiar si cada módulo core debería ser responsable de auto-popularse cuando arranca (pensar si las funcionalidades de spring-batch son las más adecuadas)

Separación del modelo

Actualmente el módulo insurance-domain tiene el modelo de todos los módulos.

Hay que separarlo para que cada módulo contenga las entidades propias y que el modelo común sólo contega los contratos de alto nivel entre los diferentes módulos para simplificar la comunicación entre ellos.

El primer candidato es el módulo portfolio. Este sólo debería exponer información tal como la información de la provisión matemática de una cartera y no la información interna con la que se va a persistir.

Revisar integración zuul-eureka

Revisar por que no funciona lo que en la documentación debería funcionar

Se supone que registando la ruta con el nombre del recurso que se registra en eureka podemos mapear:

zuul:
prefix: /api
routes:
${nombre-de-mi-modulo}: /{path}**

Pero eso no funciona así que tengo que tener los mapeos que sólo funcionan en local:

zuul:
prefix: /api
routes:
insurance-contract-common-gateway:
path: /contracts/**
url: http://localhost:8090/

Fix travis build

Arreglar la compilación en travis y perfilizar aquellas pruebas que son unitarias y aquellas que son de integración.

Definir estrategia de lectura de precios

Durante el proceso de valorización de una orden (OrderValorizationDslConfig) se necesita leer los precios de los assets involucrados.

Mi primera idea es hacerlo vía amqp utilizando un splitter-aggretator, de tal modo que espero hasta que recibo el mensaje con los precios para seguir con la operación

Otra opción sería hacerlo vía REST con el asset-gateway

Me gusta más la primera opción aunque también resulta bastante más complicada y no sé si tiene alguna ventaja que lo compense (aparte de que los test no dependerían de tener levantado el servicio)

Agrupación de librerías en gradle

Mejorar la definición en gradle de los proyectos

Actualmente la resolución de dependencias está basada en este clunky-workaround:

configure(subprojects.findAll {it.name.endsWith("-core")}) { ... }

configure(subprojects.findAll {it.name.endsWith("-gateway")}) { ... }

Definición del alta de las entidades legales en el flujo de contratación

El sistema más básico es buscar a partir de determinados criterios (mirar si ya tiene un id, comprobar por número de identificación, etc) si ya existe. En en el caso de no existir simplemente se registra cuando se persiste el contrato.

Extraer la lógica al módulo de entidades legales y definir una parametrización que no esté acoplada al modelo de contratación (por ejemplo para una app solamente vamos a requerir el email, mientras que en otra deberemos verificar la información proporcionada antes de proceder a la validación del contrato)

Prototipo de frontal

Esto implica:

  • Definición de las APIs REST de los diferentes gateways
  • Integración de zuul
  • Determinar los tipos de frontales que va a tener la aplicación

Modelo agnostico de contratación

Abstracción del modelo de contratación

Hacer independiente del sistema de los flujos (por ejemplo sería equivalente la contratación de un seguro que abrir una cuenta en una web-app para operar en bolsa a tiempo real)

Abstracción del modelo de entidades

Ahora el modelo de entidades es bastante pobre y diferencia entre personas físicas y jurídicas.

Separar el modelo a un módulo aparte del que dependa insurance-domain y completarlo.

Extraer elementos comunes de configuración

Ahora mismo no se proporciona ninguna utilidad que facilite la configuración entre los módulos

Sería interesante tener una configuración común para los módulos core y gateway que extraiga el factor común y simplifique la configuración vía org.springframework.context.annotation.ImportSelector & cia.

Control de procesamiento asíncrono en test

En la simulación de ejecución de acciones la asincronía es un problema dado que no se controla que se incremente el día a procesar sólo cuando las acciones han terminado

En un entorno productivo esto no debería pasar dado que el margen de tiempo para que se procesen las acciones es suficiente, pero cuando se ejecuta a lo bestia no da tiempo.

Hay algo montado en la máquina de ejecución de acciones para funcionar de modo síncrono, pero falta por darle una vuelta o dos.

Definir sistema de scheduling

Pienso que unar un sheduler convencional no es suficiente para solucionar las probleméticas de la aplicación (básicamente definir ciertas acciones que deben ser ejecutadas a una fecha dada con cierta orquestación adicional en funcion de aspectos programáticos)

La solucion que tengo en la cabeza es añadir un modelo específico de acciones que deben ser ejecutadas y montar el scheduler/polling sobre el: ir persistiendo en cada módulo las acciones que se deben ejecutar en cada determinado momento y un sistema sencillo que se encargue de irlas encolando a partir de la información de cada ejecución

Estudiar alternativas menos home-made

Configuración de routing

Ahora mismo las colas de amqp están hardcodeadas. La idea es que sean parametrizables de modo que en el proceso de adaptación (framework -> producto) puedan simplemente cambiarse para extender funcionalidades particulares

Montar imagenes docker para aws

Ahora los docker-compose están montados para el entorno de desarrollo local.

Estaría bien ir montando cada una de las imágenes de los módulos para poder publicarlas sin teclear demasiado en AWS o donde sea

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.