Go 언어:Protobuf 서비스 인터페이스 생 성

4573 단어 rpcprotobufGogolang
Protobuf 는 Google 이 발표 한 오픈 소스 인 코딩 규범 으로 C++/자바/python 등 몇 가지 언어 를 공식 적 으로 지원 합 니 다.
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 를 실현 하 는 것 입 니 다.
다음 에 계속...

좋은 웹페이지 즐겨찾기