Cómo recopilar eficientemente registros de solicitud/respuesta en una arquitectura distribuida de microservicio

Este artículo describe principalmente cómo configurar la impresión de registros unificados cuando los microservicios de Spring Cloud usan Fingir como marco de comunicación entre microservicios, de modo que la información efectiva se pueda recopilar en los registros de manera más intuitiva.
(A continuación, solo se proporcionan capturas de pantalla del código principal. El código detallado se puede ver a través de los almacenes github y gitee. El directorio del código se adjunta al final del artículo )

1. Recopilación de registros de solicitud/respuesta de un solo servicio

1. Usar filtro para imprimir registros de solicitudes

2. Use ResponseBodyAdvice para imprimir el registro de respuestas

3. Utilice cartero para solicitar API

[Efecto de impresión de registro] ( Porque log.info se ejecuta después de chain.doFilter, por lo que el registro se solicita aquí )
22:58:23.365 [16582427033635607] [http-nio-6001-exec-3]  INFO LogResponseBodyAdvice.beforeBodyWrite[32] - {"code":0,"message":"成功","data":"2022-07-19 22:58:23"}
22:58:23.368 [16582427033635607] [http-nio-6001-exec-3]  INFO RequestFilter.doFilterInternal[52] - GET 192.168.31.158 /api/time header:{"x-platform":"app"},param:{"a":"1"},body:{"b":"bb"},4ms
Puede admitir varias impresiones de datos de solicitud (incluido el encabezado de la solicitud, los parámetros de URL, los parámetros del formulario del cuerpo, los parámetros sin procesar del cuerpo, los datos de respuesta)

2. Recopilación de registros de solicitudes/respuestas de microservicios (basado en Fingir)

Fingir es un marco de comunicación basado en la encapsulación http, pero debido a los diferentes métodos de llamada, es necesario realizar algunas operaciones adicionales en la recopilación de registros para complementar el registro.
Por ejemplo, el servicio actual llama a cierta interfaz de Fingir del servicio de usuario, y el clúster de servicio de usuario se implementa en tres máquinas.Quiero saber rápidamente qué máquina es el siguiente nodo llamado por el servicio actual.

1. Personalice un FeignIPClient para heredar Client.Default, reescriba el método de ejecución y agregue un registro para imprimir

Al mismo tiempo, también quiero saber los parámetros de la solicitud y los resultados de la respuesta del servicio actual que llama a Fingir.

2. Agregue un aspecto de la anotación FeignClient, porque la llamada de Feign es equivalente a la llamada del método, que se puede mejorar usando AOP

Al mismo tiempo, también espero que durante la llamada de Fingir, el contenido del encabezado de solicitud del servicio actual se pueda pasar al siguiente servicio (como algunos encabezados de solicitud públicos, ID de usuario, ID de registro de seguimiento de enlaces, etc.)

3. Utilice el interceptor RequestInterceptor proporcionado por Feign y vaya a RequestTemplate para configurar el encabezado cuando se inicie la solicitud de Feign.

【Registro de servicio actual】
​23:33:50.365 [16582448303481157] [hystrix-template-user-10]  INFO FeignIPClient.execute[42] - 13ms GET http://192.168.31.158:8002/user/getById?id=1
23:33:50.370 [16582448303481157] [http-nio-6001-exec-3]  INFO FeignCostTimeAspect.feignCostTime[30] - request feign:UserFeign.getById,mills:19,args:[1],result:{"code":0,"message":"成功","data":{"id":1,"name":"adasd","status":2,"statusDesc":"冻结"}}
23:33:50.373 [16582448303481157] [http-nio-6001-exec-3]  INFO LogResponseBodyAdvice.beforeBodyWrite[32] - {"code":0,"message":"成功","data":{"id":1,"name":"adasd","status":2,"statusDesc":"冻结"}}
23:33:50.377 [16582448303481157] [http-nio-6001-exec-3]  INFO RequestFilter.doFilterInternal[52] - GET 192.168.31.158 /api/getUserById header:{"x-platform":"app"},param:{"id":"1"},body:{},29ms
[registro de servicio al usuario]
23:33:50.363 [16582448303481157] [http-nio-8002-exec-3]  INFO LogResponseBodyAdvice.beforeBodyWrite[32] - {"code":0,"message":"成功","data":{"id":1,"name":"adasd","status":2,"statusDesc":"冻结"}}
23:33:50.366 [16582448303481157] [http-nio-8002-exec-3]  INFO RequestFilter.doFilterInternal[52] - GET 192.168.31.158 /user/getById header:{"x-platform":"app"},param:{"id":"1"},body:{},6ms
【Descripción del registro】
FingirClienteIP.ejecutar
"La línea de registro donde se imprime es la IP+puerto del host de destino
FingirCostTimeAspect.fingirCostTime
"La línea de registro donde se imprime son los parámetros de solicitud de Fingir y los resultados de respuesta
encabezado:{"x-plataforma":"aplicación"}
"Es el encabezado de solicitud pasado por RequestInterceptor
¿Qué tal? Si te resulta útil, ¡no dudes en ponerlo en marcha! ! !
Adjunto: el directorio de código involucrado
github:https://github.com/897665787/springcloud-plantilla
springcloud-plantilla
└── plantilla-marco
     └── consejos
          └── LogResponseBodyAdvice -- Impresión unificada de registros de respuesta
     └── aspecto
          └── FeignCostTimeAspect: registre el tiempo dedicado a solicitar la interfaz de Fingir e imprímalo en el registro de llamadas
          └── FeignIPClient: imprime la información de la máquina de destino de la solicitud de simulación
     └── autoconfigurar
          └── LoadBalancerFeignClientAutoConfiguration -- configuración automática de FeignIPClient
     └── filtro
          └── RequestFilter: solicitud de impresión del registro de parámetros
     └── interceptor
          └── FeignHeaderInterceptor: pasa el valor del encabezado durante la llamada de Fingir

Supongo que te gusta

Origin blog.csdn.net/w13528476101/article/details/125947312
Recomendado
Clasificación