rubyconf 2012: custom reverse proxies

Post on 08-May-2015

1.989 Views

Category:

Technology

1 Downloads

Preview:

Click to see full reader

DESCRIPTION

Abstracting Features Into Custom Reverse Proxies (Or: Making Better Lemonade From Chaos) Life isn't always simple. We often have to deal with a mishmash of applications, languages, and servers. How can we begin to standardize functionality across this chaos? Custom reverse proxies to the rescue! Using Ruby and EventMachine, learn how you can abstract high-level features and functionality into fast reverse proxies that can improve scalability, save time, and make the world happy. - See how we've applied this across a diverse set of web service APIs to standardize the implementation of authentication, request throttling, analytics, and more. - See how this can save development time, eliminate code duplication, make your team happy, make the public happy, and make you a hero. - See how this can be applied to any TCP-based application for a wide-variety of use cases. - Still think your situation is complicated? Learn about the U.S. Government's plans to standardize API access across the entire federal government. With some reverse proxy magic, this isn't quite as difficult or as foolhardy as it may first sound. It also comes with some nice benefits for both the public audience and government developers.

TRANSCRIPT

Abstracting Features Into Custom Reverse Proxies

Or: Making Better Lemonade From Chaos

Photo by Lori Greighttp://www.flickr.com/photos/lori_greig/4906180111

Nick Muerdter • RubyConf 2012 • November 1, 2012

Photo by Brian Lane Winfield Moorehttp://www.flickr.com/photos/doctabu/342220423

OKAY, BUT…

Photo by Brian Lane Winfield Moorehttp://www.flickr.com/photos/doctabu/342220423

WHY & HOW

A Story…

Photo by Elgin County Archiveshttp://www.flickr.com/photos/elgincountyarchives/

6789204118

Photo by rocketlasshttp://www.flickr.com/photos/rocketlass/525244911

Photo by alandberninghttp://www.flickr.com/photos/14617207@N00/4872111479

Users Don’t Care

Photo from National Media Museumhttp://www.flickr.com/photos/nationalmediamuseum/3589381656

• 1 entry point to all our APIs• 1 user account for all our APIs

• API key access to all our APIs• Rate limiting for all our APIs• Analytics for all our APIs

What We Wanted

• Changes required to each API

What We Didn’t Want

CUSTOMREVERSE

PROXY!!!

Better Lemonade?

Photo by Lara604http://www.flickr.com/photos/lara604/4563803829

• 1 API key for all our services• Shielded from our internal

complexities

For API Users

• Old APIs: Do absolutely nothing• New APIs: Do absolutely nothing

• Get for free:–Authentication–Rate Limiting–Analytics

For Our Developers

• Reduced implementation code• Standardization is enforced• New features in the reverse proxy

benefit everyone• Reverse proxies can also be used

for scaling

Building these things…

Photo from The Library of Congresshttp://www.flickr.com/photos/library_of_congress/

2179849680

• Ruby & EventMachine• Blazing fast• Flexible• Low-level

em-proxy

Proxy.start(:host => "0.0.0.0", :port => 80) do |conn| conn.server :srv, :host => "127.0.0.1", :port => 81

conn.on_data do |data| # Do something with the incoming data... data end

conn.on_response do |backend, resp| # Do something with the response... resp end

conn.on_finish do |backend, name| # Do something when finished... endend

conn.on_data do |data| # Modify the User-Agent on the incoming # request data.gsub(/User-Agent: .*?\r\n/, "User-Agent: em-proxy/0.1\r\n")end

redis = Redis.new(:host => "127.0.0.1")

conn.on_data do |data| # Fun things with Ruby! ip = peer[0] redis.incr(ip)

dataend

parser = Http::Parser.newparser.on_headers_complete = proc do |h| # Hello, friendlier HTTP headers... puts h["User-Agent"]end

conn.on_data do |data| parser << data dataend

Photo by Madison Guyhttp://www.flickr.com/photos/madison_guy/

3386919046

Transparency

Photo by Brett Jordanhttp://www.flickr.com/photos/x1brett/6126873518

Speed & Efficiency

Photo by jamesjustinhttp://www.flickr.com/photos/jamesjustin/3629097108

Direct em-proxy rack-reverse-proxy0

0.5

1

1.5

2

2.5

3

3.5

4

Tim

e (m

illis

econ

ds)

(Terribly unscientific benchmarks)

Direct em-proxy rack-reverse-proxy1400

1500

1600

1700

1800

1900

2000

2100

2200

2300

2400

Tim

e (m

illis

econ

ds)

(Terribly unscientific benchmarks)

Flexibility

Photo from The Library of Congresshttp://www.flickr.com/photos/library_of_congress/

2179047512

What Else Can You Do?

Photo by paul-simpson.orghttp://www.flickr.com/photos/paulsimpson1976/4039170901

• Error handling?• Web page manipulation?

– Insert standard analytics JavaScript snippet?– Add a standard header and footer?

• Add JSONP callbacks for all JSON APIs?• Security checks?• More than HTTP…

– Intercept & manipulate e-mail?– Intercept & manipulate database calls?

Photo by Keoki Seuhttp://www.flickr.com/photos/keokiseu/

4973314636

Buffering

Photo from The Library of Congresshttp://www.flickr.com/photos/library_of_congress/3159321339

Content-Length

Photo by Sterlichttp://www.flickr.com/photos/sterlic/4299633060

gzip

Photo by Kaptain Koboldhttp://www.flickr.com/photos/kaptainkobold/6930870617

Want Bigger?

Photo by elviskennedyhttp://www.flickr.com/photos/elviskennedy/

5465419950

WEBSERVICESBONANZA

• Make it easier for users to find and consume federal APIs

• Make it easier for federal agencies to develop & deploy more APIs

Main Objectives

Photo by alandberninghttp://www.flickr.com/photos/14617207@N00/4872111479

Same Problem

Same Solution?

Stay Tuned…

Photo by Lord Jeromehttp://www.flickr.com/photos/lordjerome/127381557

SO………

Photo by judepicshttp://www.flickr.com/photos/judepics/159365806

• Reverse Proxies: Fun for the whole family!

• Custom Reverse Proxies: You might be able to implement more functionality at this layer than you realize.

• Think Different: They can provide a different way to architect some features of your apps.

Photo by Musée McCord Museumhttp://www.flickr.com/photos/museemccordmuseum/5348751435

Resources & Support

• Our full API management solution– Includes custom Event Machine based proxy

• Open source

API Umbrella

https://github.com/NREL/api-umbrella

(Just recently open sourced, so pardon the current state of things)

• em-proxy– https://github.com/igrigorik/em-proxy– Simple and very capable

• ProxyMachine– https://github.com/mojombo/proxymachine– Simpler, but can only act on requests, not responses

• Goliath– https://github.com/postrank-labs/goliath– More of a framework, uses em-synchrony (Fibers)

Ruby & Event Machine

• HAProxy– http://haproxy.1wt.eu/– General proxy and load balancing awesomeness

• Varnish Cache– https://www.varnish-cache.org/– Proxy caching layer coolness

• nginx– http://nginx.org/– Web server powerhouse and nice proxy

Other Reverse Proxies

• http://developer.nrel.gov/

Renewable Energy APIs

(Lots more APIs coming soon)

nick.muerdter@nrel.gov

@nickblah

http://bit.ly/rubystache

Enjoyed this presentation? Enjoyed this ‘stache?

Enjoy charity?

nick.muerdter@nrel.gov @nickblah

top related