README.md
# Rodent
[![Code Climate](https://codeclimate.com/github/kkdoo/rodent.png)](https://codeclimate.com/github/kkdoo/rodent) [![Build Status](https://travis-ci.org/kkdoo/rodent.png?branch=master)](https://travis-ci.org/kkdoo/rodent) [![Dependency Status](https://gemnasium.com/kkdoo/rodent.png)](https://gemnasium.com/kkdoo/rodent)
Rodent is an open source asynchronous framework for Micro Service Architecture (MSA). It is a lightweight and designed to easily develop APIs. Main goals is scaling, simplicity and perfomance.
The framework uses [Goliath](https://github.com/postrank-labs/goliath) as HTTP proxy and [AMQP](https://github.com/ruby-amqp/amqp) protocol to connect MSA for handling requests. Micro Services can be run separately and multiple times for scaling, hot-reloading or language independence. All requests are load balanced with same MSA.
You can learn more about MSA in great [article](http://yobriefca.se/blog/2013/04/28/micro-service-architecture/) by James Hughes.
## Installation & Prerequisites
Rodent is available as a gem, to install it just install the gem
```bash
$> gem install rodent
```
If you're using Bundler, add the gem to Gemfile
```ruby
gem 'rodent'
```
## Getting Started: Hello World
Proxy server for sending HTTP requests into Micro Service (based on [Grape](https://github.com/intridea/grape))
```ruby
# proxy.rb
require 'rodent'
require 'grape'
class CustomersProxy < Grape::API
version 'v1', using: :path
format :json
default_format :json
resource :customers do
params do
requires :name, type: String
requires :email, type: String
end
post '/' do
header 'Rodent-Proxy', 'customers.create'
{name: params[:name], email: params[:email]}
end
end
end
class ProxyApp < Goliath::API
plugin Rodent::Goliath::Plugin
use Rodent::Goliath::Middleware
def response(env)
CustomersProxy.call(env)
end
end
```
Micro Service for handling requests
```ruby
# customers.rb
require 'rodent'
class Customer
attr_accessor :name, :email
def initialize(options)
@name = options['name']
@email = options['email']
end
def as_json
{recipient: [name, ' <', email, '>'].join}
end
end
class CustomersAPI < Rodent::Base
listen 'customers.create' do
self.status = 201
@customer = Customer.new(params)
@customer.as_json
end
end
class CustomersServer < Rodent::Server
configure do
set :connection, 'amqp://guest:guest@localhost'
end
run do
Signal.trap('INT') { Rodent::Server.stop }
[CustomersAPI]
end
end
```
Run proxy server
```bash
$> ruby proxy.rb -v -s -e development -p 3000
```
Run micro service
```bash
$> ruby customers.rb
```
Then you can test it
```bash
$> curl -X POST localhost:3000/v1/customers -d "name=Bob" -d "email=bob@example.com"
```
## Performance
My results is below
```bash
Server Software: Goliath
Server Hostname: localhost
Server Port: 3000
Document Path: /v1/customers
Document Length: 2 bytes
Concurrency Level: 50
Time taken for tests: 2.450 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 126000 bytes
HTML transferred: 2000 bytes
Requests per second: 408.18 [#/sec] (mean)
Time per request: 122.495 [ms] (mean)
Time per request: 2.450 [ms] (mean, across all concurrent requests)
Transfer rate: 50.23 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 2 1.0 2 5
Processing: 51 118 40.5 116 233
Waiting: 45 116 41.0 115 232
Total: 51 120 40.7 117 235
```
## License & Acknowledgments
Rodent is distributed under the MIT license, for full details please see the LICENSE file.
[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/kkdoo/rodent/trend.png)](https://bitdeli.com/free "Bitdeli Badge")