In diesem Lernprogramm erstellen wir eine schnelle Shortlink-Web-App mit Ruby, dem Sinatra-Web-Framework und der Redis-Datenbank. Nach Abschluss dieses Lernprogramms erhalten Sie eine unkomplizierte, hochleistungsfähige Shortlink-Webanwendung, die einfach zu skalieren ist.
Um diesem Tutorial zu folgen, benötigen Sie Ruby, das auf Ihrem System installiert ist (ich verwende 1.9.2) sowie die Sinatra und Redis Edelsteine und Redis.
Wenn Sie Ruby noch nicht auf Ihrem System installiert haben, sollten Sie es relativ einfach installieren können. Benutzer von OS X, Debian oder CentOS müssen möglicherweise eine neuere Version von Ruby kompilieren. Es ist ein ziemlich einfacher Prozess.
Hier erfahren Sie, wie Sie Ruby über RVM installieren.
Nun müssen Sie die erforderlichen Ruby Gems installieren. Mit Gems können praktisch alle verfügbaren Ruby-Bibliotheken installiert werden. Geben Sie einfach Folgendes in Ihr Terminalfenster ein, um die erforderlichen Edelsteine zu installieren:
gem installieren sinatra redis
Wir müssen auch Redis installieren und kompilieren. Keine Sorge, es ist wirklich klein und dauert nur etwa 15 Sekunden, um auf meinem Computer zu kompilieren.
wget http://redis.googlecode.com/files/redis-2.0.4.tar.gz tar zfx redis-2.0.4.tar.gz cd redis-2.0.4 make sudo make install cd?
Sie können den Redis-Server durch Eingabe ausführen Redis-Server in Ihr Terminal und wenn Sie Lust haben, mit Redis herumzuspielen, geben Sie Redis-Cli ein gehen.
Eine der großartigen Eigenschaften von Sinatra ist, wie schnell und einfach es ist, kleine Apps zu zaubern - es ist fast dumm!
Der Code für die Shortlink-App selbst ist nicht sehr lang und sollte daher leicht verständlich sein. Machen Sie sich keine Sorgen, wenn Sie es zuerst nicht verstehen. Ich erkläre Ihnen in Kürze, wie alles funktioniert.
Machen Sie einen Ordner für Ihre Webapp - ich habe meinen angerufen Redis-Ruby-Shortlink - und füge die folgenden Dateien hinzu.
erfordern 'sinatra' erfordern 'redis' redis = redis.neue Helfer enthalten Rack :: Utils alias_method: h,: escape_html def random_string (length) rand (36 ** length) .to_s (36) end end get '/' do erb: index end post '/' do wenn params [: url] und nicht params [: url] .empty? @shortcode = random_string 5 redis.setnx "links: # @ shortcode", params [: url] end erb: index end get '/: shortcode' do @url = redis.get "links: # params [: shortcode ] "umleiten @url || '/' Ende
Das ist es. Ganz einfach, wie??
In dieser kleinen Sinatra-App oben habe ich ein paar wichtige Dinge getan. In den ersten beiden Zeilen bringe ich die Bibliotheken mit, die wir brauchen - Sinatra und redis. In Zeile 4 stelle ich eine Verbindung zum Redis-Server her und lausche localhost. In den Zeilen danach wird alles interessant!
In Sinatra können Sie Helfer angeben, die jedes Mal ausgeführt werden, wenn einer Ihrer Routen (jene erhalten und Post Teile) wird ausgeführt. Wir können alles, was wir oft brauchen, in den Helferblock setzen. In meinem Helferblock habe ich Aliasing gemacht h zu Rack's escape_html, und definierte eine Methode zum Erzeugen einer zufälligen alphanumerischen Zeichenfolge einer bestimmten Länge.
Als nächstes sind die Routen. Die erste Route ist ziemlich einfach. Immer wenn ein Client eine GET-Anfrage an sendet /, es macht nur die index.erb Seite (Ich habe die Quelle dazu weiter unten hinzugefügt.)
Der nächste Weg ist, wo das Gute passiert. Zuerst stellen wir sicher, dass der Benutzer tatsächlich eine URL in das URL-Feld eingegeben hat. Wenn ja, erzeugen wir einen zufälligen Kurzcode, der fünf Zeichen lang ist, indem wir die random_string Methode, die wir zuvor definiert haben. Dann teilen wir Redis mit, dass setnx (einstellen ob n exists), ein Schlüssel, der unseren Shortcode für seine URL darstellt. Redis ist sehr schnell und einfach Schlüssel- / Wertedatenbank, oder ein NoSQL Datenbank. Diese Datenbanken sind für wirklich umfangreiche Schlüssel- / Wert-Suchvorgänge konzipiert, und da sie den Großteil der Komplexität von SQL verringern, können sie dies tun viel schneller. Die 'Links:' - Teil des Schlüssels ist nicht unbedingt erforderlich, es empfiehlt sich jedoch, Ihre Redis-Schlüssel in mehrere Teile zu unterteilen Namespaces Wenn Sie sich später dazu entschließen, mehr Informationen in derselben Datenbank zu speichern, müssen Sie sich nicht um Kollisionen sorgen. Nach all dem machen wir dasselbe index.erb Seite wie zuvor. Beachten Sie, dass, wenn der Benutzer nichts eingibt, diese Route dasselbe tut wie die vorherige Route.
Die letzte Route wird ausgeführt, wenn ein Client einen Shortlink besucht. Diese Route führt ein, was als a bezeichnet wird URL-Parameter. Wenn ein Client beispielsweise '/ foobar' besucht, wird die : Kurzcode ein Teil der Route entspricht 'foobar'. Wir können auf URL-Parameter wie alle anderen Parameter zugreifen - den Params hash Wir suchen den Shortcode in der Redis-Datenbank. Wenn es keinen Schlüssel gibt, auf den wir zugreifen möchten, kehrt Redis zurück Null. Die nächste Zeile leitet entweder an die URL weiter, die wir aus Redis herausgeholt haben (falls vorhanden), oder leitet sie an die Startseite weiter.
index.erb ist meistens langweiliges Markup, obwohl es ein paar Zeilen gibt, auf die ich gerne hinweisen möchte. erb steht für eingebetteter Ruby, und ermöglicht es uns, Ruby und HTML wie mit PHP zu mischen.
Shortlink App Shortlink-App
<% if @shortcode %>Ihre gekürzte URL lautet: "> http://my-shortlink-app.com/<%= @shortcode %><% end %>
Ein Unterschied zwischen erb und PHP, den Sie vielleicht schon bemerkt haben (abgesehen von den verschiedenen Sprachen), ist, dass PHP dies verwendet und =, erb verwendet <% und =. Das einzig Interessante an index.erb ist der if-Block, der nur den Teil der Seite rendert, der den Shortlink zeigt @ Kurzcode Variable ist definiert. Auf diese Weise können wir dieselbe Ansicht für alles verwenden. Ein weiterer wichtiger Punkt ist, dass wir HTML-Escape sichergestellt haben params [: url], damit wir nicht einem XSS-Angriff zum Opfer fallen. Abgesehen von diesen Punkten handelt es sich im Wesentlichen um eine Standardwebseite.
In der Einführung dieses Tutorials habe ich kurz erwähnt, wie leicht wir dank Redis skalieren können. Während das Skalieren auf mehrere SQL-Datenbanken eine komplizierte Angelegenheit ist, ist das Skalieren von Redis ziemlich trivial. Dies ist eine direkte Folge der Einfachheit von Redis. Wenn Sie auf mehrere Redises skalieren müssen, fügen Sie der Redis-Konfiguration Folgendes hinzu:
slaveof master-redis-server.my-shortlink-app.com 6379
Wenn Sie mehrere Slaves eingerichtet haben, müssen Sie die Sinatra-App oben nur ein wenig ändern, um jede Sinatra-Instanz mit einem zufälligen Redis-Server zu verbinden (wenn Sie sich in der Phase befinden, in der Sie Redis skalieren müssen, nehme ich an dass Sie bereits mehrere Sinatra-Instanzen bereitstellen mussten;
Ich hoffe, dieses Tutorial hat sich für Sie als nützlich erwiesen, unabhängig davon, ob Sie einen eigenen Shortlink-Dienst betreiben möchten oder einfach nur die neuesten Spitzentechnologien für uns Webentwickler interessieren. Ich habe in diesem Tutorial einige hübsche Software behandelt, die nicht nur mir, sondern auch Tausenden von anderen Entwicklern unglaublich nützlich ist. Viel Spaß beim Basteln!