package main import ( "fmt" "log" "net" "os" "golang.org/x/net/context" "google.golang.org/grpc" "google.golang.org/grpc/reflection" pb "./genproto" ) const ( default_port = "50051" ) // server controls RPC service responses. type server struct{} // GetQuote produces a shipping quote (cost) in USD. func (s *server) GetQuote(ctx context.Context, in *pb.GetQuoteRequest) (*pb.GetQuoteResponse, error) { // 1. Our quote system requires the total number of items to be shipped. count := 0 for _, item := range in.Items { count += int(item.Quantity) } // 2. Generate a quote based on the total number of items to be shipped. quote := CreateQuoteFromCount(count) // 3. Generate a response. return &pb.GetQuoteResponse{ CostUsd: &pb.MoneyAmount{ Decimal: quote.Dollars, Fractional: quote.Cents, }, }, nil } // ShipOrder mocks that the requested items will be shipped. // It supplies a tracking ID for notional lookup of shipment delivery status. func (s *server) ShipOrder(ctx context.Context, in *pb.ShipOrderRequest) (*pb.ShipOrderResponse, error) { // 1. Create a Tracking ID baseAddress := fmt.Sprintf("%s, %s, %s", in.Address.StreetAddress_1, in.Address.StreetAddress_2, in.Address.City) id := CreateTrackingId(baseAddress) // 2. Generate a response. return &pb.ShipOrderResponse{ TrackingId: id, }, nil } func main() { port := default_port if value, ok := os.LookupEnv("APP_PORT"); ok { port = value } port = fmt.Sprintf(":%s", port) lis, err := net.Listen("tcp", port) if err != nil { log.Fatalf("failed to listen: %v", err) } s := grpc.NewServer() pb.RegisterShippingServiceServer(s, &server{}) log.Printf("Shipping Service listening on port %s", port) // Register reflection service on gRPC server. reflection.Register(s) if err := s.Serve(lis); err != nil { log.Fatalf("failed to serve: %v", err) } }