Service::Proxy
When running a service-oriented architecture, it is sometimes desirable to allow your backend services to be mapped to URL paths within the application itself.
This allows you for example to be able to share cookies and reduce the need for CORS calls or to expose your services in a way that they are accessible only through a particular front-end application.
This gem allows you to easily set up these backend service proxy's through a simple YAML configuration file.
Installation
Add this line to your application's Gemfile:
source "https://rubygems.pkg.github.com/sephora-asia" do
gem 'service-proxy'
endAnd then execute:
$ bundleUsage
Create a file named config/service_proxy.yml in your rails application directory. It should look something like this -
default: &default
services:
address-api:
path: /api/address
backend: https://www.my-address-api.com:8888/
user-api:
path: /api/user
backend: https://www.my-user-api.com/
rewards-api:
path: /api/rewards
backend: http://www.my-rewards-api.com:9999/
ads-api:
path: /api/ads
backend: http://www.my-ads-api.com:1101/
forward_cookies: false
development:
<<: *default
test:
<<: *defaultEach of the services block sequence in the yml file is given a - sequence name, and are expected to contain path and backend scalar. The request url that the app receives will be matched against each of these path and if a match is found, then the request will be forwarded to the corresponding backend. For eg. based on the above config, if our app is responding to https://www.my-app.com, then if a request to https://www.my-app.com/api/rewards?reward_id=1234 is made, it will be matched against the rewards-api block sequence and the same request will get forwarded as http://www.my-rewards-api.com:9999/?reward_id=1234.
Each block sequence can contain the following scalars -
-
path: The path that needs to be matched in the request url. It is a required field. -
backend: This is the destination URI that we need to forward the current request to. This needs to have a valid url scheme[scheme]://[domain]:[port]/. Supportedschemeis eitherhttporhttps.portis optional and the default value of 80 or 443 is used depending up on whether the scheme ishttporhttps. This is also a required field. -
forward_cookies: Can betrue(default value) orfalse. Cookies will not be forwarded tobackendif this is set to false. -
read_timeout: This sets the proxy timeout. By default it times out in 60 seconds. -
verify_ssl: Can betrue(default value) orfalse. This tellsNet::HTTPto not validate certs if set tofalse.
Contributing
Run make setup in order to install your dev environment.
This project uses the conventional commits for commit naming.
Publishing is done automatically when a push to the master branch is detected.
License
The gem is available as open source under the terms of the MIT License.