micro-rb 0.1.0.rc1 → 0.1.0.rc2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d9e8d90ef1eb8db2bb2cdfe7dbfa5db6e3d81ef1
4
- data.tar.gz: 18b14c46e6b068473b66773f46cc179f1b356868
3
+ metadata.gz: d4214b295604dcf084cac803a951262200ec128b
4
+ data.tar.gz: e345620800f3507ba539a95ed35c703fd0643229
5
5
  SHA512:
6
- metadata.gz: 64425c6cc425855a34acf18dfba7f7a674e18af87a0f40c4d5ba48f88a595922b7c25efd5715a1b4b683899e88275014e91f54efca6a97daf5a5adbc46973c96
7
- data.tar.gz: 5cd749e57fc0b960167c32e7fcc090399bfb503591c4ebfbd1a79dcb8579e7b843efbae130a130ec87c0d84aa224ca361549cff06d9caffa8177af1a72422fc7
6
+ metadata.gz: 06afa4711aa6ea7414a3974c1f84a09dc31f325dd5e107cfefb702c5febbc054064e652ac6ca7acad8b3b117e9baa8326341f69fb5c40d5a64a4aa1d6b0d487f
7
+ data.tar.gz: 74063eab50bcd01092800c9003f6ee30bb53a657537b0607f18528dbf006708f1918791d79b1f595927b0f31c65c5c98245157056ae8f0d080d4931e3f2981c2
data/Gemfile CHANGED
@@ -5,7 +5,6 @@ source 'https://rubygems.org'
5
5
  # Specify your gem's dependencies in microrb.gemspec
6
6
  gemspec
7
7
 
8
- group :development, :test do
9
- gem 'awesome_print'
10
- gem 'rubocop', '~> 0.48.1', require: false
11
- end
8
+ gem 'awesome_print'
9
+ gem 'puma'
10
+ gem 'rubocop', '~> 0.48.1', require: false
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- [![Build Status](https://travis-ci.org/amedeiros/micro-rb.svg?branch=master)](https://travis-ci.org/amedeiros/micro-rb)
1
+ [![Build Status](https://travis-ci.org/amedeiros/micro-rb.svg?branch=master)](https://travis-ci.org/amedeiros/micro-rb) [![Gem Version](https://badge.fury.io/rb/micro-rb.svg)](https://badge.fury.io/rb/micro-rb)
2
2
 
3
3
  # MicroRb
4
4
 
@@ -7,12 +7,6 @@ MicroRb uses the [sidecar](https://github.com/micro/micro/tree/master/car) that
7
7
 
8
8
  ## Installation
9
9
 
10
- Currently not on rubygems install with bundler and git
11
-
12
- ```ruby
13
- gem 'micro-rb', github: 'amedeiros/micro-rb'
14
- ````
15
-
16
10
  Add this line to your application's Gemfile:
17
11
 
18
12
  ```ruby
@@ -25,7 +19,7 @@ And then execute:
25
19
 
26
20
  Or install it yourself as:
27
21
 
28
- $ gem install micro-rb
22
+ $ gem install micro-rb -v '0.1.0.rc2'
29
23
 
30
24
  ## Status
31
25
 
@@ -87,6 +81,13 @@ Configuration has the following defaults for sidecar endpoint.
87
81
 
88
82
  `Registy: "/registry"`
89
83
 
84
+ Configuration has the following defaults for api gateway.
85
+
86
+ `Host: http://127.0.0.1`
87
+
88
+ `Port: 3002`
89
+
90
+ `Rpc: "/rpc"`
90
91
 
91
92
  Configuration can be changed.
92
93
 
@@ -95,6 +96,10 @@ MicroRb::Configuration.configure do |c|
95
96
  c.sidecar_host = 'http://mysite.com'
96
97
  c.sidecar_port = '8080'
97
98
  c.sidecar_registry = '/awesome_registry'
99
+
100
+ c.gateway_host = 'http://mysite.com'
101
+ c.gateway_port = '8080'
102
+ c.gateway_rpc = '/awesome_micro_rb'
98
103
  end
99
104
  ```
100
105
 
@@ -137,6 +142,14 @@ Date: Tue, 09 May 2017 17:50:47 GMT
137
142
  }
138
143
  ```
139
144
 
145
+ ```ruby
146
+ result = MicroRb::Clients::Rpc.call(service: 'test', method: 'MyHandler.sum', params: {a:1, b:2})
147
+ ap result
148
+ {
149
+ "total" => 3
150
+ }
151
+ ```
152
+
140
153
  ## Calling the service directly
141
154
 
142
155
  ```
@@ -150,6 +163,19 @@ Server: WEBrick/1.3.1 (Ruby/2.4.0/2016-12-24)
150
163
  {"result":{"total":3},"id":"1"}
151
164
  ```
152
165
 
166
+
167
+ ```ruby
168
+ result = MicroRb::Clients::Http.call(uri: 'http://0.0.0.0:3000', service: 'test', method: 'MyHandler.sum', params: {a:1, b:2})
169
+ ap result
170
+
171
+ {
172
+ "result" => {
173
+ "total" => 3
174
+ },
175
+ "id" => nil
176
+ }
177
+ ```
178
+
153
179
  ## Project Generator
154
180
 
155
181
  ```
@@ -4,7 +4,7 @@
4
4
  require 'httparty'
5
5
 
6
6
  module MicroRb
7
- module Sidecar
7
+ module Clients
8
8
  module Base
9
9
  extend ActiveSupport::Concern
10
10
 
@@ -17,8 +17,8 @@ module MicroRb
17
17
  { body: body.to_json, headers: { 'Content-Type' => CONTENT_TYPE } }
18
18
  end
19
19
 
20
- def self.registry_uri
21
- MicroRb::Configuration.instance.sidecar_registry_uri
20
+ def self.decode(json)
21
+ MultiJson.decode(json)
22
22
  end
23
23
  end
24
24
  end
@@ -0,0 +1,18 @@
1
+ # coding: utf-8
2
+ # frozen_string_literal: true
3
+
4
+ module MicroRb
5
+ module Clients
6
+ class Http
7
+ include Base
8
+
9
+ def self.call(uri:, service:, method:, params:, klass_response: nil)
10
+ response = decode(post(uri, options(service: service, method: method, params: Array.wrap(params))))
11
+
12
+ return klass_response.new(response.to_h.symbolize_keys!) if klass_response
13
+
14
+ response
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,21 @@
1
+ # coding: utf-8
2
+ # frozen_string_literal: true
3
+
4
+ module MicroRb
5
+ module Clients
6
+ class Rpc
7
+ include Base
8
+
9
+ base_uri MicroRb::Configuration.instance.gateway_uri
10
+
11
+ def self.call(service:, method:, params:, klass_response: nil)
12
+ response = post(MicroRb::Configuration.instance.gateway_rpc,
13
+ options(service: service, method: method, request: params))
14
+
15
+ return klass_response.new(response.to_h.symbolize_keys!) if klass_response
16
+
17
+ response
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+ # frozen_string_literal: true
3
+
4
+ module MicroRb
5
+ module Clients
6
+ class Sidecar
7
+ include Base
8
+
9
+ base_uri MicroRb::Configuration.instance.sidecar_uri
10
+
11
+ def self.register(service)
12
+ post(registry_path, options(service))
13
+ end
14
+
15
+ def self.remove(service)
16
+ delete(registry_path, options(service))
17
+ end
18
+
19
+ def self.registry_path
20
+ MicroRb::Configuration.instance.sidecar_registry
21
+ end
22
+ end
23
+ end
24
+ end
@@ -5,9 +5,11 @@ module MicroRb
5
5
  class Configuration
6
6
  include Singleton
7
7
 
8
- attr_accessor :sidecar_registry
9
- attr_accessor :sidecar_host
10
- attr_accessor :sidecar_port
8
+ # Sidecar settings
9
+ attr_accessor :sidecar_registry, :sidecar_host, :sidecar_port
10
+
11
+ # API gateway settings
12
+ attr_accessor :gateway_host, :gateway_port, :gateway_rpc
11
13
 
12
14
  def self.configure
13
15
  yield(instance) if block_given?
@@ -21,14 +23,28 @@ module MicroRb
21
23
  "#{sidecar_uri}#{sidecar_registry}"
22
24
  end
23
25
 
26
+ def gateway_uri
27
+ "#{gateway_host}:#{gateway_port}"
28
+ end
29
+
30
+ def gateway_rpc_uri
31
+ "#{gateway_uri}#{gateway_rpc}"
32
+ end
33
+
24
34
  private
25
35
 
26
36
  def initialize
27
37
  yield(self) if block_given?
28
38
 
39
+ # Default sidecar settings
29
40
  self.sidecar_host ||= 'http://127.0.0.1'
30
41
  self.sidecar_registry ||= '/registry'
31
42
  self.sidecar_port ||= '8081'
43
+
44
+ # Default API gateway settings
45
+ self.gateway_host ||= 'http://127.0.0.1'
46
+ self.gateway_rpc ||= '/rpc'
47
+ self.gateway_port ||= '3002'
32
48
  end
33
49
  end
34
50
  end
@@ -0,0 +1,47 @@
1
+ # coding: utf-8
2
+ # frozen_string_literal: true
3
+
4
+ require_relative '../../../lib/microrb'
5
+ require_relative '../examples/proto/fib_pb'
6
+ require 'rack/handler/puma'
7
+
8
+ # This example was to show the usage of puma as well as making RPC calls to services.
9
+ class FibHandler
10
+ include MicroRb::Handler
11
+ include MicroRb::FibPb
12
+
13
+ handler name: :fibonacci, metadata: { hello: 'Micro-Rb' }, rpc_method: :fibonacci
14
+
15
+ def fibonacci(request: Request.new, response: Response.new)
16
+ if (0..1).cover?(request.n)
17
+ response.n = request.n
18
+
19
+ return response
20
+ end
21
+
22
+ left = rpc_call(Request.new(n: request.n - 1))
23
+ right = rpc_call(Request.new(n: request.n - 2))
24
+
25
+ response.n = left + right
26
+
27
+ response
28
+ end
29
+
30
+ private
31
+
32
+ def rpc_call(request)
33
+ MicroRb::Clients::Rpc.call(service: :test,
34
+ method: 'FibHandler.fibonacci',
35
+ params: request,
36
+ klass_response: Response).n
37
+ end
38
+ end
39
+
40
+ server = MicroRb::Servers::Web.new(:test, debug: true, metadata: { example: 'Fib Service' }, server: :puma)
41
+ server.add_handler FibHandler.new
42
+ server.start!
43
+
44
+ # MicroRb::Clients::Rpc.call(service: :test, method: 'FibHandler.fibonacci', params: { n: 15 } )
45
+ # {
46
+ # "n" => 610
47
+ # }
@@ -0,0 +1,13 @@
1
+ // protoc --ruby_out=. fib.proto
2
+
3
+ syntax = "proto3";
4
+
5
+ package micro_rb.fib_pb;
6
+
7
+ message Request {
8
+ int32 n = 1;
9
+ }
10
+
11
+ message Response {
12
+ int32 n = 1;
13
+ }
@@ -0,0 +1,20 @@
1
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
2
+ # source: fib.proto
3
+
4
+ require 'google/protobuf'
5
+
6
+ Google::Protobuf::DescriptorPool.generated_pool.build do
7
+ add_message "micro_rb.fib_pb.Request" do
8
+ optional :n, :int32, 1
9
+ end
10
+ add_message "micro_rb.fib_pb.Response" do
11
+ optional :n, :int32, 1
12
+ end
13
+ end
14
+
15
+ module MicroRb
16
+ module FibPb
17
+ Request = Google::Protobuf::DescriptorPool.generated_pool.lookup("micro_rb.fib_pb.Request").msgclass
18
+ Response = Google::Protobuf::DescriptorPool.generated_pool.lookup("micro_rb.fib_pb.Response").msgclass
19
+ end
20
+ end
@@ -20,7 +20,7 @@ module MicroRb
20
20
  end
21
21
 
22
22
  def rpc_method(method)
23
- rpc_methods[method.to_sym]
23
+ rpc_methods[method.to_sym].clone
24
24
  end
25
25
 
26
26
  def rpc_method?(method)
@@ -35,17 +35,17 @@ module MicroRb
35
35
  rpc_method(method).owner::Request.new(*params)
36
36
  end
37
37
 
38
+ def call_rpc_method(method, params)
39
+ rpc_method(method)
40
+ .call(request: rpc_method_request(method, params),
41
+ response: rpc_method_response(method))
42
+ end
43
+
38
44
  private
39
45
 
40
46
  def validate_handler(handler)
41
- unless handler.is_a?(MicroRb::Handler)
42
- raise "Handler must be of type MicroRb::Handler got #{handler.class}"
43
- end
44
-
45
- if handlers.include?(handler.name)
46
- raise "Handler #{handler.name} has already been registered."
47
- end
48
-
47
+ raise "Handler must be of type MicroRb::Handler got #{handler.class}" unless handler.is_a?(MicroRb::Handler)
48
+ raise "Handler #{handler.name} has already been registered." if handlers.include?(handler.name)
49
49
  raise "Handler #{handler.name} is invalid." unless handler.valid?
50
50
  end
51
51
 
@@ -1,3 +1,5 @@
1
+ // protoc --ruby_out=. debug.proto
2
+
1
3
  syntax = "proto3";
2
4
 
3
5
  package micro_rb.debug;
@@ -9,8 +9,8 @@ require 'multi_json'
9
9
  module MicroRb
10
10
  module Servers
11
11
  class Web
12
- attr_accessor :host, :port, :show_errors, :debug, :metadata, :version
13
- attr_accessor :handler_manager, :name, :node_id, :server
12
+ attr_accessor :host, :port, :show_errors, :debug, :metadata, :version,
13
+ :handler_manager, :name, :node_id, :server
14
14
 
15
15
  REQUIRED_TYPES = { method: [String], params: [Hash, Array],
16
16
  id: [String, Integer, NilClass] }.freeze
@@ -18,10 +18,10 @@ module MicroRb
18
18
  REQUIRED_KEYS = ['method'].freeze
19
19
 
20
20
  def initialize(name, opts = {})
21
- self.port = opts.delete(:port) || 3000
22
- self.host = opts.delete(:host) || '0.0.0.0'
21
+ self.port = opts.delete(:port) || 3000
22
+ self.host = opts.delete(:host) || '0.0.0.0'
23
23
  self.metadata = opts.delete(:metadata) || {}
24
- self.version = opts.delete(:version) || '0.0.1'
24
+ self.version = opts.delete(:version) || '0.0.1'
25
25
  self.debug = opts.delete(:debug)
26
26
  self.name = name
27
27
  self.node_id = "#{name}-#{SecureRandom.uuid}"
@@ -40,7 +40,7 @@ module MicroRb
40
40
  add_handler(MicroRb::Handlers::Debug.new)
41
41
 
42
42
  # Value will raise an error on anything not 2XX
43
- MicroRb::Sidecar::Register.notify(self).response.value
43
+ MicroRb::Clients::Sidecar.register(self).response.value
44
44
 
45
45
  if debug
46
46
  MicroRb.logger
@@ -79,27 +79,17 @@ module MicroRb
79
79
 
80
80
  return resp.finish unless req.post?
81
81
 
82
- resp.write process(req.body.read)
82
+ resp.write handle_request(req.body.read)
83
83
  resp.finish
84
84
  end
85
85
 
86
- def process(content)
87
- response = handle_request(content)
88
-
89
- MultiJson.encode(response)
90
- end
91
-
92
86
  def create_response(request)
93
87
  method = request['method'].strip.to_sym
94
88
  params = request['params'].map(&:symbolize_keys!)
95
89
 
96
- unless handler_manager.rpc_method?(method)
97
- return error_response(Error::MethodNotFound.new(method), request)
98
- end
90
+ return error_response(Error::MethodNotFound.new(method), request) unless handler_manager.rpc_method?(method)
99
91
 
100
- rpc_method = handler_manager.rpc_method(method)
101
- response = rpc_method.call(request: handler_manager.rpc_method_request(method, params),
102
- response: handler_manager.rpc_method_response(method))
92
+ response = handler_manager.call_rpc_method(method, params)
103
93
 
104
94
  success_response(request, response)
105
95
  end
@@ -119,7 +109,7 @@ module MicroRb
119
109
  response = error_response(Error::InternalError.new(e), request)
120
110
  end
121
111
 
122
- response
112
+ MultiJson.encode(response)
123
113
  end
124
114
 
125
115
  private
@@ -150,7 +140,7 @@ module MicroRb
150
140
  def add_finalizer_hook!
151
141
  at_exit do
152
142
  MicroRb.logger.debug("Shutting down #{name}:#{host}:#{port}") if debug
153
- MicroRb::Sidecar::Register.remove(self)
143
+ MicroRb::Clients::Sidecar.remove(self)
154
144
  end
155
145
  end
156
146
 
data/lib/micro/version.rb CHANGED
@@ -2,5 +2,5 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module MicroRb
5
- VERSION = '0.1.0.rc1'
5
+ VERSION = '0.1.0.rc2'
6
6
  end
data/lib/microrb.rb CHANGED
@@ -15,9 +15,10 @@ end
15
15
 
16
16
  require 'micro/version'
17
17
  require 'micro/configuration'
18
- require 'micro/sidecar/base'
19
- require 'micro/sidecar/register'
20
- require 'micro/sidecar/call'
18
+ require 'micro/clients/base'
19
+ require 'micro/clients/sidecar'
20
+ require 'micro/clients/rpc'
21
+ require 'micro/clients/http'
21
22
  require 'micro/handler'
22
23
  require 'micro/handler_manager'
23
24
  require 'micro/servers/web'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: micro-rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.rc1
4
+ version: 0.1.0.rc2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Medeiros
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-05-10 00:00:00.000000000 Z
11
+ date: 2017-05-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -217,7 +217,14 @@ files:
217
217
  - bin/setup
218
218
  - lib/micro-rb.rb
219
219
  - lib/micro/cli.rb
220
+ - lib/micro/clients/base.rb
221
+ - lib/micro/clients/http.rb
222
+ - lib/micro/clients/rpc.rb
223
+ - lib/micro/clients/sidecar.rb
220
224
  - lib/micro/configuration.rb
225
+ - lib/micro/examples/fib.rb
226
+ - lib/micro/examples/proto/fib.proto
227
+ - lib/micro/examples/proto/fib_pb.rb
221
228
  - lib/micro/examples/proto/sum.proto
222
229
  - lib/micro/examples/proto/sum_pb.rb
223
230
  - lib/micro/examples/sum.rb
@@ -229,9 +236,6 @@ files:
229
236
  - lib/micro/proto/debug_pb.rb
230
237
  - lib/micro/servers/error.rb
231
238
  - lib/micro/servers/web.rb
232
- - lib/micro/sidecar/base.rb
233
- - lib/micro/sidecar/call.rb
234
- - lib/micro/sidecar/register.rb
235
239
  - lib/micro/version.rb
236
240
  - lib/microrb.rb
237
241
  - micro-rb.gemspec
@@ -1,18 +0,0 @@
1
- # coding: utf-8
2
- # frozen_string_literal: true
3
-
4
- module MicroRb
5
- module Sidecar
6
- class Call
7
- include MicroRb::Sidecar::Base
8
-
9
- def self.rpc(path, request)
10
- post(path, options(request))
11
- end
12
-
13
- def self.http(path, request)
14
- post(path, query: request)
15
- end
16
- end
17
- end
18
- end
@@ -1,18 +0,0 @@
1
- # coding: utf-8
2
- # frozen_string_literal: true
3
-
4
- module MicroRb
5
- module Sidecar
6
- class Register
7
- include MicroRb::Sidecar::Base
8
-
9
- def self.notify(service)
10
- post(registry_uri, options(service))
11
- end
12
-
13
- def self.remove(service)
14
- delete(registry_uri, options(service))
15
- end
16
- end
17
- end
18
- end