mirror of https://github.com/grpc/grpc.git
Merge pull request #31 from tbetbetbe/grpc_samples_golang_add_helloworld
Grpc samples golang add helloworldpull/3109/head
commit
9db0264735
4 changed files with 295 additions and 0 deletions
@ -0,0 +1,51 @@ |
|||||||
|
gRPC in 3 minutes (Go) |
||||||
|
====================== |
||||||
|
|
||||||
|
PREREQUISITES |
||||||
|
------------- |
||||||
|
|
||||||
|
- This requires Go 1.4.x |
||||||
|
- Requires that [GOPATH is set](https://golang.org/doc/code.html#GOPATH) |
||||||
|
```sh |
||||||
|
$ go help gopath |
||||||
|
$ # ensure the PATH contains $GOPATH/bin or $GOBIN |
||||||
|
$ export PATH=PATH:<your/gopath/bin> |
||||||
|
``` |
||||||
|
|
||||||
|
INSTALL |
||||||
|
------- |
||||||
|
|
||||||
|
```sh |
||||||
|
$ export GOPATH=<path/to/your/go/workspace> |
||||||
|
$ go install -u github.com/grpc-common/go/greeter_client |
||||||
|
$ go install -u github.com/grpc-common/go/greeter_server |
||||||
|
``` |
||||||
|
|
||||||
|
TRY IT! |
||||||
|
------- |
||||||
|
|
||||||
|
- Run the server |
||||||
|
```sh |
||||||
|
$ greeter_server & |
||||||
|
``` |
||||||
|
|
||||||
|
- Run the client |
||||||
|
```sh |
||||||
|
$ greeter_client |
||||||
|
``` |
||||||
|
|
||||||
|
OPTIONAL - Rebuilding the generated code |
||||||
|
---------------------------------------- |
||||||
|
|
||||||
|
1 First [install protoc](https://github.com/google/protobuf/blob/master/INSTALL.txt) |
||||||
|
- For now, this needs to be installed from source |
||||||
|
- This is will change once proto3 is officially released |
||||||
|
2 Install the protoc Go plugin. |
||||||
|
```sh |
||||||
|
$ go install -a github.com/golang/protobuf/protoc-gen-go |
||||||
|
$ # ensure the PATH contains $GOPATH/bin or $GOBIN |
||||||
|
$ export PATH=PATH:<your/gopath/bin> |
||||||
|
$ |
||||||
|
$ # from ths dir; invoke protoc |
||||||
|
$ protoc -I ../protos ../protos/helloworld.proto --go_out=plugins=grpc:. |
||||||
|
``` |
@ -0,0 +1,70 @@ |
|||||||
|
/* |
||||||
|
* |
||||||
|
* Copyright 2015, Google Inc. |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are |
||||||
|
* met: |
||||||
|
* |
||||||
|
* * Redistributions of source code must retain the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer. |
||||||
|
* * Redistributions in binary form must reproduce the above |
||||||
|
* copyright notice, this list of conditions and the following disclaimer |
||||||
|
* in the documentation and/or other materials provided with the |
||||||
|
* distribution. |
||||||
|
* * Neither the name of Google Inc. nor the names of its |
||||||
|
* contributors may be used to endorse or promote products derived from |
||||||
|
* this software without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
package main |
||||||
|
|
||||||
|
import ( |
||||||
|
"log" |
||||||
|
"os" |
||||||
|
|
||||||
|
pb "github.com/grpc-common/go/helloworld" |
||||||
|
"golang.org/x/net/context" |
||||||
|
"google.golang.org/grpc" |
||||||
|
) |
||||||
|
|
||||||
|
const ( |
||||||
|
address = "localhost:50051" |
||||||
|
defaultName = "world" |
||||||
|
) |
||||||
|
|
||||||
|
func main() { |
||||||
|
// Set up a connection to the server.
|
||||||
|
var opts []grpc.DialOption |
||||||
|
conn, err := grpc.Dial(address, opts...) |
||||||
|
if err != nil { |
||||||
|
log.Fatalf("did not connect: %v", err) |
||||||
|
} |
||||||
|
defer conn.Close() |
||||||
|
|
||||||
|
// Contact the server and print out its response.
|
||||||
|
name := defaultName |
||||||
|
if len(os.Args) > 1 { |
||||||
|
name = os.Args[1] |
||||||
|
} |
||||||
|
c := pb.NewGreeterClient(conn) |
||||||
|
r, err := c.SayHello(context.Background(), &pb.HelloRequest{Name: name}) |
||||||
|
if err != nil { |
||||||
|
log.Fatalf("could not greet: %v", err) |
||||||
|
} |
||||||
|
log.Printf("Greeting: %s", r.Message) |
||||||
|
} |
@ -0,0 +1,65 @@ |
|||||||
|
/* |
||||||
|
* |
||||||
|
* Copyright 2015, Google Inc. |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are |
||||||
|
* met: |
||||||
|
* |
||||||
|
* * Redistributions of source code must retain the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer. |
||||||
|
* * Redistributions in binary form must reproduce the above |
||||||
|
* copyright notice, this list of conditions and the following disclaimer |
||||||
|
* in the documentation and/or other materials provided with the |
||||||
|
* distribution. |
||||||
|
* * Neither the name of Google Inc. nor the names of its |
||||||
|
* contributors may be used to endorse or promote products derived from |
||||||
|
* this software without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
package main |
||||||
|
|
||||||
|
import ( |
||||||
|
"log" |
||||||
|
"net" |
||||||
|
|
||||||
|
pb "github.com/grpc-common/go/helloworld" |
||||||
|
"golang.org/x/net/context" |
||||||
|
"google.golang.org/grpc" |
||||||
|
) |
||||||
|
|
||||||
|
const ( |
||||||
|
port = ":50051" |
||||||
|
) |
||||||
|
|
||||||
|
// server is used to implement hellowrld.GreeterServer.
|
||||||
|
type server struct{} |
||||||
|
|
||||||
|
// SayHello implements helloworld.GreeterServer
|
||||||
|
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) { |
||||||
|
return &pb.HelloReply{Message: "Hello " + in.Name}, nil |
||||||
|
} |
||||||
|
|
||||||
|
func main() { |
||||||
|
lis, err := net.Listen("tcp", port) |
||||||
|
if err != nil { |
||||||
|
log.Fatalf("failed to listen: %v", err) |
||||||
|
} |
||||||
|
s := grpc.NewServer() |
||||||
|
pb.RegisterGreeterServer(s, &server{}) |
||||||
|
s.Serve(lis) |
||||||
|
} |
@ -0,0 +1,109 @@ |
|||||||
|
// Code generated by protoc-gen-go.
|
||||||
|
// source: helloworld.proto
|
||||||
|
// DO NOT EDIT!
|
||||||
|
|
||||||
|
/* |
||||||
|
Package helloworld is a generated protocol buffer package. |
||||||
|
|
||||||
|
It is generated from these files: |
||||||
|
helloworld.proto |
||||||
|
|
||||||
|
It has these top-level messages: |
||||||
|
HelloRequest |
||||||
|
HelloReply |
||||||
|
*/ |
||||||
|
package helloworld |
||||||
|
|
||||||
|
import proto "github.com/golang/protobuf/proto" |
||||||
|
|
||||||
|
import ( |
||||||
|
context "golang.org/x/net/context" |
||||||
|
grpc "google.golang.org/grpc" |
||||||
|
) |
||||||
|
|
||||||
|
// Reference imports to suppress errors if they are not otherwise used.
|
||||||
|
var _ context.Context |
||||||
|
var _ grpc.ClientConn |
||||||
|
|
||||||
|
// Reference imports to suppress errors if they are not otherwise used.
|
||||||
|
var _ = proto.Marshal |
||||||
|
|
||||||
|
// The request message containing the user's name.
|
||||||
|
type HelloRequest struct { |
||||||
|
Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` |
||||||
|
} |
||||||
|
|
||||||
|
func (m *HelloRequest) Reset() { *m = HelloRequest{} } |
||||||
|
func (m *HelloRequest) String() string { return proto.CompactTextString(m) } |
||||||
|
func (*HelloRequest) ProtoMessage() {} |
||||||
|
|
||||||
|
// The response message containing the greetings
|
||||||
|
type HelloReply struct { |
||||||
|
Message string `protobuf:"bytes,1,opt,name=message" json:"message,omitempty"` |
||||||
|
} |
||||||
|
|
||||||
|
func (m *HelloReply) Reset() { *m = HelloReply{} } |
||||||
|
func (m *HelloReply) String() string { return proto.CompactTextString(m) } |
||||||
|
func (*HelloReply) ProtoMessage() {} |
||||||
|
|
||||||
|
func init() { |
||||||
|
} |
||||||
|
|
||||||
|
// Client API for Greeter service
|
||||||
|
|
||||||
|
type GreeterClient interface { |
||||||
|
// Sends a greeting
|
||||||
|
SayHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*HelloReply, error) |
||||||
|
} |
||||||
|
|
||||||
|
type greeterClient struct { |
||||||
|
cc *grpc.ClientConn |
||||||
|
} |
||||||
|
|
||||||
|
func NewGreeterClient(cc *grpc.ClientConn) GreeterClient { |
||||||
|
return &greeterClient{cc} |
||||||
|
} |
||||||
|
|
||||||
|
func (c *greeterClient) SayHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*HelloReply, error) { |
||||||
|
out := new(HelloReply) |
||||||
|
err := grpc.Invoke(ctx, "/helloworld.Greeter/sayHello", in, out, c.cc, opts...) |
||||||
|
if err != nil { |
||||||
|
return nil, err |
||||||
|
} |
||||||
|
return out, nil |
||||||
|
} |
||||||
|
|
||||||
|
// Server API for Greeter service
|
||||||
|
|
||||||
|
type GreeterServer interface { |
||||||
|
// Sends a greeting
|
||||||
|
SayHello(context.Context, *HelloRequest) (*HelloReply, error) |
||||||
|
} |
||||||
|
|
||||||
|
func RegisterGreeterServer(s *grpc.Server, srv GreeterServer) { |
||||||
|
s.RegisterService(&_Greeter_serviceDesc, srv) |
||||||
|
} |
||||||
|
|
||||||
|
func _Greeter_SayHello_Handler(srv interface{}, ctx context.Context, buf []byte) (proto.Message, error) { |
||||||
|
in := new(HelloRequest) |
||||||
|
if err := proto.Unmarshal(buf, in); err != nil { |
||||||
|
return nil, err |
||||||
|
} |
||||||
|
out, err := srv.(GreeterServer).SayHello(ctx, in) |
||||||
|
if err != nil { |
||||||
|
return nil, err |
||||||
|
} |
||||||
|
return out, nil |
||||||
|
} |
||||||
|
|
||||||
|
var _Greeter_serviceDesc = grpc.ServiceDesc{ |
||||||
|
ServiceName: "helloworld.Greeter", |
||||||
|
HandlerType: (*GreeterServer)(nil), |
||||||
|
Methods: []grpc.MethodDesc{ |
||||||
|
{ |
||||||
|
MethodName: "sayHello", |
||||||
|
Handler: _Greeter_SayHello_Handler, |
||||||
|
}, |
||||||
|
}, |
||||||
|
Streams: []grpc.StreamDesc{}, |
||||||
|
} |
Loading…
Reference in new issue