examples/python/xds/server.py
Go to the documentation of this file.
1 # Copyright 2020 The gRPC authors.
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 # http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14 """The Python implementation of the GRPC helloworld.Greeter server."""
15 
16 import argparse
17 from concurrent import futures
18 import logging
19 import socket
20 
21 import grpc
22 from grpc_health.v1 import health
23 from grpc_health.v1 import health_pb2
24 from grpc_health.v1 import health_pb2_grpc
25 from grpc_reflection.v1alpha import reflection
26 import helloworld_pb2
27 import helloworld_pb2_grpc
28 
29 _DESCRIPTION = "A general purpose phony server."
30 
31 _LISTEN_HOST = "0.0.0.0"
32 
33 _THREAD_POOL_SIZE = 256
34 
35 logger = logging.getLogger()
36 console_handler = logging.StreamHandler()
37 formatter = logging.Formatter(fmt='%(asctime)s: %(levelname)-8s %(message)s')
38 console_handler.setFormatter(formatter)
39 logger.addHandler(console_handler)
40 
41 
43 
44  def __init__(self, hostname: str):
45  self._hostname = hostname if hostname else socket.gethostname()
46 
47  def SayHello(self, request: helloworld_pb2.HelloRequest,
48  context: grpc.ServicerContext) -> helloworld_pb2.HelloReply:
50  message=f"Hello {request.name} from {self._hostname}!")
51 
52 
53 def _configure_maintenance_server(server: grpc.Server,
54  maintenance_port: int) -> None:
55  listen_address = f"{_LISTEN_HOST}:{maintenance_port}"
56  server.add_insecure_port(listen_address)
57 
58  # Create a health check servicer. We use the non-blocking implementation
59  # to avoid thread starvation.
60  health_servicer = health.HealthServicer(
61  experimental_non_blocking=True,
62  experimental_thread_pool=futures.ThreadPoolExecutor(
63  max_workers=_THREAD_POOL_SIZE))
64 
65  # Create a tuple of all of the services we want to export via reflection.
66  services = tuple(
67  service.full_name
68  for service in helloworld_pb2.DESCRIPTOR.services_by_name.values()) + (
69  reflection.SERVICE_NAME, health.SERVICE_NAME)
70 
71  # Mark all services as healthy.
72  health_pb2_grpc.add_HealthServicer_to_server(health_servicer, server)
73  for service in services:
74  health_servicer.set(service, health_pb2.HealthCheckResponse.SERVING)
75  reflection.enable_server_reflection(services, server)
76 
77 
78 def _configure_greeter_server(server: grpc.Server, port: int, secure_mode: bool,
79  hostname) -> None:
80  # Add the application servicer to the server.
82  listen_address = f"{_LISTEN_HOST}:{port}"
83  if not secure_mode:
84  server.add_insecure_port(listen_address)
85  else:
86  # Use xDS credentials.
87  logger.info("Running with xDS Server credentials")
88 
89  # Fall back to insecure credentials.
90  server_fallback_creds = grpc.insecure_server_credentials()
91  server_creds = grpc.xds_server_credentials(server_fallback_creds)
92  server.add_secure_port(listen_address, server_creds)
93 
94 
95 def serve(port: int, hostname: str, maintenance_port: int,
96  secure_mode: bool) -> None:
97  if port == maintenance_port:
98  # If maintenance port and port are the same, start a single server.
99  server = grpc.server(
100  futures.ThreadPoolExecutor(max_workers=_THREAD_POOL_SIZE))
101  _configure_greeter_server(server, port, secure_mode, hostname)
102  _configure_maintenance_server(server, maintenance_port)
103  server.start()
104  logger.info("Greeter server listening on port %d", port)
105  logger.info("Maintenance server listening on port %d", maintenance_port)
106  server.wait_for_termination()
107  else:
108  # Otherwise, start two different servers.
109  greeter_server = grpc.server(
110  futures.ThreadPoolExecutor(max_workers=_THREAD_POOL_SIZE),
111  xds=secure_mode)
112  _configure_greeter_server(greeter_server, port, secure_mode, hostname)
113  greeter_server.start()
114  logger.info("Greeter server listening on port %d", port)
115  maintenance_server = grpc.server(
116  futures.ThreadPoolExecutor(max_workers=_THREAD_POOL_SIZE))
117  _configure_maintenance_server(maintenance_server, maintenance_port)
118  maintenance_server.start()
119  logger.info("Maintenance server listening on port %d", maintenance_port)
120  greeter_server.wait_for_termination()
121  maintenance_server.wait_for_termination()
122 
123 
124 if __name__ == '__main__':
125  parser = argparse.ArgumentParser(description=_DESCRIPTION)
126  parser.add_argument("port",
127  default=50051,
128  type=int,
129  nargs="?",
130  help="The port on which to listen.")
131  parser.add_argument("hostname",
132  type=str,
133  default=None,
134  nargs="?",
135  help="The name clients will see in responses.")
136  parser.add_argument(
137  "--xds-creds",
138  action="store_true",
139  help="If specified, uses xDS credentials to connect to the server.")
140  args = parser.parse_args()
141  logging.basicConfig()
142  logger.setLevel(logging.INFO)
143  serve(args.port, args.hostname, args.port + 1, args.xds_creds)
grpc.insecure_server_credentials
def insecure_server_credentials()
Definition: src/python/grpcio/grpc/__init__.py:1755
grpc.xds_server_credentials
def xds_server_credentials(fallback_credentials)
Definition: src/python/grpcio/grpc/__init__.py:1743
server.Greeter._hostname
_hostname
Definition: examples/python/xds/server.py:45
grpc_reflection.v1alpha
Definition: src/python/grpcio_reflection/grpc_reflection/v1alpha/__init__.py:1
server.Greeter.__init__
def __init__(self, no_compress_every_n)
Definition: examples/python/compression/server.py:43
grpc_health.v1
Definition: src/python/grpcio_health_checking/grpc_health/v1/__init__.py:1
helloworld_pb2.HelloReply
HelloReply
Definition: helloworld/helloworld_pb2.py:100
grpc.server
def server(thread_pool, handlers=None, interceptors=None, options=None, maximum_concurrent_rpcs=None, compression=None, xds=False)
Definition: src/python/grpcio/grpc/__init__.py:2034
server.Greeter.SayHello
def SayHello(self, request, context)
Definition: examples/python/compression/server.py:57
server._configure_greeter_server
None _configure_greeter_server(grpc.Server server, int port, bool secure_mode, hostname)
Definition: examples/python/xds/server.py:78
server._configure_maintenance_server
None _configure_maintenance_server(grpc.Server server, int maintenance_port)
Definition: examples/python/xds/server.py:53
grpc.ServicerContext
Definition: src/python/grpcio/grpc/__init__.py:1083
server.serve
None serve(str address)
Definition: examples/python/async_streaming/server.py:81
helloworld_pb2_grpc.GreeterServicer
Definition: helloworld/helloworld_pb2_grpc.py:24
server.Greeter
Definition: examples/python/compression/server.py:41
helloworld_pb2_grpc.add_GreeterServicer_to_server
def add_GreeterServicer_to_server(servicer, server)
Definition: helloworld/helloworld_pb2_grpc.py:36


grpc
Author(s):
autogenerated on Thu Mar 13 2025 03:01:16