microservice_dsl 0.2.3 → 0.3.0
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/lib/microservice_dsl/version.rb +1 -1
- data/lib/microservice_dsl.rb +114 -1
- data/microservice_dsl.gemspec +1 -0
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8a2bf369380148747520edd76b31a7c2b0432636
|
4
|
+
data.tar.gz: aa81d1d988315d09114519949fae3e1ef87be783
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6c57fa06ad3810d1d3c69909477e38015062dd3147a88bb16a586be82666aae314a77114d7dbbf5ad8a8044b4b4ce0e06fa948cbf1b219345a151b662f07e653
|
7
|
+
data.tar.gz: adf413de93464447b9fa80d287536819e4710f48552fdbd8906b1cd6e3cbf17e179ca5af3d62c0310c0f9b5827657535d9c184cb4c86470ddf9c1ce8c59547a8
|
data/lib/microservice_dsl.rb
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
require "microservice_dsl/version"
|
2
2
|
require "typhoeus"
|
3
|
+
require "json"
|
4
|
+
require "digest"
|
5
|
+
require "redis"
|
3
6
|
|
4
7
|
module Kernel
|
5
8
|
private
|
@@ -10,7 +13,29 @@ module Kernel
|
|
10
13
|
url = ENV["#{microservice.upcase}_URL"] || "http://#{microservice}.#{ENV['MS_DOMAIN'] || Rails.env}:#{ENV["MS_#{microservice.upcase}_PORT"] || '3000'}"
|
11
14
|
url << "/#{args[:path]}" if args[:path]
|
12
15
|
body = (args[:body].is_a? String) ? args[:body] : args[:body].to_json if args[:body]
|
13
|
-
|
16
|
+
headers = MicroserviceDSL.default_headers.merge(args[:headers] || {}).merge({MicroserviceDSL.hop_header => MicroserviceDSL.hop_string})
|
17
|
+
method = args[:method] || :get
|
18
|
+
req = Typhoeus::Request.new(url, method: method, headers: headers, body: body, params: args[:params], timeout: ENV['MS_DEFAULT_TIMEOUT'] || 10)
|
19
|
+
|
20
|
+
if method.to_s.downcase == "get"
|
21
|
+
req.on_complete do |res|
|
22
|
+
if res.code == 200 && etag = res.headers["etag"]
|
23
|
+
MicroserviceDSL.set_cache(url, etag, res)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
if cached = MicroserviceDSL.get_cache(url, req)
|
27
|
+
req.options[:headers]["If-None-Match"] = cached[:etag]
|
28
|
+
req.on_complete do |res|
|
29
|
+
if res.code == 304
|
30
|
+
res.options[:response_body] = cached[:response][:body]
|
31
|
+
res.options[:response_code] = cached[:response][:code]
|
32
|
+
res.options[:headers] = Typhoeus::Response::Header.new(cached[:response][:headers])
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
req
|
14
39
|
end
|
15
40
|
|
16
41
|
def call_microservice(microservice, args={})
|
@@ -21,6 +46,83 @@ module Kernel
|
|
21
46
|
end
|
22
47
|
|
23
48
|
module MicroserviceDSL
|
49
|
+
def self.redis_reset!
|
50
|
+
@@redis=nil
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.redis
|
54
|
+
return nil unless caching?
|
55
|
+
splitted = ENV["MS_CACHE_URL"].split(":")
|
56
|
+
host = splitted[0]
|
57
|
+
port = splitted[1] || "6379"
|
58
|
+
@@redis ||= Redis.new(host: host, port: port)
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.caching?
|
62
|
+
if ENV["MS_CACHE_URL"]
|
63
|
+
return true
|
64
|
+
else
|
65
|
+
return false
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def self.set_cache(url, etag, res)
|
70
|
+
return nil unless caching?
|
71
|
+
puts "Etag: #{etag}"
|
72
|
+
data = {
|
73
|
+
etag: etag,
|
74
|
+
response: {
|
75
|
+
body: res.body,
|
76
|
+
code: res.code,
|
77
|
+
headers: res.headers
|
78
|
+
}
|
79
|
+
}
|
80
|
+
puts data
|
81
|
+
redis.set([redis_hash_name, cache_key(url, res.request)].join(':'), JSON.dump(data))
|
82
|
+
end
|
83
|
+
|
84
|
+
def self.cache_key(url, req)
|
85
|
+
@@taggers ||= nil
|
86
|
+
url = url.gsub(":", "|")
|
87
|
+
unless @@taggers
|
88
|
+
url
|
89
|
+
else
|
90
|
+
@@taggers.map {|t| Digest::MD5.hexdigest(req.options[:headers][t])}.join("/") + "-" + url
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def self.get_etag(url, req)
|
95
|
+
return nil unless caching?
|
96
|
+
if val = get_cache(url, req)
|
97
|
+
val[:etag]
|
98
|
+
else
|
99
|
+
nil
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def self.has_cache?(url, etag, req)
|
104
|
+
return nil unless caching?
|
105
|
+
(stored_etag = get_etag(url, req)) && (stored_etag == etag) && stored_etag
|
106
|
+
end
|
107
|
+
|
108
|
+
def self.get_cache(url, req)
|
109
|
+
return nil unless caching?
|
110
|
+
if val = redis.get([redis_hash_name, cache_key(url, req)].join(':'))
|
111
|
+
JSON.parse(val, symbolize_names: true)
|
112
|
+
else
|
113
|
+
nil
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def self.redis_hash_name
|
118
|
+
ENV["MS_CACHE_HASH"] || "msdsl"
|
119
|
+
end
|
120
|
+
|
121
|
+
def self.cache_taggers=(taggers)
|
122
|
+
raise unless taggers.is_a?(Array)
|
123
|
+
@@taggers = taggers
|
124
|
+
end
|
125
|
+
|
24
126
|
def self.hop_header
|
25
127
|
"X-Hop-Count"
|
26
128
|
end
|
@@ -58,6 +160,17 @@ module MicroserviceDSL
|
|
58
160
|
def self.hop_string
|
59
161
|
[self.current_hop, self.next_hop].join(".")
|
60
162
|
end
|
163
|
+
|
164
|
+
def self.hashable_string_for(obj)
|
165
|
+
case obj
|
166
|
+
when Hash
|
167
|
+
hashable_string_for(obj.sort_by {|sub_obj| sub_obj.first.to_s})
|
168
|
+
when Array
|
169
|
+
obj.map {|sub_obj| hashable_string_for(sub_obj)}.to_s
|
170
|
+
else
|
171
|
+
obj.to_s
|
172
|
+
end
|
173
|
+
end
|
61
174
|
end
|
62
175
|
|
63
176
|
require "microservice_dsl/railtie" if defined?(Rails)
|
data/microservice_dsl.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: microservice_dsl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vincenzo Ferrara
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-02-
|
11
|
+
date: 2017-02-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: typhoeus
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.1'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: redis
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: bundler
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|