| /* |
| * |
| * Copyright 2020 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 starts Greeter service that will response with the hostname. |
| package main |
| |
| import ( |
| "context" |
| "flag" |
| "fmt" |
| "log" |
| "math/rand" |
| "net" |
| "os" |
| "strconv" |
| "time" |
| |
| "google.golang.org/grpc" |
| pb "google.golang.org/grpc/examples/helloworld/helloworld" |
| "google.golang.org/grpc/health" |
| healthpb "google.golang.org/grpc/health/grpc_health_v1" |
| "google.golang.org/grpc/reflection" |
| ) |
| |
| var help = flag.Bool("help", false, "Print usage information") |
| |
| const ( |
| defaultPort = 50051 |
| ) |
| |
| // server is used to implement helloworld.GreeterServer. |
| type server struct { |
| pb.UnimplementedGreeterServer |
| |
| serverName string |
| } |
| |
| func newServer(serverName string) *server { |
| return &server{ |
| serverName: serverName, |
| } |
| } |
| |
| // SayHello implements helloworld.GreeterServer |
| func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) { |
| log.Printf("Received: %v", in.GetName()) |
| return &pb.HelloReply{Message: "Hello " + in.GetName() + ", from " + s.serverName}, nil |
| } |
| |
| func determineHostname() string { |
| hostname, err := os.Hostname() |
| if err != nil { |
| log.Printf("Failed to get hostname: %v, will generate one", err) |
| rand.Seed(time.Now().UnixNano()) |
| return fmt.Sprintf("generated-%03d", rand.Int()%100) |
| } |
| return hostname |
| } |
| |
| func init() { |
| flag.Usage = func() { |
| fmt.Fprintf(flag.CommandLine.Output(), ` |
| Usage: server [port [hostname]] |
| |
| port |
| The listen port. Defaults to %d |
| hostname |
| The name clients will see in greet responses. Defaults to the machine's hostname |
| `, defaultPort) |
| |
| flag.PrintDefaults() |
| } |
| } |
| |
| func main() { |
| flag.Parse() |
| if *help { |
| flag.Usage() |
| return |
| } |
| args := flag.Args() |
| |
| if len(args) > 2 { |
| flag.Usage() |
| return |
| } |
| |
| port := defaultPort |
| if len(args) > 0 { |
| var err error |
| port, err = strconv.Atoi(args[0]) |
| if err != nil { |
| log.Printf("Invalid port number: %v", err) |
| flag.Usage() |
| return |
| } |
| } |
| |
| var hostname string |
| if len(args) > 1 { |
| hostname = args[1] |
| } |
| if hostname == "" { |
| hostname = determineHostname() |
| } |
| |
| lis, err := net.Listen("tcp", fmt.Sprintf("localhost:%d", port)) |
| if err != nil { |
| log.Fatalf("failed to listen: %v", err) |
| } |
| s := grpc.NewServer() |
| pb.RegisterGreeterServer(s, newServer(hostname)) |
| |
| reflection.Register(s) |
| healthServer := health.NewServer() |
| healthServer.SetServingStatus("", healthpb.HealthCheckResponse_SERVING) |
| healthpb.RegisterHealthServer(s, healthServer) |
| |
| log.Printf("serving on %s, hostname %s", lis.Addr(), hostname) |
| s.Serve(lis) |
| } |