[dubbo] 사용자 정의 필터 인쇄 인터페이스 요청 로그

표적

애플리케이션이 dubbo 인터페이스를 호출하거나 제공된 dubbo 인터페이스를 호출하면 인터페이스 요청의 입력 매개변수 정보, 서비스 이름, 메소드 이름 및 반환 값이 사용자 정의 필터를 통해 인쇄됩니다.

필터 구현

1. 사용자 정의 필터 구현 클래스

@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;
    }
}

주석 @Activate의 그룹 매개변수는 필터의 유효 범위를 지정하는 데 사용되며, 여기에 공급자와 소비자가 모두 추가되며, 그러면 애플리케이션이 자체적으로 제공하는 더보 인터페이스와 더보 인터페이스를 호출할 때 로그를 인쇄합니다.

2. 필터 구성

리소스 디렉터리에 파일을 만들고 META-INF/dubbo/internal/org.apache.dubbo.rpc.Filter
다음 내용을 작성합니다.
dubboRequestLog=com.yourapp.path.DubboProviderLogFilter
여기에 이미지 설명을 삽입하세요.

3. 필터를 효과적으로 만드세요

세 가지 방법이 있습니다

  1. 사용자 정의 필터 구현 클래스에서 @Activate서비스 제공자 또는 소비자가 주석이 달린 그룹 매개변수를 통해 적용되는지 여부를 지정하거나 동시에 적용되도록 선택할 수 있습니다.
  2. 서비스 제공자의 필터 속성에 지정됨
  3. xml 구성 파일에서 필터를 일률적으로 설정하거나
    <dubbo:provider filter="dubboRequestLog"/>, <dubbo:consumer filter="dubboRequestLog"/>필터를 통해 사용할 필터를 구성하는데, 이는 모든 서비스 제공자 또는 서비스 소비자를 대상으로 합니다.

추천

출처blog.csdn.net/u011308433/article/details/132271868