4 hclog "github.com/hashicorp/go-hclog"
5 plugin "github.com/hashicorp/go-plugin"
6 "github.com/hashicorp/go-plugin/examples/bidirectional/proto"
7 "golang.org/x/net/context"
8 "google.golang.org/grpc"
11 // GRPCClient is an implementation of KV that talks over RPC.
12 type GRPCClient struct {
13 broker *plugin.GRPCBroker
14 client proto.CounterClient
17 func (m *GRPCClient) Put(key string, value int64, a AddHelper) error {
18 addHelperServer := &GRPCAddHelperServer{Impl: a}
21 serverFunc := func(opts []grpc.ServerOption) *grpc.Server {
22 s = grpc.NewServer(opts...)
23 proto.RegisterAddHelperServer(s, addHelperServer)
28 brokerID := m.broker.NextId()
29 go m.broker.AcceptAndServe(brokerID, serverFunc)
31 _, err := m.client.Put(context.Background(), &proto.PutRequest{
41 func (m *GRPCClient) Get(key string) (int64, error) {
42 resp, err := m.client.Get(context.Background(), &proto.GetRequest{
49 return resp.Value, nil
52 // Here is the gRPC server that GRPCClient talks to.
53 type GRPCServer struct {
54 // This is the real implementation
57 broker *plugin.GRPCBroker
60 func (m *GRPCServer) Put(ctx context.Context, req *proto.PutRequest) (*proto.Empty, error) {
61 conn, err := m.broker.Dial(req.AddServer)
67 a := &GRPCAddHelperClient{proto.NewAddHelperClient(conn)}
68 return &proto.Empty{}, m.Impl.Put(req.Key, req.Value, a)
71 func (m *GRPCServer) Get(ctx context.Context, req *proto.GetRequest) (*proto.GetResponse, error) {
72 v, err := m.Impl.Get(req.Key)
73 return &proto.GetResponse{Value: v}, err
76 // GRPCClient is an implementation of KV that talks over RPC.
77 type GRPCAddHelperClient struct{ client proto.AddHelperClient }
79 func (m *GRPCAddHelperClient) Sum(a, b int64) (int64, error) {
80 resp, err := m.client.Sum(context.Background(), &proto.SumRequest{
85 hclog.Default().Info("add.Sum", "client", "start", "err", err)
91 // Here is the gRPC server that GRPCClient talks to.
92 type GRPCAddHelperServer struct {
93 // This is the real implementation
97 func (m *GRPCAddHelperServer) Sum(ctx context.Context, req *proto.SumRequest) (resp *proto.SumResponse, err error) {
98 r, err := m.Impl.Sum(req.A, req.B)
102 return &proto.SumResponse{R: r}, err