Skip to content

Instantly share code, notes, and snippets.

@funny-falcon
Last active February 11, 2019 18:37

Revisions

  1. funny-falcon revised this gist Feb 11, 2019. 2 changed files with 0 additions and 0 deletions.
    File renamed without changes.
    File renamed without changes.
  2. funny-falcon renamed this gist Feb 11, 2019. 1 changed file with 0 additions and 0 deletions.
    File renamed without changes.
  3. funny-falcon created this gist Feb 11, 2019.
    79 changes: 79 additions & 0 deletions grpc_client.go
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,79 @@
    /*
    *
    * Copyright 2015 gRPC authors.
    *
    * Licensed under the Apache License, Version 2.0 (the "License");
    * you may not use this file except in compliance with the License.
    * You may obtain a copy of the License at
    *
    * http://www.apache.org/licenses/LICENSE-2.0
    *
    * Unless required by applicable law or agreed to in writing, software
    * distributed under the License is distributed on an "AS IS" BASIS,
    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    * See the License for the specific language governing permissions and
    * limitations under the License.
    *
    */

    package main

    import (
    "context"
    "flag"
    "fmt"
    "log"
    "sync"
    "sync/atomic"
    "time"

    "google.golang.org/grpc"
    pb "google.golang.org/grpc/examples/helloworld/helloworld"
    )

    const (
    address = "localhost:50051"
    defaultName = "world"
    )

    var addr = flag.String("a", address, "concurrent goroutines")
    var goro = flag.Int("g", 10, "concurrent goroutines")
    var tm = flag.Duration("t", 5*time.Second, "timeout")

    func main() {
    flag.Parse()
    // Set up a connection to the server.
    conn, err := grpc.Dial(*addr, grpc.WithInsecure())
    if err != nil {
    log.Fatalf("did not connect: %v", err)
    }
    defer conn.Close()
    c := pb.NewGreeterClient(conn)

    ctx, cancel := context.WithTimeout(context.Background(), *tm)
    defer cancel()

    name := defaultName
    var wg sync.WaitGroup
    var cnt uint32
    for i := 0; i < *goro; i++ {
    wg.Add(1)
    go func() {
    defer wg.Done()
    for {
    select {
    case <-ctx.Done():
    return
    default:
    }
    _, err := c.SayHello(ctx, &pb.HelloRequest{Name: name})
    if err != nil {
    break
    }
    atomic.AddUint32(&cnt, 1)
    }
    }()
    }
    wg.Wait()
    fmt.Printf("%d reqs, %.3f rps\n", cnt, float64(cnt)*float64(time.Second) / float64(*tm))
    }
    57 changes: 57 additions & 0 deletions grpc_server
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,57 @@
    /*
    *
    * Copyright 2015 gRPC authors.
    *
    * Licensed under the Apache License, Version 2.0 (the "License");
    * you may not use this file except in compliance with the License.
    * You may obtain a copy of the License at
    *
    * http://www.apache.org/licenses/LICENSE-2.0
    *
    * Unless required by applicable law or agreed to in writing, software
    * distributed under the License is distributed on an "AS IS" BASIS,
    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    * See the License for the specific language governing permissions and
    * limitations under the License.
    *
    */

    //go:generate protoc -I ../helloworld --go_out=plugins=grpc:../helloworld ../helloworld/helloworld.proto

    package main

    import (
    "context"
    "log"
    "net"

    "google.golang.org/grpc"
    pb "google.golang.org/grpc/examples/helloworld/helloworld"
    "google.golang.org/grpc/reflection"
    )

    const (
    port = ":50051"
    )

    // server is used to implement helloworld.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{})
    // Register reflection service on gRPC server.
    reflection.Register(s)
    if err := s.Serve(lis); err != nil {
    log.Fatalf("failed to serve: %v", err)
    }
    }