[gRPC] java gRPC tutorial

seheo·2023년 4월 23일
0

gRPC란

google에서 만들 Remote Procedure call 별도의 원격 제어를 위한 코딩 없이 다른 주소 공간에서 리모트의 함수나 프로시저를 실행 할 수 있게 해주는 프로세스간 통신이다.

  • HTTP 2.0 기반으로 구성 되어 있기 때문에 한 번의 연결로 여러 응답을 받을 수 있어, 요청에 대한 부하를 줄여 여러 응답을 받을 때 더 빠르게 REST 방식에 비해 더 빠릅니다.

  • 여러 응답을 받는 경우가 아니라도 Protocol Buffer라는 데이터 직렬화 방식을 사용하여, JSON 방식 보다 더 작고 빠르게 전송하기 때문에 Stream(한 번에 여러번의 응답) 방식이 아니라 Unary(단일 요청/응답) 통신에서도 다 빠르게 동작합니다.

  • gRPC는 Go, Python 또는 Ruby의 클라이언트를 사용하여 자바로 gRPC 서버를 쉽게 만들 수 있기 때문에 MSA 환경에서 사용하기 용이하다.

자세한 내용 -> gRPC는 왜 빠를까?

gRPC 사용 목적

MSA 환경은 아니지만 짧은 주기로 서버에 데이터를 지속적으로 전송해야되는 프로젝트를 진행하게 되어, gRPC를 사용하면 좋겠다고 생각하여 gRPC로 구현하였다.

  • gRPC Stub이 한번의 요청
  • gRPC Server는 gRPC Stub이 요청을 중단 할때 까지 계속 정보를 전송하는 방식으로 구현

  • client에서 한번의 요청으로 5초마다 CPU 정보를 response 받아온다.

gRPC 에러 처리

    @Override
    public void responseCpuInfo(
            ClientRequest req,
            StreamObserver<CpuData> responseObserver
    ) {
        CpuData CpuData;
        CpuCollection cpuCollection = CpuCollection.getInstance();
        isSend = req.getIsStart();

        try {
            while (isSend) {
                CpuData = cpuCollection.getCpuData();
                responseObserver.onNext(CpuData);
            }
        } catch (IOException e) {
            responseObserver.onError(
                    Status.INTERNAL
                            .withDescription("입출력 에러 : ")
                            .withCause(e)
                            .asRuntimeException()
            );
        }

        responseObserver.onCompleted();
    }

gRPC는 연결 방식에 따라 에러 처리 방법이 다를 수 있다.
서버 스트리밍에서는 StreamObserver 인터페이스를 사용하여 클라이언트로부터 데이터를 수신하고, 응답을 반환한다. 서버에서 오류가 발생하면 onError() 메서드를 사용하여 클라이언트에게 에러를 알리고 종료합니다.

Status 클래스를 사용하여 상태 코드 및 상세 메시지를 설정할 수 있습니다. 또한 withCause() 메서드를 사용하여 Throwable 객체를 지정하여 자세한 정보를 전달할 수 있습니다.

0개의 댓글