google에서 만들 Remote Procedure call 별도의 원격 제어를 위한 코딩 없이 다른 주소 공간에서 리모트의 함수나 프로시저를 실행 할 수 있게 해주는 프로세스간 통신이다.
HTTP 2.0 기반으로 구성 되어 있기 때문에 한 번의 연결로 여러 응답을 받을 수 있어, 요청에 대한 부하를 줄여 여러 응답을 받을 때 더 빠르게 REST 방식에 비해 더 빠릅니다.
여러 응답을 받는 경우가 아니라도 Protocol Buffer라는 데이터 직렬화 방식을 사용하여, JSON 방식 보다 더 작고 빠르게 전송하기 때문에 Stream(한 번에 여러번의 응답) 방식이 아니라 Unary(단일 요청/응답) 통신에서도 다 빠르게 동작합니다.
gRPC는 Go, Python 또는 Ruby의 클라이언트를 사용하여 자바로 gRPC 서버를 쉽게 만들 수 있기 때문에 MSA 환경에서 사용하기 용이하다.
자세한 내용 -> gRPC는 왜 빠를까?
MSA 환경은 아니지만 짧은 주기로 서버에 데이터를 지속적으로 전송해야되는 프로젝트를 진행하게 되어, gRPC를 사용하면 좋겠다고 생각하여 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 객체를 지정하여 자세한 정보를 전달할 수 있습니다.