2017-10-03 2 views
0

내가 (GO 작성된 grpc 클라이언트와 자바로 작성된 grpc 서버가 모두 같은 프로토 파일 (구문 2)를 사용하여.proto2 확장을 grpc와 함께 사용할 수 있습니까?

내 grpc 방법은 확장을 포함 할 수있는 메시지를합니다. 나는를 구성 할 수 있어요 메시지를 서버에 보내면 서버에서 메시지를 읽으려고하지만 내 확장은 알 수없는 필드로 사용할 수 있습니다. 즉, Java에서 entity.hasExtension (내선 번호)을 반환합니다. false).

내 질문은 grpc가 메서드 매개 변수로 제공되는 메시지에서 확장을 사용할 수 있는지 여부입니다. 그렇지 않은 경우 알 수없는 필드를 거짓으로 변환하는 방법이 있습니까? 특정 유형의 ld?

syntax = "proto2"; 

// proto file used as source for go client and java server as well 

package my_services; 
import "basic_types.proto"; 
// import "extension_types.proto"; 

// do not delete: options for generating java code 
option java_multiple_files = true; 
option java_package = "myservice.grpc"; 
option java_outer_classname = "MyServiceWrapper"; 
option objc_class_prefix = "Foo"; 

// Interface exposed by the server. 
service DataService { 
    // Obtains all objects satisfying the request message 
    rpc MyMethod(DataRequest) returns (DataResponse) {} 
} 

message DataRequest { 
    optional IdDefinition      id = 1; 
    repeated basic_types.Entity   templates = 2; 
} 

message DataResponse { 
    repeated IdDefinition       id = 1; 
    optional basic_types.DataResult   result = 2; 
} 

message IdDefinition { 
    optional int32 myid = 1; 
} 

basic_types.Entity 기본 메시지를 포함하는 확장입니다 :

message Entity { 
    extensions 1 to max; 
} 

하고, 예를 들어 연장 될 수있다

내 프로토 파일이 좋아요 :

extend basic_types.Entity { 
    optional Foo foo = 1000; 
    optional Bar bar = 1001;  
} 

도움이나 힌트를 주시면 감사하겠습니다.

답변

0

자바에서는 가능하지만 확장 레지스트리를 ProtoLiteUtils.setExtensionRegistry()으로 설정해야합니다. 이것은 실험적인 API이며 앞으로는 다른 방법으로이 작업을 수행 할 수도 있지만 당분간 사용 가능해야합니다.

보다 일반적으로 모든 메시지 인코딩은 gRPC에서 지원됩니다. 우리는 기본적으로 Proto3를 지원하지만, gRPC를 사용하는 많은 기존 Proto2 사용자가 있습니다. gRPC는 불가지론자를 인코딩하기 때문에, 원한다면 중고품이나 JSON과 같은 것을 사용할 수 있습니다.하지만 우리는 그 물건에 대한 스텁을 자동으로 생성하지는 않습니다.

+0

안녕하세요. Carl 님, 귀하의 빠른 답변에 많은 감사드립니다. 방금 시도했지만 문제없이 작동합니다. 하지만 API가 안정적이지 않기 때문에 grpc를 통해 바이트 만 보내고 구문 분석/언 마샬링을 혼자 수행 할 것을 고려 중입니다. – stepasite

관련 문제