Go 언어:Protobuf 서비스 인터페이스 생 성
Go 언어 발표 이후 Go 의 공식 팀 이 발표 한 GoProtobuf 도 Protobuf 지원 을 실현 했다.
그러나 GoProtobuf 공식 버 전 은 rpc 의 지원 을 실현 하지 못 했 습 니 다.
protoc-gen-go
심지어service
의 인터페이스 도 생 성 되 지 않 았 습 니 다."JSON-RPC:a tale of interfaces"글 을 보면 Go 언어 지원 rpc 가 매우 쉽다 는 것 을 알 수 있 습 니 다.
우 리 는 지금부터 GoProtobuf 에 rpc 지원 을 추가 하려 고 시도 합 니 다.
물론 첫 번 째 단 계 는 Service 인 터 페 이 스 를 만 드 는 것 이다.
service.go 파일 만 들 기:
// Copyright 2013 <chaishushan{AT}gmail.com>. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package generator
// ServicePlugin produce the Service interface.
type ServicePlugin struct {
*Generator
}
// Name returns the name of the plugin.
func (p *ServicePlugin) Name() string { return "ServiceInterface" }
// Init is called once after data structures are built but before
// code generation begins.
func (p *ServicePlugin) Init(g *Generator) {
p.Generator = g
}
// Generate produces the code generated by the plugin for this file.
func (p *ServicePlugin) GenerateImports(file *FileDescriptor) {
//
}
// Generate generates the Service interface.
func (p *ServicePlugin) Generate(file *FileDescriptor) {
for _, svc := range file.Service {
name := CamelCase(*svc.Name)
p.P("type ", name, " interface {")
p.In()
for _, m := range svc.Method {
method := CamelCase(*m.Name)
iType := p.ObjectNamed(*m.InputType)
oType := p.ObjectNamed(*m.OutputType)
p.P(method, "(in *", p.TypeName(iType), ", out *", p.TypeName(oType), ") error")
}
p.Out()
p.P("}")
}
}
func init() {
RegisterPlugin(new(ServicePlugin))
}
service.go 파일 을
code.google.com/p/goprotobuf/protoc-gen-go/generator
디 렉 터 리 에 두 고 다시 컴 파일 하여 설치 합 니 다code.google.com/p/goprotobuf/protoc-gen-go
.새 echo.proto 파일:
// Copyright 2013 <chaishushan{AT}gmail.com>. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package echo;
option cc_generic_services = true;
option java_generic_services = true;
option py_generic_services = true;
message EchoRequest {
required string message = 1;
}
message EchoResponse {
required string message = 1;
}
service EchoService {
rpc echo (EchoRequest) returns (EchoResponse);
}
컴 파일
echo.proto
파일:protoc --go_out=. echo.proto
파일 생 성
echo.pb.go
:// Code generated by protoc-gen-go.
// source: echo.proto
// DO NOT EDIT!
package echo
import proto "code.google.com/p/goprotobuf/proto"
import json "encoding/json"
import math "math"
// Reference proto, json, and math imports to suppress error if they are not otherwise used.
var _ = proto.Marshal
var _ = &json.SyntaxError{}
var _ = math.Inf
type EchoRequest struct {
Message *string `protobuf:"bytes,1,req,name=message" json:"message,omitempty"`
XXX_unrecognized []byte `json:"-"`
}
func (m *EchoRequest) Reset() { *m = EchoRequest{} }
func (m *EchoRequest) String() string { return proto.CompactTextString(m) }
func (*EchoRequest) ProtoMessage() {}
func (m *EchoRequest) GetMessage() string {
if m != nil && m.Message != nil {
return *m.Message
}
return ""
}
type EchoResponse struct {
Message *string `protobuf:"bytes,1,req,name=message" json:"message,omitempty"`
XXX_unrecognized []byte `json:"-"`
}
func (m *EchoResponse) Reset() { *m = EchoResponse{} }
func (m *EchoResponse) String() string { return proto.CompactTextString(m) }
func (*EchoResponse) ProtoMessage() {}
func (m *EchoResponse) GetMessage() string {
if m != nil && m.Message != nil {
return *m.Message
}
return ""
}
func init() {
}
type EchoService interface {
Echo(in *EchoRequest, out *EchoResponse) error
}
마지막 인터페이스 부분 은 우리 가 추가 한
service.go
에 의 해 생 성 되 었 음 을 주의 하 십시오.type EchoService interface {
Echo(in *EchoRequest, out *EchoResponse) error
}
가장 기본 적 인 준비 작업 이 완료 되 었 습 니 다.다음은 JSON-RPC 의 예 를 참고 하여 protobuf 버 전의 rpc 를 실현 하 는 것 입 니 다.
다음 에 계속...
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
OpenStack-RPC-server 구축 (4)상술한 설명에 의하면, 우리는 ConnectionContext 클래스가 사실 모든 oslo 에 해당한다는 것을 안다메시지 층의connection 의뢰 에이전트 클래스입니다.ConnectionContext 객체를 사용...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.