JAVA 이상 의 최고의 공학 실천 탐구

이 글 은 이미 작가 가 금 무 를 차지 하여 왕 이 운 커 뮤 니 티 에 권한 을 부여 하여 발표 하 였 다.
왕 이 클 라 우 드 커 뮤 니 티 를 방문 하여 더 많은 왕 이 기술 제품 의 운영 경험 을 알 아 보 는 것 을 환영 합 니 다.
먼저 배경 설명:
  • 프로젝트 로그 의 Exception 은 보초병 에 의 해 통일 적 으로 감시 되 고 신고 된다
  • .
  • 비교적 많은 프로젝트 는 dubbo 를 바탕 으로 서비스 화
  • 를 하고 있다.
    폼 매개 변수 검사 에서 이상 하 게 사용 하 는 제안
    이상 메커니즘 에 존재 하 는 가장 큰 장점 은 JAVA 함수 가'다 중 반환 값'을 실현 하 는 것 이다.예 를 들 어:
    public int caculate(int a, int b) throws MyException {
    }

    이 코드 의 본질은 함수 caculate 가 이러한 반환 값[int,MyException]을 가지 게 하 는 것 입 니 다.이렇게 하면 무슨 좋 은 점 이 있 습 니까?
    이상 을 사용 하지 않 는 다 고 가정 하면 위의 함 수 는-1,-2 와 같은 마법 수 로 만 이상 상황 을 표현 할 수 있 습 니 다.이렇게 하면 비교적 나 쁠 수 있 습 니 다.이 함 수 를 사용 하 는 사람 은 반환 값 의 이 마법 수 를 매우 조심스럽게 처리 해 야 하기 때 문 입 니 다.항상 빠 지기 쉬 운 일 입 니 다.
    이렇게 보면 입 참 검 사 를 할 때 비합법적 인 파 라미 터 를 발견 하고 IllegalArgument Exception 으로 돌아 가 는 것 은 매우 합 리 적 이 고 자 연 스 러 운 용법 이다.
    웹 폼 장면 과 결합 하여 사용자 가 입력 한 매개 변 수 를 검증 하 는 것 이 라 고 가정 합 니 다.배경 검증 이 합 법 적 이지 않 습 니 다.MVC 의 Controller 층 이 통일 적 으로 패키지 하여 전단 에 되 돌아 가 는 것 은 비교적 우아 한 방법 이 고 전단 은 백 엔 드 의 되 돌아 오 는 데이터 구조 에 맞 춰 유용 한 오류 정 보 를 사용자 에 게 보 여 주 는 것 입 니 다.앞에서 언급 한 배경 과 결합 하면 여기 서 발생 하 는 이상 은 스 택 로 그 를 인쇄 해 서 는 안 됩 니 다.그렇지 않 으 면 보초병 의 오보(오보 라 고 하 는 이 유 는 흔히 볼 수 있 는 상황 이기 때문에 운영 자 들 의 주 의 를 끌 지 말고 처리 에 개입 해 서 는 안 됩 니 다)를 초래 할 수 있 습 니 다.건의 하 는 방법 은 해당 하 는 이상 로 그 를 기록 하 는 것 입 니 다.
    보초병 의 오보 신고 가 없 었 다 면 창고 일 지 를 인쇄 할 필요 가 있 었 을 까?일반적으로 인쇄 이상 스 택 은 운영 자(또는 개발 자)가 이상 원인 을 신속하게 찾 아 이상 을 복구 하 는 데 도움 을 주기 위해 서 이다.한편,이곳 의 장면 은 운영 자가 개입 할 필요 가 없고 전단 페이지 에서 사용자 에 게 알려 주 며 사용자 가 해당 하 는 파 라 메 터 를 조정 한 후에 다시 요청 하면 회복 할 수 있다.
    좀 수 다스 럽 게 말 하지만 사실은 이러한 관점 을 더욱 명확 하 게 강조 하기 위해 서 입 니 다.이상 을 사용 하 는 것 은 반드시 스 택 을 인쇄 해 야 하 는 것 이 아 닙 니 다.예 를 들 어 웹 폼 이 참 여 된 검 측 등 입 니 다.
    dubbo 인터페이스 에서 이상 하 게 사용 하 는 제안
    먼저 몇 개의 dubbo 이상 과 관련 된 흔 한 문 제 를 던 집 니 다.
  • dubbo provider 방법의 실현 바 텀 은 사용자 정의 XXRuntime Exception 을 사 용 했 습 니 다.api jar 에 이 XXRuntime Exception 정 의 를 포함 하지 않 았 습 니 다.consumer 호출 은 XXRuntime Exception 을 식별 할 수 없 음 을 발 견 했 습 니 다."Got unchecked and undeclared exception..."
  • dubbo provider 방법의 실현 바 텀 은 Illegal Argument Exception 을 사 용 했 고 consumber 호출 은 Illegal Argument Exception 을 발생 시 켰 으 며 provider 는 자신의 시스템 에 이러한 이상 이 발생 한 것 을 발견 하지 못 했다(비교적 전형 적 인 상황 은 provider 의 데이터 베이스 연결 이상).해당 하 는 모니터링 도 없 이 consumber 가 신고 할 때 까지 기다 릴 수 밖 에 없 었 다.

  • 상기 두 문제 의 발생 은 dubbo 의 실현 과 관련 이 있 습 니 다.dubbo 가 이상 을 어떻게 처리 하 는 지 보 겠 습 니 다(ExceptionFilter).
    Result result = invoker.invoke(invocation);if (result.hasException() && GenericService.class != invoker.getInterface()) {    try {
            Throwable exception = result.getException();        //    checked  ,    
            if (! (exception instanceof RuntimeException) && (exception instanceof Exception)) {            return result;
            }        //          ,    
            try {
                Method method = invoker.getInterface().getMethod(invocation.getMethodName(), invocation.getParameterTypes());
                Class>[] exceptionClassses = method.getExceptionTypes();            for (Class> exceptionClass : exceptionClassses) {                if (exception.getClass().equals(exceptionClass)) {                    return result;
                    }
                }
            } catch (NoSuchMethodException e) {            return result;
            }        //             ,       ERROR  
            logger.error("Got unchecked and undeclared exception which called by " + RpcContext.getContext().getRemoteHost()
                    + ". service: " + invoker.getInterface().getName() + ", method: " + invocation.getMethodName()
                    + ", exception: " + exception.getClass().getName() + ": " + exception.getMessage(), exception);
    ...

    이 를 통 해 알 수 있 듯 이 unchecked 이상 이 성명 을 표시 하지 않 으 면 error 로 그 를 자동 으로 인쇄 합 니 다.
    그럼 어떻게 우아 하 게 해결 해 야 하나 요?
  • dubbo 인 터 페 이 스 는 Runtime Exception 을 밖으로 던 지 는 것 을 피해 야 합 니 다.건의 하 는 방법 은 인터페이스 에서 코드 를 실현 하 는 가장 바깥쪽 에서 다음 과 같은 예 시 를 통일 적 으로 사용 하여 포장 하 는 것 이다.
  • Response r;try {
        r = ...;
    } catch (RuntimeException e) {
        logger.error("error msg", e);//                ,         
        r = Response.buildErrorResponse(e.getMessage());
    }return r;
  • 인터페이스 의 미 를 이상 으로 표현 하려 면 Checked Exception
  • 을 사용 하 십시오.
    이상 사용 vs null 사용
    앞에서 언급 했 듯 이 이상 한 사용 은 인 코딩 의 편 의 를 가 져 올 수 있 지만 더 많은 무용 로그 출력 에 위험 을 묻 었 다.위의 포장 코드 의 예 를 들 어 Runtime Exception 이 네트워크 연결 이나 데이터 베이스 연결 이 이상 하 다 면 유용 한 이상 에 속 하지만 특정한 데이터 가 존재 하지 않 기 때문에 Illegal Argument Exception 을 던 진 것 이 라면 로 그 는 좀 불필요 해 보인다(로그 내용 에 따라 효과 적 인 행동 으로 막 을 수 없다).
    public Permission loadPermission(Long userId) {    if(...) {        return ...
        } else {        throw new IllegalArgumentException();// or throw new NotFoundException();
        }
    }

    이러한 표기 법 에서 loadPermission 은 try{...}catch(){...}의 추가'보살핌'이 필요 합 니 다.좀 번 거 롭 지 않 습 니까?이때 바로 null 로 돌아 가면 더 직접적 으로 올 수 있 을까요?잘못 한 것 과 없 는 것 은 사실 별 개의 일 이 니 자세히 고려 해 야 한다.
    그래서 여기 서 제 가 드 리 는 건 의 는 사용 이상 을 간단하게 피 할 수 있다 면 피 하 는 것 입 니 다.
    이상 통일 처리 건의
    앞에서 언급 했 듯 이 전단 과 상호작용 할 때의 이상 처리,dubbo 인터페이스 에서 의 이상 처 리 는 모두 한 가지 언급 했다.실행 할 때 이상 한 건 의 를 통일 적 으로 처리 하 는 것(Checked 이상 은 프로그래머 에 의 해 강제로 처리 되 었 습 니 다).확장 해 보 세 요.또 어떤 이상 이 통일 적 으로 처리 되 어야 합 니까?어떤 차원 에서 통일 을 하 는 건 가요?나 는 라인 의 용 도 를 둘러싸 고 집합 처 리 를 할 수 있다 는 것 을 이해한다.흔히 볼 수 있 는 WEB 시스템 에서 다음 과 같은 몇 가지 스 레 드 가 실 행 됩 니 다.
  • 메 인 스 레 드(메 인 함수,이상 은 JVM 처리)
  • HttpRequest 스 레 드(일반적으로 Controller 가 제공 하 는 hook 방법 으로 처리)
  • 비동기 작업 스 레 드 탱크 의 작업 스 레 드(일반적으로 스 레 드 탱크 에서 hook 인터페이스 방법 으로 통일 처리)
  • dubbo 스 레 드(ExceptionFilter 에서 통일 처리)
  • 이상 의 사 고 를 정리 한 후에 여러분 은 이상 한 통일 처 리 를 참조 할 수 있 습 니 다.
    Spring MVC:
    @ExceptionHandlerpublic Object exception(Exception exception, HttpServletRequest request, HttpServletResponse response) {    return ExceptionUtil.processException(request, response, exception, logger);
    }

    스 레 드 탱크:
    ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(11, 100, 1, TimeUnit.MINUTES, //   
            new ArrayBlockingQueue(10000),//   
            new DefaultThreadFactory()) {   
        protected void afterExecute(Runnable r, Throwable t) {   
            super.afterExecute(r, t);   
            printException(r, t);   
        }   
    };

    dubbo:
    public Result invoke(Invoker> invoker, Invocation invocation) throws RpcException {
        Result result = invoker.invoke(invocation);    if(result.hasException()) {
            printException(result.getException());
        }    return result;
    }

    종결 어
    인터넷 에서 JAVA 의 이상 사용 과 가장 좋 은 실천 에 관 한 글 이 비교적 많 고 대부분이 이론 에 흐 르 며 실제 업무 에 대한 지도 적 의미 가 부족 하 며 흔히 볼 수 있 는 응용 장면,예 를 들 어 웹 층,dubbo 인터페이스 층 에 대한 실천 토론 이 부족 하 다.본 고 는 실제 응용 묘사 이상 사용 장면 을 결합 시 켜 공학 적 으로 가장 좋 은 이상 실천 탐색 을 전개 하고 자 한다.수준 이 제한 되 어 있 기 때문에 내용 에 이해 상의 편차 가 생 길 수 밖 에 없 으 니 비판 과 지적 을 바 랍 니 다.
    클 라 우 드 안전(방패)콘 텐 츠 안전,인증 코드 등 서비스 무료 체험
    더 많은 왕 이 기술,제품,운영 경험 공유 클릭 하 세 요.
    안 드 로 이 드 TV 개발(4)[추천]4 단계 스마트 하드웨어 이상 사례 조사[추천]온라인 로그 집중 화 시각 화 관리:ELK

    좋은 웹페이지 즐겨찾기