RestfulClient
An HTTP framework for micro-services based environment, build on top of typhoeus and servicejynx
Installation
gem 'restful_client'
Features
- Clean restful api supporting http verbs (GET/PUT/POST/DELETE)
- Manage Failures - set stubs for case of errors and SERVICE_DOWN event from Jynx
- Structured and configurable YAML for multiple service end points
- Build using Typheous, a fast and robust http client, built on top of libcurl
- Configurable timeouts for http request
Configuration
Create the "restful_services.yml" file in your config folder. Configuration for the various service is based on top of YAML that configures the http service endpoints and ServiceJynx setup:
development: &development
users:
url: http://1.2.3.4:7711/api/v1/
time_window_in_seconds: 20
max_errors: 10
grace_period: 60
production: &production
users:
url: http://1.2.3.4:7711/api/v0/
time_window_in_seconds: 20
max_errors: 10
grace_period: 60
Configuration Flags
- :use_jynx - Remove the integrated jynx-service protection (default: false)
- :report_method - proc to be executed in the case of error
- :env_name - environment name (production|staging|development etc..)
- :config_folder - path to the configuration folder of the restful_services.yml file.
- :user_agent - HTTP User-Agent agent, to be added to identify caller (users|mobile_service|anyname etc..)
- :legacy_postfix - Legacy version accessed the restful_services.yml with an additional postfix in the yaml.
Usage
In your environment initializer:
RestfulClient.configure do |config|
config.env_name = Rails.env
config.config_folder = "config"
end
When an error occurs, restful client will report it, as part of the configuration, you an provide it with a reporting hook service, such as graylog or airbrake or whatever you want.
Data from the report_method will be reported as func(klass_name, message, Exception)
Consider the following example:
#reporting method
def report_to_graylog(klass, , e)
Logger.warn "#{klass}::#{}"
$gelf_notifier.send_to_graylog2(e)
end
RestfulClient.configure do |config|
config.env_name = ENV['RACK_ENV']
config.config_folder = "config"
config.user_agent = "my_service"
#proc hock to the reporting method
config.report_method = proc {|*args| report_to_graylog(*args) }
end
Default timeout for a call is set to 10 seconds, if you want to configure anything different:
RestfulClient.configure do |config|
config.env_name = Rails.env
config.config_folder = "#{Rails.root}/config"
config.timeout = 5
end
Than use the service:
RestfulClient.get("posts", "/comments/#{user.id}") do
[] #default value to be returned on failure
end
#or
RestfulClient.delete("posts", {comments: [1,2,4]}, "/comments/#{some_id}") do
"ok" #default value to be returned on failure
end
Forward IP of client
In a complex micro services environment, when services are chained together, you might need to pass along the original IP of the client. Implementation is based on a global $client_ip that can be set and will be assigned to the "X-Forwarded-For" http header. So yeah, no JRuby support at this time.
Reusing configuration
In some cases you might need to use, join or read the base URL of a given service:
Given:
users:
url: http://1.2.3.4:8383/api/v0/
RestfulClient.srv_url('users') # ==> http://1.2.3.4:8383/api/v0/
Contributing
- Fork it
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create new Pull Request