Skip to content

Instantly share code, notes, and snippets.

@south37
Last active June 8, 2020 12:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save south37/6ed675d41238a35f02ee4154564862d9 to your computer and use it in GitHub Desktop.
Save south37/6ed675d41238a35f02ee4154564862d9 to your computer and use it in GitHub Desktop.
Implementation of grpc-server command
#!/usr/bin/env ruby
# Print logs immediately
$stdout.sync = true
# Load Ruby on Rails
APP_PATH = File.expand_path('./config/application', Dir.pwd)
require './config/boot'
require 'rails'
require './config/environment'
# Load Servicex::Grpc::Server
require 'servicex/grpc/server'
server = Servicex::Grpc::Server.new(ARGV)
Dir.glob(File.expand_path("#{Rails.root}/app/#{Servicex::Grpc::Config.grpc_dir}/*")) do |f|
klassname = File.basename(f, ".rb").classify
klass = klassname.constantize
server.set_handler(klass.new)
end
server.run
require 'optparse'
require 'grpc/health/checker'
# NOTE: We must inject module-level logger.
# cf. https://github.com/grpc/grpc/blob/de893acb6aef88484a427e64b96727e4926fdcfd/src/ruby/lib/grpc/logconfig.rb#L43
# cf. https://github.com/grpc/grpc/blob/49be7a6667ee27be7be44c6307428ace9dbe373b/src/ruby/spec/spec_helper.rb#L42-L44
module GRPC
class << self
def logger
@logger ||= Servicex.logger
end
end
end
module Servicex::Grpc
class Server
attr_reader :port
# @param argv [<String>]
def initialize(argv = [])
options = parse(argv)
@server = GRPC::RpcServer.new(
interceptors: Servicex::Grpc.server_interceptors
)
@port = options.fetch(:port)
@server.add_http2_port("0.0.0.0:#{@port}", :this_port_is_insecure)
set_handler(health_checker)
end
def set_handler(service)
@server.handle(service)
end
def run
GRPC.logger.info("gRPC server starting...")
GRPC.logger.info("* Listening on tcp://0.0.0.0:#{@port}")
GRPC.logger.info("* Environment: #{Servicex.app_env}")
GRPC.logger.info("Use Ctrl-C to stop")
@server.run_till_terminated_or_interrupted(['SIGHUP', 'SIGINT', 'SIGQUIT'])
GRPC.logger.info("Exiting")
end
private
# @return [Grpc::Health::Checker]
def health_checker
checker = Grpc::Health::Checker.new
checker.add_status("", Grpc::Health::V1::HealthCheckResponse::ServingStatus::SERVING)
checker
end
def parse(argv)
options = {
port: ENV.fetch('APP_PORT') { Servicex::Grpc::Config.default_port },
}
OptionParser.new do |parser|
parser.banner = "Usage: bundle exec grpc-server [options]"
parser.on("-p", "--port [PORT]", "Runs gRPC server on the specified port - defaults to #{Servicex::Grpc::Config.default_port}") do |v|
options[:port] = v.to_i
end
end.parse(argv)
options
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment