Spring Cloud로 개발하는 MSA/Microservcie간 통신

FeignClient

webmaster 2022. 2. 6. 12:41
728x90
  • REST 방식을 사용하기 위해 추상화 한 Spring cloud Netfilx을 라이브러리이다
  • 개발자 입장에서는 하나의 애플리케이션 안에서 사용하는 느낌이 들도록 사용할 수 있도록 도와준다.
  • 의존성 추가
    • UserService의 Pom.xml
  • @EnableFeignClients 어노테이션 추가
    • UserService의 Main에 어노테이션 추가
  • FeignClient 인터페이스 생성
    • UserService의 OrderServiceClient 인터페이스 생성
    • 실행하고자 하는 MSA의 이름을 @FeignClient의 name속성으로 전달한다.
    • 실제 같은 서비스에 있는듯이 Mapping을 해주면 된다.
  • UserServiceImpl 수정
    • 생성자 주입
    • 생성자로 생성한 인터페이스를 주입받는다.
    • UserServiceImpl의 getUserByUserId 메소드 수정
    • 기존에 사용하던 RestTemplate은 주석처리하여 동작하지 않도록 하고, 실제 같은 Application에 있는 듯이 사용하기만 하면 된다.

FeignClient 예외 처리

  • FeignClient에서 없는 주소를 접속하게 되면, 호출하는 곳에는 404에러가 발생하지만 이걸 사용한 곳에는 500 에러가 발생한다.
  • try - catch를 통해 FeignException을 잡아 문제가 발생하지 않는 부분은 출력하고 문제가 발생한 부분(try-catch로 감싼 부분)은 출력하지 않게 할 것이다.
  • Logging Level 추가
    • UserService의 application.yml 파일에 client에 log를 추가해준다
  • Bean 추가
    • UserService의 main 클래스에 Bean으로 등록
  • UserService 수정
    • @Override
      public UserDto getUserByUserId(String userId) {
          UserEntity userEntity = userRepository.findByUserId(userId);
          if (userEntity == null) {
              throw new UsernameNotFoundException("User not found"); //없을떄 오류 로그
          }
          UserDto userDto = new ModelMapper().map(userEntity, UserDto.class);
          //List<ResponseOrder> orders = new ArrayList<>(); //주문이 없다고 생각하고 빈 값을 넣었다
          //Get방식으로 사용자ID를 통해 주문 정보를 읽어온다
          //하드코딩을 하는것이 아닌 yml과 같은 속성파일에 저장하는것이 변경되더라도 수정하기가 좋다
          //String orderUrl = "http://127.0.0.1:8000/order-service/%s/orders";
          /* Using as rest template */
          /*
          String orderUrl = String.format(env.getProperty("order_service.url"), userId);
      
          ResponseEntity<List<ResponseOrder>> orderListResponse = restTemplate
              .exchange(orderUrl, GET, null, new ParameterizedTypeReference<List<ResponseOrder>>() {
      
              });
          List<ResponseOrder> orders = orderListResponse.getBody();
           */
          /* Using as feign client */
          /* Feign exception handling */
          List<ResponseOrder> orders = null;
          try{
              orders = orderServiceClient.getOrders(userId);
          }catch (FeignException e){
              log.error(e.getMessage());
          }
          userDto.setOrders(orders);
          return userDto;
      }
      
728x90

'Spring Cloud로 개발하는 MSA > Microservcie간 통신' 카테고리의 다른 글

데이터 동기화 문제  (0) 2022.02.06
ErrorDecoder  (0) 2022.02.06
REST Template  (0) 2022.02.06