[dubbo] Registro de solicitudes de interfaz de impresión de filtro personalizado

Objetivo

Cuando la aplicación llama a la interfaz dubbo o se llama a la interfaz dubbo proporcionada, la información del parámetro de entrada, el nombre del servicio, el nombre del método y el valor de retorno de la solicitud de la interfaz se imprimen a través del filtro personalizado.

Implementar filtro

1. Clase de implementación de filtro personalizado

@Slf4j
@Activate(group = {
    
    "provider", "consumer"})
public class DubboProviderLogFilter implements Filter {
    
    

    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
    
    
        Map<String, Object> map = new LinkedHashMap<>();
        map.put("service", invocation.getTargetServiceUniqueName());
        map.put("method", invocation.getMethodName());
        map.put("params", getParams(invocation.getArguments(), invocation.getParameterTypes()));

        Result result = null;
        try {
    
    
            result = invoker.invoke(invocation);
            map.put("result", result.getValue());
            log.info("dubbo_request_log={}", JSONObject.toJSONString(map));
            return result;
        } catch (Exception e) {
    
    
            log.error("dubbo_request_catch_exception={}, e", JSONObject.toJSONString(map));
            throw new RuntimeException(e);
        }
    }

    private Map<String, Argument> getParams(Object[] argvs, Class<?>[] argts) {
    
    
        Map<String, Argument> map = new LinkedHashMap<>();
        int size = argvs.length;
        try {
    
    
            for (int i = 0; i < size; i++) {
    
    
                map.put("param" + i, new Argument(JSONObject.toJSONString(argts[i]).replaceAll("\"", ""), argvs[i]));
            }
        } catch (Exception e) {
    
    
            log.error("getParams_catch_exception=", e);
        }
        return map;
    }

    @Data
    @AllArgsConstructor
    private static class Argument {
    
    
        private String type;
        private Object value;
    }
}

El parámetro de grupo en la anotación @Activatese utiliza para especificar el alcance efectivo del filtro. Aquí se agregan tanto el proveedor como el consumidor. Luego, la aplicación imprimirá registros cuando llame a la interfaz dubbo y a la interfaz dubbo proporcionada por ella misma.

2. Configurar filtro

Cree un archivo en el directorio de recursos META-INF/dubbo/internal/org.apache.dubbo.rpc.Filter
y escriba el siguiente contenido:
dubboRequestLog=com.yourapp.path.DubboProviderLogFilter
Insertar descripción de la imagen aquí

3.Haz que el filtro sea efectivo

Hay tres maneras

  1. En la clase de implementación del filtro personalizado, @Activateespecifique si el proveedor de servicios o el consumidor surte efecto a través del parámetro de grupo anotado, o puede elegir que surta efecto al mismo tiempo.
  2. Especificado en el atributo de filtro del proveedor de servicios.
  3. En el archivo de configuración xml, configure el filtro de manera uniforme
    <dubbo:provider filter="dubboRequestLog"/>o <dubbo:consumer filter="dubboRequestLog"/>configure el filtro que se utilizará a través del filtro, esto es para todos los proveedores o consumidores de servicios.

Supongo que te gusta

Origin blog.csdn.net/u011308433/article/details/132271868
Recomendado
Clasificación