Documentation ¶
Overview ¶
Package protorpc implements a Protobuf-RPC ClientCodec and ServerCodec for the rpc package.
To install it, you must first have Go (version 1) installed (see http://golang.org/doc/install). Next, install the standard protocol buffer implementation from http://github.com/google/protobuf/; you must be running version 2.3 or higher.
Finally run
go get github.com/chai2010/protorpc go get github.com/chai2010/protorpc/protoc-gen-protorpc
to install the support library and protocol compiler.
Here is a simple proto file("arith.pb/arith.proto"):
package arith; message ArithRequest { optional int32 a = 1; optional int32 b = 2; } message ArithResponse { optional int32 val = 1; optional int32 quo = 2; optional int32 rem = 3; } service ArithService { rpc multiply (ArithRequest) returns (ArithResponse); rpc divide (ArithRequest) returns (ArithResponse); }
Then use "protoc-gen-go" to generate "arith.pb.go" file:
cd arith.pb && protoc --go_out=. arith.proto
Use "protoc-gen-protorpc" to generate "arith.pb.protorpc.go" file (include stub code):
cd arith.pb && protoc --protorpc_out=. arith.proto
The server calls (for TCP service):
package server import ( "errors" "github.com/golang/protobuf/proto" "./arith.pb" ) type Arith int func (t *Arith) Multiply(args *arith.ArithRequest, reply *arith.ArithResponse) error { reply.Val = proto.Int32(args.GetA() * args.GetB()) return nil } func (t *Arith) Divide(args *arith.ArithRequest, reply *arith.ArithResponse) error { if args.GetB() == 0 { return errors.New("divide by zero") } reply.Quo = proto.Int32(args.GetA() / args.GetB()) reply.Rem = proto.Int32(args.GetA() % args.GetB()) return nil } func main() { arith.ListenAndServeArithService("tcp", ":1984", new(Arith)) }
At this point, clients can see a service "Arith" with methods "ArithService.Multiply" and "ArithService.Divide". To invoke one, a client first dials the server:
stub, err := arith.DialArithService("tcp", "127.0.0.1:1984") if err != nil { log.Fatal(`arith.DialArithService("tcp", "127.0.0.1:1984"):`, err) } defer stub.Close()
Then it can make a remote call with stub:
var args ArithRequest args.A = proto.Int32(7) args.B = proto.Int32(8) reply, err := stub.Multiply(&args, &reply) if err != nil { log.Fatal("arith error:", err) } fmt.Printf("Arith: %d*%d=%d", args.GetA(), args.GetB(), reply.GetVal())
More example:
go test github.com/chai2010/protorpc/internal/service.pb
Report bugs to <chaishushan@gmail.com>.
Thanks!
Index ¶
- Variables
- func Dial(network, address string) (*rpc.Client, error)
- func DialTimeout(network, address string, timeout time.Duration) (*rpc.Client, error)
- func NewClient(conn io.ReadWriteCloser) *rpc.Client
- func NewClientCodec(conn io.ReadWriteCloser) rpc.ClientCodec
- func NewServerCodec(conn io.ReadWriteCloser) rpc.ServerCodec
- func ServeConn(conn io.ReadWriteCloser)
Constants ¶
This section is empty.
Variables ¶
var ( UseSnappy = true UseCrc32ChecksumIEEE = true )
Functions ¶
func DialTimeout ¶
DialTimeout connects to a Protobuf-RPC server at the specified network address.
func NewClient ¶
func NewClient(conn io.ReadWriteCloser) *rpc.Client
NewClient returns a new rpc.Client to handle requests to the set of services at the other end of the connection.
func NewClientCodec ¶
func NewClientCodec(conn io.ReadWriteCloser) rpc.ClientCodec
NewClientCodec returns a new rpc.ClientCodec using Protobuf-RPC on conn.
func NewServerCodec ¶
func NewServerCodec(conn io.ReadWriteCloser) rpc.ServerCodec
NewServerCodec returns a serverCodec that communicates with the ClientCodec on the other end of the given conn.
func ServeConn ¶
func ServeConn(conn io.ReadWriteCloser)
ServeConn runs the Protobuf-RPC server on a single connection. ServeConn blocks, serving the connection until the client hangs up. The caller typically invokes ServeConn in a go statement.
Types ¶
This section is empty.
Directories ¶
Path | Synopsis |
---|---|
examples
|
|
message.pb
Package message is a generated protocol buffer package.
|
Package message is a generated protocol buffer package. |
proto3.pb
Package proto3_proto is a generated protocol buffer package.
|
Package proto3_proto is a generated protocol buffer package. |
service.pb
Package service is a generated protocol buffer package.
|
Package service is a generated protocol buffer package. |
stdrpc.pb
Package service is a generated protocol buffer package.
|
Package service is a generated protocol buffer package. |
protoc-gen-go is a plugin for the Google protocol buffer compiler to generate Go code.
|
protoc-gen-go is a plugin for the Google protocol buffer compiler to generate Go code. |
Package protorpc_wire is a generated protocol buffer package.
|
Package protorpc_wire is a generated protocol buffer package. |