SpringBoot 를 사용 하여 마이크로 서비스 시간 초과 재 시도 모드 를 구현 하 는 예제

resilience4j 의 라 이브 러 리 와 Spring Boot 를 사용 하여 신축성 이 높 은 마이크로 서 비 스 를 설계 합 니 다.
마이크로 서 비 스 는 본질 적 으로 분포 식 이다.분포 식 시스템 을 사용 할 때 이 첫 번 째 법칙 을 항상 기억 하 세 요- 인터넷 에서 무슨 일이 든 일어 날 수 있다.이런 의외 의 고장 을 처리 하 는 것 은 해결 하기 어 려 울 것 이다.고장 은 모든 것 일 수 있 습 니 다.-응용 프로그램,하드웨어 또는 네트워크 등.
시스템 이 고장 에서 회복 되 고 정상 적 인 운행 을 유지 하 는 능력 은 시스템 을 더욱 갖 추 게 한다. 신축성그것 은 하류 서비스의 어떠한 등급 연결 고장 도 피 했다.
다시 시도 모드:
마이크로 서비스 시스템 구조 에서 여러 서비스(A,B,C,D)가 있 을 때 하나의 서비스(A)는 다른 서비스(B)에 의존 할 수 있 고 다른 서비스(B)는 C 에 의존 할 수 있다 는 것 을 유추 해 볼 수 있다.어떤 문제 로 인해 서비스 D 가 예상 한 대로 응답 하지 못 할 수도 있 습 니 다.서비스 D 가 메모리 부족 과 같은 일부 이상 을 일 으 킬 수 있 습 니 다. 오류 나 내부 서버 오류.이러한 이상 은 하위 서비스 로 연결 되 어 불량 사용자 체험 을 초래 할 수 있 습 니 다.다음 과 같 습 니 다.

때때로 구 글 닷 컴 이 우리 에 게 도움 이 되 지 않 을 때 우 리 는 포기 하지 않 을 뿐이다.우 리 는 페이지 가 다음 에 정상적으로 작 동 할 수 있 고 대부분 상황 에서 페이지 를 새로 고 칠 것 이 라 고 가정 하기 때문에 페이지 를 새로 고치 기만 하면 된다.간헐 적 네트워크 문 제 는 매우 보편적이다.마이크로 서비스 분야 에서 저 희 는 같은 서비스 D 의 여러 인 스 턴 스 를 실행 하여 높 은 가용성 과 부하 균형 을 실현 할 수 있 습 니 다.만약 에 하나의 인 스 턴 스 에 문제 가 있 고 우리 의 요청 에 정확하게 응 하지 못 할 경우 이 요청 을 다시 시도 하면 부하 이퀄 라이저 는 운행 상태 가 좋 은 노드 에 요청 을 보 내 고 정확 한 응답 을 받 을 수 있 습 니 다.따라서'재 시도'옵션 을 사용 하면 정확 한 응답 을 받 을 수 있 는 기회 가 더 많 습 니 다.

이 간단 한 응용 프로그램 을 고려 하여 이 재 시도 모드 를 설명 합 시다.

위 에서 말 한 바 와 같이 우 리 는 여러 개의 마이크로 서비스 가 있다.
제품 서 비 스 는 제품 목록 을 충당 하고 제품 정보 제공 을 책임 집 니 다제품 서 비 스 는 등급 평가 서비스 에 달 려 있다4.567917.평 점 서비스 유지 제품 평가 와 평 점. 대량의 데 이 터 를 가지 고 있 기 때문에 속도 가 느 린 것 은 잘 알려 져 있다4.567917.우리 가 제품 의 상세 한 정 보 를 볼 때마다 제품 서 비 스 는 평 점 서비스 에 요청 하여 이 제품 의 평 가 를 받는다4.567917.저 희 는 다른 서비스 도 있 습 니 다.예 를 들 어 계 정 서비스,주문 서비스 와 지불 서비스 등 은 본 고의 토론 과 무관 합 니 다4.567917.제품 서 비 스 는 핵심 서비스 로 그것 이 없 으 면 사용 자 는 주문 작업 절 차 를 시작 할 수 없습니다.
설정:

<dependency>
    <groupId>io.github.resilience4j</groupId>
    <artifactId>resilience4j-spring-boot2</artifactId>
    <version>1.6.1</version>
</dependency>
제품 서 비 스 는 사용자 의 검색 조건 에 따라 제품 목록 을 제공 하 는 것 을 책임 진다.그것 은 관건 적 인 부하 에서 도 시작 하고 응답 해 야 할 핵심 서비스 중 하나 이다.떨 어 지면 소득 에 심각 한 영향 을 미친다.이 서 비 스 는 등급 평가 서비스 에 달 려 있 기 때문에 우 리 는 어떠한 네트워크 문제 나 등급 평가 서비스 가 이 제품 서비스 에 영향 을 주지 않 기 를 원 하지 않 습 니 다.이것 이 바로 resilience4j 를 사용 하 는 것 입 니 다. 창고 의 목적.
  • 저 는 먼저 resilience4j 에 설정 을 만 들 었 습 니 다.  아래 와 같다.여기 서 우 리 는 시간 을 초과 하여 3 초 로 명확 하 게 설정 할 것 이다.우 리 는 특정한 시간 초과 내 에 여러 개의 서 비 스 를 추가 할 수 있다
  • 4.567917.우 리 는 다양한 서비스 설정 을 할 수 있 습 니 다.다음 과 같 습 니 다
  • ratingService 에 대해 우 리 는 최대 3 번 의 재 시험 을 실시 하여 5 초 늦 출 것 이다
  • 4.567917.retry Exceptions:이것 은 우리 가 다시 시도 할 이상 입 니 다.이것 은 배열 필드 입 니 다.여러 개의 예 외 를 설정 할 수 있 습 니 다
  • ignore Exceptions:이상 이 있 습 니 다.다시 시도 하고 싶 지 않 을 수도 있 습 니 다.예 를 들 어 잘못된 요청 은 잘못된 요청 이다.다시 시도 하 는 것 은 무의미 하 다.그래서 우 리 는 이 점 을 소홀히 했다
  • 
    resilience4j.retry:
      instances:
        ratingService:
          maxRetryAttempts: 3
          waitDuration: 5s
          retryExceptions:
            - org.springframework.web.client.HttpServerErrorException
          ignoreExceptions:
            - org.springframework.web.client.HttpClientErrorException
        someOtherService:
          maxRetryAttempts: 3
          waitDuration: 10s
          retryExceptions:
            - org.springframework.web.client.HttpServerErrorException
            - java.io.IOException
    코드:
    
    @Service
    public class RatingServiceClient {
    
        private final RestTemplate restTemplate = new RestTemplate();
    
        @Value("${rating.service.endpoint}")
        private String ratingService;
    
        @Retry(name = "ratingService", fallbackMethod = "getDefault")
        public CompletionStage<ProductRatingDto> getProductRatingDto(int productId){
            Supplier<ProductRatingDto> supplier = () ->
                this.restTemplate.getForEntity(this.ratingService + productId, ProductRatingDto.class)
                        .getBody();
            return CompletableFuture.supplyAsync(supplier);
        }
    
        private CompletionStage<ProductRatingDto> getDefault(int productId, HttpClientErrorException throwable){
            return CompletableFuture.supplyAsync(() -> ProductRatingDto.of(0, Collections.emptyList()));
        }
    
    }
    코드 설명:
  • @Retry 는 resilience4j 가 이 방법 에 대해 재 시도 논 리 를 실행 할 것 이 라 고 밝 혔 다
  • name = ratingService 나타내다 resilience4j Yml 의 ratingService 설정 을 사용 합 니 다
  •  main 방법 이 어떤 이유 로 실 패 했 을 때 fallback Method 를 사용 합 니 다
  • 총결산
    다시 시도 모드 신축성 마이크로 서 비 스 를 디자인 하 는 가장 간단 한 마이크로 서비스 입 니 다. 디자인 모델 중 하나.재 시 도 를 도입 하면 네트워크 와 관련 된 문 제 를 해결 할 수 있다.
    코. 여기 서 얻 을 수 있 습 니 다.
    여기 서 획득 할 수 있 습 니 다.
    이상 은 SpringBoot 를 사용 하여 마이크로 서비스 시간 초과 재 시도 모델 을 실현 하 는 예제 의 상세 한 내용 입 니 다.SpringBoot 가 마이크로 서비스 시간 초과 실현 에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 하 시기 바 랍 니 다!

    좋은 웹페이지 즐겨찾기