Skip to content

Instantly share code, notes, and snippets.

@pieterlouw
Created May 16, 2017 21:33
Show Gist options
  • Save pieterlouw/b773b16bd488ac3441ca32a739edb4e9 to your computer and use it in GitHub Desktop.
Save pieterlouw/b773b16bd488ac3441ca32a739edb4e9 to your computer and use it in GitHub Desktop.
package main
import (
"flag"
"log"
"net"
"os"
"os/signal"
"strings"
"sync"
context "golang.org/x/net/context"
"google.golang.org/grpc"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/grpclog"
library "play/grpcweb/go/_proto/examplecom/library"
)
var (
grpcEndpoint = "localhost:9090"
)
func main() {
flag.Parse()
grpcServer := grpc.NewServer()
library.RegisterBookServiceServer(grpcServer, &bookService{})
grpclog.SetLogger(log.New(os.Stdout, "exampleserver: ", log.LstdFlags))
//start listener for gRPC server
lis, err := net.Listen("tcp", grpcEndpoint)
if err != nil {
log.Fatalf("TCP listener error: %s", err.Error())
}
//graceful shutdown code:
// We want to report when each listener is closed.
var wg sync.WaitGroup
wg.Add(1)
// Start the grpc listener.
go func() {
log.Printf("startup : API server Listening on %s", grpcEndpoint)
log.Printf("shutdown : API server Listener closed : %v", grpcServer.Serve(lis))
wg.Done()
}()
// Listen for an interrupt signal from the OS.
osSignals := make(chan os.Signal)
signal.Notify(osSignals, os.Interrupt)
// Wait for a signal to shutdown.
<-osSignals
grpcServer.GracefulStop()
// Wait for the listeners to report it is closed.
wg.Wait()
log.Println("main : Completed")
}
type bookService struct{}
var books = []*library.Book{
&library.Book{
Isbn: 60929871,
Title: "Brave New World",
Author: "Aldous Huxley",
},
&library.Book{
Isbn: 140009728,
Title: "Nineteen Eighty-Four",
Author: "George Orwell",
},
&library.Book{
Isbn: 9780140301694,
Title: "Alice's Adventures in Wonderland",
Author: "Lewis Carroll",
},
&library.Book{
Isbn: 140008381,
Title: "Animal Farm",
Author: "George Orwell",
},
}
func (s *bookService) GetBook(ctx context.Context, bookQuery *library.GetBookRequest) (*library.Book, error) {
log.Println("GetBook")
//grpc.SendHeader(ctx, metadata.Pairs("Pre-Response-Metadata", "Is-sent-as-headers-unary"))
//grpc.SetTrailer(ctx, metadata.Pairs("Post-Response-Metadata", "Is-sent-as-trailers-unary"))
for _, book := range books {
if book.Isbn == bookQuery.Isbn {
return book, nil
}
}
return nil, grpc.Errorf(codes.NotFound, "Book could not be found")
}
func (s *bookService) QueryBooks(bookQuery *library.QueryBooksRequest, stream library.BookService_QueryBooksServer) error {
log.Println("QueryBooks")
//stream.SendHeader(metadata.Pairs("Pre-Response-Metadata", "Is-sent-as-headers-stream"))
for _, book := range books {
if strings.HasPrefix(book.Author, bookQuery.AuthorPrefix) {
stream.Send(book)
}
}
//stream.SetTrailer(metadata.Pairs("Post-Response-Metadata", "Is-sent-as-trailers-stream"))
return nil
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment