sgcWebSockets는 이제 Delphi 및 C++Builder용 네이티브 gRPC 클라이언트를 제공해요. 새로운 TsgcGRPCClient 컴포넌트는 라이브러리 자체의 HTTP/2 전송을 통해 gRPC를 처리하므로, 외부 gRPC 런타임도, C 라이브러리도, 배포해야 할 추가 DLL도 없어요. 이 컴포넌트는 Enterprise 에디션의 일부이며 Windows, macOS, Linux, iOS, Android에서 실행돼요.
gRPC는 단지 HTTP/2 위에서 프레이밍된 Protocol Buffers 메시지일 뿐이에요. sgcWebSockets에는 이미 완전한 HTTP/2 스택이 있으므로, gRPC 클라이언트는 바로 그 위에 구축돼요. 요청 바이트를 프레이밍하고, gRPC 헤더와 타임아웃을 적용하며, 상태와 트레일러를 타입이 지정된 결과로 다시 파싱해요.
네이티브 HTTP/2 전송 기반
gRPC 채널은 HTTP/2 연결이에요. TsgcHTTP2Client를 생성하고 호스트와 포트를 지정한 다음, 이를 gRPC 컴포넌트의 Client 속성에 할당해요. TLS는 OpenSSL 또는 Windows SChannel을 통해 HTTP/2 클라이언트가 처리해요.
uses
sgcHTTP2, sgcGRPC_Client, sgcGRPC_Classes, sgcGRPC_Types;
var
HTTP2: TsgcHTTP2Client;
GRPC: TsgcGRPCClient;
oResponse: TsgcGRPCResponse;
begin
HTTP2 := TsgcHTTP2Client.Create(nil);
HTTP2.Host := 'grpc.example.com';
HTTP2.Port := 443;
HTTP2.TLS := True;
GRPC := TsgcGRPCClient.Create(nil);
GRPC.Client := HTTP2;
// metadata is sent on every call (auth, tracing...)
GRPC.DefaultMetadata.Add('authorization', 'Bearer eyJ...');
// unary call: the request is your serialized protobuf message as TBytes
oResponse := GRPC.Call('helloworld.Greeter', 'SayHello', RequestBytes);
if oResponse.StatusCode = grpcOK then
Memo1.Text := oResponse.DataString
else
ShowMessage('gRPC error: ' + oResponse.StatusMessage);
end;
네 가지 호출 유형 모두 지원
이 컴포넌트는 동기 또는 비동기 방식으로 모든 gRPC 상호작용 패턴을 지원해요:
- 단항(Unary).
Call은 블로킹되며TsgcGRPCResponse를 반환해요.CallAsync는 즉시 반환되고OnGRPCResponse를 발생시켜요. - 서버 스트리밍.
ServerStreamingCall은 하나의 요청을 보내고 메시지 스트림을 받으며, 각각OnGRPCStreamMessage를 발생시키고, 종료 시OnGRPCStreamEnd를 발생시켜요. - 클라이언트 스트리밍.
OpenClientStream으로 시작하고, 각 메시지마다SendStreamMessage를 호출한 다음,CloseClientStream으로 단일 응답을 읽어요. - 양방향 스트리밍.
OpenBidiStream,SendBidiMessage,CloseBidiStream이 하나의 HTTP/2 스트림을 통해 전이중(full-duplex) 교환을 실행해요.
응답은 호출이 반환한 모든 것을 담고 있어요: StatusCode, StatusMessage, 원시 Data 바이트(또는 DataString), 그리고 Trailers까지요.
메타데이터, 데드라인, 채널 옵션
사용자 지정 헤더는 채널 전체에 대해서는 DefaultMetadata를 통해, 또는 호출별로 전달돼요. 호출별 타임아웃은 표준 grpc-timeout 헤더로 변환되며, CancelCall은 진행 중인 스트림을 중단해요. 채널 자체는 ChannelOptions를 통해 조정돼요.
// gzip compression and channel limits
GRPC.ChannelOptions.Compression := grpcGzip;
GRPC.ChannelOptions.MaxMessageSize := 16 * 1024 * 1024;
// abort a long-running stream
GRPC.CancelCall(StreamId);
인터셉터, 재시도, 관찰 가능성
Interceptors 체인은 모든 호출을 감싸므로, 로깅, 인증 갱신, 추적을 한 곳에서 추가할 수 있어요. RetryPolicy는 선택한 상태 코드에 대해 재시도하고, ServiceConfig는 메서드별 정책을 적용하며, MetricsCollector는 호출 카운터와 지연 시간을 기록해요.
GRPC.RetryPolicy.MaxAttempts := 4;
GRPC.RetryPolicy.RetryableStatusCodes :=
GRPC.RetryPolicy.RetryableStatusCodes + [grpcUNAVAILABLE];
원하는 Protocol Buffers를 사용하세요
클라이언트는 원시 메시지 바이트(TBytes)를 받고 반환하므로, 특정 Protocol Buffers 라이브러리에 종속되지 않아요. 이미 사용 중인 protobuf 도구로 요청을 인코딩하고, 그 바이트를 Call에 전달한 다음, 같은 방식으로 응답 바이트를 디코딩하세요. 컴포넌트가 gRPC 길이 접두사 프레이밍, 압축 플래그, 상태 코드, 트레일러를 대신 처리해 줘요.
Google Cloud gRPC API 포함
제네릭 클라이언트 외에도, sgcWebSockets는 Google Cloud gRPC 서비스를 위한 타입이 지정된 클라이언트를 제공해요: Pub/Sub, Speech-to-Text, Translation, Vision, Natural Language, Cloud Storage, BigQuery, Vertex AI까지요. 이들은 서비스 계정 인증과 요청 및 응답 메시지를 처리하므로, protobuf를 직접 만드는 대신 상위 수준 메서드를 호출하면 돼요.
이용 가능 여부
gRPC 클라이언트는 지금 Delphi 및 C++Builder용 sgcWebSockets Enterprise 에디션에서 이용할 수 있어요. 바로 실행 가능한 샘플이 Demos\21.GRPC\01.GRPC_Client에 포함되어 있으며, 전체 속성, 메서드, 이벤트 참조 자료는 gRPC 클라이언트 제품 페이지에서 확인할 수 있어요.
질문, 피드백 또는 시작에 도움이 필요하신가요? 문의하기. 코드를 작성한 사람들로부터 직접 답변을 받으실 거예요.
