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 @Activate
se 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
3.Haz que el filtro sea efectivo
Hay tres maneras
- En la clase de implementación del filtro personalizado,
@Activate
especifique 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. - Especificado en el atributo de filtro del proveedor de servicios.
- 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.