Code repository:
https://github.com/CarlosLanderas/dotnet2019-aspnet-core-best-practices
Asp.Net Core Good Practices 2019 Talk
Speakers:
Carlos Landeras - Web Team Lead at Plain Concepts ( Github / Twitter)
Luis Ruiz Pavón - DevSecOps Lead at Plain Concepts ( Github / Twitter)
Talk Agenda:
Code instrumentation using System Diagnostics
Application resilience strategies
Asp.Net Core HealthChecks and Kubernetes (Readiness and Liveness Probes) for high availability and resilience
Problem Details RFC 7807
Asp.Net Core ApiController and ApiBehaviourOptions (Convention over Configuration)
HttpContext Pipelines
Endpoint Routing
Endpoint Authorization (decoupled from MVC)
Docker testing strategies
4. Instrumentación de código
Capacidad de controlar o medir el nivel de
rendimiento de un producto, diagnosticar errores y
escribir información de rastreo.
7. ¿Qué es la resiliencia?
"Es la capacidad de absorber o evitar daños sin
sufrir un fallo completo".
8. ¿Qué es Alta Disponibilidad?
“Shit will happen, por lo que un sistema debe estar
diseñado para estar siempre disponible para los
consumidores, incluso cuando algunas de sus partes
están fallando".
11. Health Checks y Kubernetes
Lo primero, es configurar y exponer tus health checks:
12. Alta disponibilidad y tolerancia a fallos
Una aplicación puede sufrir
un deadlock, pero como su
proceso sigue en ejecución
Kubernetes piensa que todo
está correcto.
… y continua enviando
peticiones al contenedor
13. Liveness probes /health
• Nos permiten configurar tests para evaluar
que un contenedor está funcionando
correctamente.
• Podemos configurar pruebas TCP, HTTP ó
ejecución de un commando.
• Si la prueba de salud no es satisfactoria,
Kubernetes reinicia el contenedor
14. • Nos permiten configurar pruebas para evaluar
que nuestra aplicación y sus dependencias
están disponibles para atender peticiones
• Si un contenedor no está “ready”, será
excluido del balanceador de carga y no se
enviarán peticiones
Readiness probes /ready
16. ¿Cuántas veces te has
montado tu propio
sistema de errores en tu
REST API?
¿Qué ocurre cuando un
cliente consume diferentes
APIs?
17. Problem details (RFC7807)
• Un standard para normalizar los mensajes de
errores en nuestras REST APIs.
• Estructura JSON
18. Asp.Net Core ApiController y ApiBehaviourOptions
• Inferencia de valores de una petición http
- Valores de ruta (Segmentos del path)
- IFormFile, IFormFileCollection desde el Form
- Parámetros complejos desde el Body
- El resto de parámetros desde la Query string
• Filtro automático para evaluación del ModelState
• Personalización de las respuestas de Model States inválidos
19. HttpContext Pipes
Alto rendimiento con menos allocations en memoria
System.IO.Pipelines es una librería diseñada para facilitar la
ejecución de Código I/O de alto performance en .NET
Esta librería nace del esfuerzo puesto por el equipo de .Net
Core en hacer de Kestrel uno de los servidores web mas
rápidos de la industria.
20. HttpContext Pipes
Alto rendimiento con menos allocations en memoria
Esta basada en la utilización de Span<T> y Memory<T>,
apis que son ya compatible con la mayoría de clases del
framework
El equipo de Asp.Net expone en el HttpContext un pipe de
lectura y otro de escritura desde la version 3.0
22. Endpoint Routing
ASP.NET Core 2.1 nos permitía crear pipelines
completos (Middlewares), pero MVC era un
framework completo que imponía cierto elementos
como:
• CORS
• Autorización
23. ¿Pero que pasa cuando tu
middleware tiene que hacer
uso de autorización o tienes
que habilitar CORS para un
pipeline concreto?
¿Qué pasa si quiero crear una
API ligera?
27. Estrategias de despliegue y testing con Docker
• Instalación/Configuración
• Redes
• Repetibles
• Stubs
• Mantenimiento
Imágenes
Red interna
Creación al vuelo de contendores
Integración real
Tags
29. Thanks and …
See you soon!
Thanks also to the sponsors.
Without whom this would not have been posible.
Notas del editor
Cuando una solicitud llega a MVC, la información de ruta se utiliza para determinar qué Controlador y Acción deben invocarse para manejar la solicitud, en función de la ruta URL. En este punto, MVC puede invocar esa acción que luego devolverá la respuesta. Si no se encuentra una ruta adecuada, se devuelve un 404 en su lugar.
El problema con este enfoque del enrutamiento es que a medida que la solicitud fluye a través de la cadena de middlewares, todos los demás middlewares no tienen idea de dónde ni quién manejará esa solicitud.