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. |