RPC 프레임워크 이해 및 Dubbo 활용 예제

RPC 프레임워크의 주요 개념과 Dubbo 사용 사례

1. RPC 프레임워크의 핵심 요소

RPC(Remote Procedure Call)는 분산 시스템에서 네트워크 세부사항을 숨기고 원격 호출이 로컬 호출처럼 간단하게 이루어지도록 하는 기술입니다. 이 기술은 면접에서 종종 시리얼라이즈/디시리얼라이즈, 네트워크 전송, 서비스 등록 및 발견, 부하 분배, 오류 처리 등의 다양한 측면에서 평가됩니다.

1.1 RPC 기본 흐름 및 구성 요소

RPC 호출 과정은 다음과 같은 단계로 나눌 수 있습니다:

  • 클라이언트 요청: 클라이언트는 스텁(Stub)이라는 대리 객체를 통해 메서드를 호출합니다.
  • 시리얼라이즈: 파라미터와 메서드 식별자는 이진 데이터나 텍스트 형식으로 변환됩니다.
  • 네트워크 전송: TCP, UDP 또는 HTTP2 등을 통해 서버에 데이터가 전달됩니다.
  • 서버 수신 및 디시리얼라이즈: 서버는 데이터를 해석하여 메서드와 파라미터를 복원합니다.
  • 서비스 실행: 서버는 리플렉션 등을 사용해 메서드를 호출하고 결과를 얻습니다.
  • 결과 반환: 실행 결과는 다시 클라이언트에게 전송됩니다.

1.2 시리얼라이즈 및 네트워크 전송

RPC에서 시리얼라이즈 방식은 성능, 호환성, 다중 언어 지원 여부에 따라 달라집니다. 다음 표는 일반적인 시리얼라이즈 방식들을 비교한 것입니다:

프레임워크 형식 성능 호환성 다중 언어 특징
JSON 텍스트 중간 높음 읽기 쉽지만 중복 필드명으로 인해 비효율적
Protobuf 바이너리 우수 매우 높음 IDL 정의 필요, 스키마 변경에도 안정적

2. Dubbo 활용 사례

2.1 환경 설정

Dubbo를 사용하기 위해 필요한 의존성과 버전을 설정해야 합니다. 아래는 Maven 의존성 설정의 예입니다:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
    <version>3.1.5</version>
</dependency>

2.2 서비스 제공자 예제

아래 코드는 상품 서비스를 구현하는 예제입니다:

public interface ItemService {
    int fetchStock(int itemId);
}

@Service
@DubboService(version = "1.0.0", group = "item-group")
public class ItemServiceImpl implements ItemService {
    @Override
    public int fetchStock(int itemId) {
        System.out.println("상품 아이디: " + itemId);
        return 50;
    }
}

2.3 서비스 소비자 예제

주문 서비스에서는 상품 서비스를 호출하여 재고 정보를 가져옵니다:

@RestController
public class PurchaseController {

    @DubboReference(version = "1.0.0", group = "item-group")
    private ItemService itemService;

    @GetMapping("/purchase/{itemId}")
    public String buy(@PathVariable int itemId) {
        int stock = itemService.fetchStock(itemId);
        if (stock > 0) {
            return "구매 완료";
        } else {
            return "재고 부족";
        }
    }
}

3. 고급 주제

3.1 부하 분배 전략

RPC 시스템에서 적절한 부하 분배 전략을 선택하는 것은 매우 중요합니다. 예를 들어 일관된 해싱은 캐시 시나리오에서 유용하며, 최소 활성화 전략은 비동기 작업에 적합합니다.

3.2 오류 관리

오류 회복 전략에는 즉각 실패(Failfast), 백그라운드 재시도(Failback), 자동熔断 등이 있습니다. 이러한 전략들은 시스템의 신뢰성을 높이는 데 도움을 줍니다.

태그: dubbo rpc java

6월 15일 17:11에 게시됨