rails_grpc 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/exe/grpc +13 -0
- data/lib/rails_grpc/boot.rb +39 -0
- data/lib/rails_grpc/cli.rb +117 -0
- data/lib/rails_grpc/dependencies.rb +2 -1
- data/lib/rails_grpc/interceptor/logging_interceptor.rb +9 -3
- data/lib/rails_grpc/logger.rb +1 -0
- data/lib/rails_grpc/version.rb +1 -1
- metadata +7 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 77799fe1c9e201856a2f7caf30278367261f84a1
|
4
|
+
data.tar.gz: dcf08de3fa9abe88417e3e5277809761bf0d9e5a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: df1e394da19657184461b21c7a8a4895472fb3633ca977192a2e4f877eb81642eab033e3325256a809b09e1aaca4a8546e14b83764ef33303d729055843fb65c
|
7
|
+
data.tar.gz: b091153b324be138a6a875014bbe44fdb3c7ad2c98a821a9acbf0955373e01841cde38d20973fa89ecd3a1024a5886c16ced07f00b66c0e5834774aae4c8b2dc
|
data/Gemfile.lock
CHANGED
data/exe/grpc
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
module RailsGrpc
|
2
|
+
class Boot
|
3
|
+
attr_accessor :server
|
4
|
+
|
5
|
+
GRPC_DEFAULT_PORT = "127.0.0.1:5050"
|
6
|
+
GRPC_DEFAULT_POOL_SIZE = 1
|
7
|
+
RAILS_BOOT_PATH = "config/environment.rb"
|
8
|
+
GRPC_CONFIG_PATH = "config/grpc.yml"
|
9
|
+
|
10
|
+
def exec(environment)
|
11
|
+
require File.expand_path(RAILS_BOOT_PATH) # Load rails
|
12
|
+
require "rails_grpc/general_server"
|
13
|
+
|
14
|
+
c = config[environment]
|
15
|
+
@server = RailsGrpc::GeneralServer.new(
|
16
|
+
port: c["server"]["port"] || GRPC_DEFAULT_PORT,
|
17
|
+
pool_size: c["server"]["pool_size"] || GRPC_DEFAULT_POOL_SIZE
|
18
|
+
)
|
19
|
+
@server.set_handlers(c["handlers"].map(&:constantize))
|
20
|
+
@server.run
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def config
|
26
|
+
@_config ||= load_config_file
|
27
|
+
end
|
28
|
+
|
29
|
+
def load_config_file
|
30
|
+
if File.exist?(GRPC_CONFIG_PATH)
|
31
|
+
require 'erb'
|
32
|
+
YAML.load(ERB.new(IO.read(GRPC_CONFIG_PATH)).result)
|
33
|
+
else
|
34
|
+
puts "config/grpc.yml file not found."
|
35
|
+
exit 1
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,117 @@
|
|
1
|
+
require "singleton"
|
2
|
+
require "rails_grpc/boot"
|
3
|
+
|
4
|
+
module RailsGrpc
|
5
|
+
class CLI
|
6
|
+
include Singleton
|
7
|
+
|
8
|
+
WORKER_LAUNCH_RETRY_LIMIT = 3
|
9
|
+
RAILS_LAUNCH_WAIT_TIME = 10 # FIXME
|
10
|
+
|
11
|
+
attr_accessor :worker_pid, :server, :mutex
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
@mutex = Mutex.new
|
15
|
+
set_environment
|
16
|
+
end
|
17
|
+
|
18
|
+
def parse
|
19
|
+
end
|
20
|
+
|
21
|
+
def run
|
22
|
+
@worker_pid = Process.fork
|
23
|
+
if @worker_pid
|
24
|
+
print_banner
|
25
|
+
puts "Start GRPC master (pid: #{$$})"
|
26
|
+
set_master_trap
|
27
|
+
Process.waitall
|
28
|
+
else
|
29
|
+
boot_grpc_server
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def set_environment
|
36
|
+
env ||= ENV["RAILS_ENV"]
|
37
|
+
env ||= ENV["RACK_ENV"]
|
38
|
+
env ||= "development"
|
39
|
+
|
40
|
+
ENV["RAILS_ENV"] = ENV["RACK_ENV"] = env
|
41
|
+
env
|
42
|
+
end
|
43
|
+
|
44
|
+
def environment
|
45
|
+
ENV["RAILS_ENV"]
|
46
|
+
end
|
47
|
+
|
48
|
+
def boot_grpc_server
|
49
|
+
RailsGrpc::Boot.new.exec(environment)
|
50
|
+
end
|
51
|
+
|
52
|
+
def print_banner
|
53
|
+
puts "\e[#{31}m"
|
54
|
+
puts <<-EOS
|
55
|
+
ÛÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛ
|
56
|
+
°°ÛÛÛ°°°°°ÛÛÛ °°ÛÛÛ°°°°°ÛÛÛ ÛÛÛ°°°°°ÛÛÛ
|
57
|
+
ÛÛÛÛÛÛÛ °ÛÛÛ °ÛÛÛ °ÛÛÛ °ÛÛÛ ÛÛÛ °°°
|
58
|
+
ÛÛÛ°°ÛÛÛ °ÛÛÛÛÛÛÛÛÛÛ °ÛÛÛÛÛÛÛÛÛÛ °ÛÛÛ
|
59
|
+
°ÛÛÛ °ÛÛÛ °ÛÛÛ°°°°°ÛÛÛ °ÛÛÛ°°°°°° °ÛÛÛ
|
60
|
+
°ÛÛÛ °ÛÛÛ °ÛÛÛ °ÛÛÛ °ÛÛÛ °°ÛÛÛ ÛÛÛ
|
61
|
+
°°ÛÛÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛ °°ÛÛÛÛÛÛÛÛÛ
|
62
|
+
°°°°°ÛÛÛ°°°°° °°°°° °°°°° °°°°°°°°°
|
63
|
+
ÛÛÛ °ÛÛÛ
|
64
|
+
°°ÛÛÛÛÛÛ
|
65
|
+
°°°°°°
|
66
|
+
EOS
|
67
|
+
puts "\e[0m"
|
68
|
+
end
|
69
|
+
|
70
|
+
def set_master_trap
|
71
|
+
Signal.trap(:USR1) do
|
72
|
+
t = Thread.new do
|
73
|
+
@mutex.synchronize do
|
74
|
+
launch_new_worker
|
75
|
+
end
|
76
|
+
end
|
77
|
+
t.report_on_exception = false
|
78
|
+
t.run
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def launch_new_worker
|
83
|
+
new_worker_pid = Process.fork
|
84
|
+
if new_worker_pid
|
85
|
+
puts "Launch new worker process (pid: #{new_worker_pid}) and kill old worker (pid:#{@worker_pid})"
|
86
|
+
retry_limit = WORKER_LAUNCH_RETRY_LIMIT
|
87
|
+
|
88
|
+
# FIXME: ugly code
|
89
|
+
while !process_exists?(new_worker_pid)
|
90
|
+
puts "waiting new worker"
|
91
|
+
sleep 1
|
92
|
+
|
93
|
+
retry_limit -= 1
|
94
|
+
if retry_limit < 0
|
95
|
+
puts "Failed to Launch new worker..."
|
96
|
+
exit 1
|
97
|
+
end
|
98
|
+
end
|
99
|
+
sleep RAILS_LAUNCH_WAIT_TIME # FIXME: bad code
|
100
|
+
|
101
|
+
Process.kill("TERM", @worker_pid)
|
102
|
+
@worker_pid = new_worker_pid
|
103
|
+
else
|
104
|
+
boot_grpc_server
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def process_exists?(pid)
|
109
|
+
Process.kill(0, pid.to_i)
|
110
|
+
true
|
111
|
+
rescue Error::SCRCH # no such process
|
112
|
+
false
|
113
|
+
rescue Error::EPERM # process exists, no permission
|
114
|
+
true
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
@@ -19,9 +19,10 @@ module RailsGrpc
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def find_proto_message_definitions
|
22
|
-
find_proto_lib_files.reject do |t|
|
22
|
+
messages = find_proto_lib_files.reject do |t|
|
23
23
|
File.basename(t).include?("_services_pb.rb")
|
24
24
|
end
|
25
|
+
messages.sort_by { |m| m.include?("_model_pb.rb") ? 0 : 1 } # FIXME: temporary patch to load model first
|
25
26
|
end
|
26
27
|
|
27
28
|
def find_proto_service_definitions
|
@@ -10,14 +10,20 @@ module RailsGrpc
|
|
10
10
|
def request_response(request: nil, call: nil, method: nil)
|
11
11
|
grpc_method = "#{method.owner.name}##{method.name}"
|
12
12
|
logger = @logger
|
13
|
-
logger.
|
13
|
+
logger.info("[GRPC] #{grpc_method}")
|
14
14
|
t = Time.now
|
15
15
|
|
16
|
-
|
16
|
+
begin
|
17
|
+
yield
|
18
|
+
rescue => e
|
19
|
+
logger.error(e)
|
20
|
+
logger.error(e.backtrace.join("\n"))
|
21
|
+
raise e
|
22
|
+
end
|
17
23
|
|
18
24
|
t = Time.now - t
|
19
25
|
display_duration = "%.1f ms" % (t * 1000.0)
|
20
|
-
logger.
|
26
|
+
logger.info("[GRPC response] (#{display_duration}) #{grpc_method}")
|
21
27
|
end
|
22
28
|
end
|
23
29
|
end
|
data/lib/rails_grpc/logger.rb
CHANGED
@@ -10,6 +10,7 @@ module RailsGrpc
|
|
10
10
|
|
11
11
|
if Rails.env.development? || Rails.env.test?
|
12
12
|
std_logger = ActiveSupport::Logger.new(STDOUT)
|
13
|
+
std_logger.formatter = ActiveSupport::Logger::Formatter.new
|
13
14
|
multiple_loggers = ActiveSupport::Logger.broadcast(std_logger)
|
14
15
|
original_logger.extend(multiple_loggers)
|
15
16
|
end
|
data/lib/rails_grpc/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails_grpc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shinsuke Nishio
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-08-
|
11
|
+
date: 2018-08-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -97,7 +97,8 @@ dependencies:
|
|
97
97
|
description: gRPC for Ruby on Rails
|
98
98
|
email:
|
99
99
|
- nishio@densan-labs.net
|
100
|
-
executables:
|
100
|
+
executables:
|
101
|
+
- grpc
|
101
102
|
extensions: []
|
102
103
|
extra_rdoc_files: []
|
103
104
|
files:
|
@@ -112,7 +113,10 @@ files:
|
|
112
113
|
- Rakefile
|
113
114
|
- bin/console
|
114
115
|
- bin/setup
|
116
|
+
- exe/grpc
|
115
117
|
- lib/rails_grpc.rb
|
118
|
+
- lib/rails_grpc/boot.rb
|
119
|
+
- lib/rails_grpc/cli.rb
|
116
120
|
- lib/rails_grpc/dependencies.rb
|
117
121
|
- lib/rails_grpc/extension/rpc_server.rb
|
118
122
|
- lib/rails_grpc/general_server.rb
|