Práctica platform¶
Enunciado:¶
Se debe lograr desarrollar y deployar dos sistemas, una web API y un Worker, con sincronización a través de Kafka
Objetivos¶
Adquirir conocimientos en:
- Desarrollo de web API
- Estándar Rest
- Validar request
- Integración a base de datos
- Conexión
- ABM de recurso
- Consultas
- Sincronización con Kafka
- Publicador
- Consumidor
- Implementación auditoria y monitorización
- Logging de información
- Implementación de metricas
- Unit Test
- Deploy en OCP
Onboarding Base 1. Desarrollo de Web API * Puntos a validar: Estandar Rest, Validación Request. 2. Integración a base de datos * Puntos a Validar: Conexión a BBDD, ABM, Querys. 3. Auditoria: * Puntos a conocer: Logging, metricas y treacing. 4. Unit Test: * Puntos a validar: Unit Test, Code Coverage. 5. Deploy en OCP.
Onboarding Kafka 6. Desarrollo de Publicador/Subcriptor Puntos a conocer: Generación de eventos, publicar mensaje, consumir mensaje.
Recursos¶
Se preparo una carpeta con recursos necesarios para completar el desafio. Puede acceder a ellos desde GitHub
ETAPA 1¶
Se debe desarrollar un sistema que permita dar de alta a un pedido y pueda consultar la información de dicho pedido.
Web API¶
- Desarrollar una web API que realice el alta de un pedido. Se debe exponer los siguientes endpoints.
[POST] ~/api/pedido
-body
{
"cuentaCorriente" : "123123123123",
"codigoDeContratoInterno": "123123123"
}
Si la operación fue procesada correctamente, devolver el código
201 - Created
y en un header la url para obtener el resultado. Por ejemplo:Location: "/api/pedido/{id}"
, donde id es el identificador que se le asignó a esa operación.Validar que los valores,
cuentaCorriente
ycodigoDeContratoInterno
del request sean números. En caso de que no cumpla la validación devolver un mensaje de error, con un mensaje adecuado y un status code 400 - bad request.
- Además se debe disponibilizar una API de consulta que devuelva la información de un pedido creado previamente. La API debe cumplir lo siguiente:
[GET] ~/api/pedido/{id}
Realizar la validación pertinente para que el Id ingresado sea un uniqueidentifier.
En caso de no existir el pedido se debe devolver un mensaje de error, con el mensaje adecuado y un status code 404 - not found.
En caso de resultar correcto el request se debe devolver la siguiente estructura con un status code 200 - Ok.
{
"id": "f61da6b5-b7ab-41e8-aa63-1c0174bfbfc9",
"numeroDePedido": 1212312312,
"cicloDelPedido": "f61da6b5-b7ab-41e8-aa63-1c0174bfbfc9",
"codigoDeContratoInterno": 123123123,
"estadoDelPedido": "CREADO",
"cuentaCorriente": 123123123123,
"cuando": "2021-01-01"
}
Database¶
El endpoint de POST pedidos, debe realizar la creación en la base de datos de ese recurso. Por lo que debe realizar la configuración y el mapeo de las entidades a la base de datos. En la carpeta de recursos se encuentra el script para construir el modelo de datos en una base sql server.
Puede instalar el motor de SQLServerExpress o utilizar la imagen docker que se encuentra en la carpeta de recursos.
para conectarse. Puede usar el siguiente connection string
Yml
ConnectionString: "Data Source=(localhost:{puerto donde se levanta el docker});Initial Catalog=test;Persist Security Info=True;User ID=sa;Password=admin1234"
(esta configuración corresponde si se levanta la imagen del docker y ejecutando el script para la creación de las tablas y las entidades)
Para hacer el insert se debe completar el objeto con los siguientes datos.
{
"id": "f61da6b5-b7ab-41e8-aa63-1c0174bfbfc9", // Guid.NewGuid()
"numeroDePedido": null, // siempre null en la creación
"cicloDelPedido": "f61da6b5-b7ab-41e8-aa63-1c0174bfbfc9", // valor tomado del id generado
"codigoDeContratoInterno": 123123123, // valor tomado de request
"estadoDelPedido": 1, // 1 - creado, siempre en esta intancia.
"cuentaCorriente": 123123123123, // valor tomado de request
"cuando": "2021-01-01" // Fecha actual.
}
Por otro lado, el endpoint de GET pedido debe buscar en base de datos el pedido y devolver la información como se detallo anteriormente.
ETAPA 2¶
Se debe realizar la lógica para asignar el número de pedido.
Publicador¶
Ajustar la web API para que cada vez que se cree un pedido se publique el evento Pedido
en el Tópico PedidoCreado
de Kafka, la clase del evento se encuentra en la librería
Nuget
Install-Package Andreani.Onboarding.Event --version 6.0.0
go get ---
La estructura del evento es similar a la estructura de la entidad.
Config AMQStreams¶
AMQStreams:
BootstrapServer: "SSL://cluster-kafka-bootstrap-amq-streams-test.apps.ocptest.andreani.com.ar:443"
SchemaUrl: "http://apicurioregistry.apps.ocptest.andreani.com.ar/apis/ccompat/v6"
Protocol: Ssl
AutoOffsetReset: Earliest
AutoRegisterSchemas: true
MaxRetry: 3
Se deberá utilizar el archivo kafka.pem donde se disponibiliza las certificaciones y se debe alojar (recomendacion) en la raíz para luego que dentro de la configuración del appsetting lo logre encontrar. En caso de especificar otra ruta se debe aclarar en la configuración. El archivo se encuentra dentro de la carpeta resource
Consumer Worker¶
Se debe crear otro microservicio con la estructura de una application worker, que debe estar subscripto al evento Pedido
. Cuando recibe el evento debe ejecutar algún algoritmo random para asignar un número de pedido.
Luego debe publicar el evento Pedido
, con el valor de número de pedido encontrado, en el tópico PedidoAsignado
.
Consumer Web API¶
Modificar la Web API para que se subscriba al evento Pedido
del topic PedidoAsignado
, cuando reciba el evento debe actualizar la información del pedido con el número de pedido y actualizar el estado del pedido a ASIGNADO
.
ETAPA 3¶
auditoria y monitorización¶
Agregar en la web API:
- En cada request debe existir logs de tipo información con la información que se intenta crear o consultar y logs de error en caso de falla de la app.
- Agregar observabilidad con el Agente de Elastic APM
Unit test¶
Realizar los unit test que crea necesario para cubrir la mayor cantidad de escenarios posibles.
ETAPA 4¶
Realizar el deploy de los microservicios en open shift.
Toda la información necesaria para realizar la configuracion en el startup tanto como para publicar un evento y Consumir en kafka se puede en el Docs de arquitectura