Step-Into inteligente para la depuración de microservicios

Cada vez más equipos de desarrollo adoptan la arquitectura de microservicios y se enfrentan a nuevos desafíos. Puede ser difícil diagnosticar fallas en un sistema distribuido y se requieren nuevas soluciones al probar y desarrollar componentes que dependen de otros servicios. Estamos anunciando un complemento experimental para IntelliJ IDEA: Smart Step-Into para la depuración de microservicios . Simplifica el proceso de depuración de microservicios con la acción Smart Step-Into mejorada disponible en archivos HTTP y código Java/Kotlin.

Tenga en cuenta que este complemento no está incluido, por lo que deberá instalarlo antes de usar esta nueva funcionalidad. Ir a Preferencias | Complementos | Smart Step-Into para el complemento de depuración de microservicios, o descargue el complemento del sitio web. El complemento solo es compatible con IntelliJ IDEA Ultimate 2021.3.1+. ¡Vamos a ver cómo funciona!

Ejecutar solicitudes HTTP con una nueva acción

Nuestra aplicación de ejemplo consta de tres servicios basados ​​en Spring Boot: Usuarios, Productos y Pagos. Podemos ejecutarlos todos juntos usando la ventana de la herramienta Servicios . Como puede ver en la captura de pantalla, se ejecutan con diferentes puertos localmente, pero también puede ejecutarlos en máquinas remotas con la función Ejecutar objetivos a través de SSH o Docker. El único requisito aquí es que se ejecuten con el depurador de Java adjunto. No olvide iniciar todos sus servicios en modo de depuración si desea probar esta funcionalidad.

Supongamos que queremos activar alguna lógica comercial del servicio de usuarios y saltar directamente a su código fuente para depurar aún más el controlador de solicitudes. En este proyecto, tenemos el archivo request.http con todas las solicitudes HTTP comunes que usamos para probar nuestra aplicación manualmente. Este formato de archivo es compatible con HTTP Client , una herramienta conveniente para probar servicios web disponible en IntelliJ IDEA. Abra el archivo request.http y haga clic en el marcador de línea de ejecución para la solicitud http://localhost:8080/users . Aquí veremos la nueva acción disponible: Ejecutar y Entrar en el controlador .

Pruébelo y vea qué sucede. El depurador encontrará el servicio que define un controlador de solicitud para 

/users
URL, configurará automáticamente un punto de interrupción en la entrada del método y luego ejecutará la solicitud HTTP. Y el resto va según lo planeado: la solicitud llega a este punto final y el servicio Usuarios se detiene en el punto de interrupción. Es así de simple: active cualquier solicitud HTTP y navegue mágicamente a la declaración de servicio que maneja la solicitud.

Depuración de solicitudes de servicio a servicio

Por supuesto, no todos los servicios están expuestos al usuario final y la mayoría de las interacciones en nuestros sistemas distribuidos ocurren entre dos servicios de back-end. ¿Cómo vemos a dónde va nuestra solicitud cuando usamos API de cliente como Spring WebClient o Spring Cloud OpenFeign?

Este caso también está cubierto. Cuando nos topamos con un código que puede enviar solicitudes a otros servicios, el complemento nos mostrará un marcador de línea especial:

Recorriendo el código del servicio de Productos, podemos ver que llama al servicio de Usuarios. Luego decidimos pasar a la implementación del servicio Usuarios y hacer clic en el marcador de línea. El IDE configura automáticamente el punto de interrupción para nosotros en el controlador POST de usuarios y reanuda la ejecución. ¡Voila! Hemos navegado hasta el controlador de Usuarios.

No hemos agregado ningún punto de interrupción manualmente. El punto de interrupción en el servicio Usuarios se ha agregado automáticamente mediante la acción del marcador de línea. Este ejemplo utiliza el cliente HTTP declarativo proporcionado por Spring Cloud OpenFeign. Este no es el único escenario compatible; también podríamos usar el mismo flujo para Micronaut HTTP Client o Spring WebClient:

En este ejemplo, vemos el uso del cliente HTTP de Micronaut donde el IDE ha detectado una llamada externa y nos muestra el marcador de la línea de transición.

Cómo funciona

Todas estas acciones se basan en la funcionalidad de búsqueda de URL existente disponible en IntelliJ IDEA. Probablemente conozca la ventana de la herramienta Endpoints y las referencias en el código que proporcionan Ir a la declaración y Buscar usos para las asignaciones de URL, pero si no es así, puede obtener más información al respecto en nuestra publicación de blog . El depurador también tiene en cuenta los puntos finales del actuador Spring cuando están disponibles para encontrar el servicio de destino a través de asignaciones Spring MVC expuestas. Puede ver las asignaciones de Spring MVC expuestas mediante la pestaña Actuador de la aplicación en ejecución. Por lo general, la navegación a través del ícono del canalón es más precisa cuando el actuador Spring está habilitado para un servicio.

Tecnologías admitidas y limitaciones

A veces, puede ver el siguiente mensaje del depurador:

Este mensaje se muestra porque el complemento requiere el depurador de JVM y solo funciona con código Java y Kotlin. No todos los marcos JVM son compatibles; por ahora, solo funciona con los servidores Spring Boot y Micronaut HTTP, Spring Web Client, Spring Feign Client y Micronaut HTTP Client. Esto es solo el comienzo y lo expandiremos a muchos marcos JVM en el futuro.

De hecho, esta función es adecuada para algo más que microservicios. Si tiene una aplicación web monolítica estándar y solo desea usar una navegación conveniente al controlador de URL en la solicitud HTTP, ¡pruébelo! No necesita la arquitectura de microservicios para usarlo.