Μάθετε περισσότερα για το ρόλο του rack στο οικοσύστημα της Ruby από τον ειδικό μας και βελτιώστε τις ικανότητές σας στο παιχνίδι της Ruby.
Ενώ εργάζεται με Ruby web frameworks είναι σύνηθες να θεωρούμε τα πράγματα δεδομένα. Γνωρίζουμε ότι το πλαίσιο θα χειριστεί τις αιτήσεις HTTP και θα εκτελέσει τη λογική του ενδιάμεσου λογισμικού για εμάς. Καθώς γινόμαστε πιο περίεργοι αρχίζουμε να αναρωτιόμαστε τι υπάρχει πίσω από τα παρασκήνια, εκεί είναι που αρχίζουμε να ακούμε για το Rack.
Τι είναι το Rack;
Το έργο περιγράφεται ως "Μια αρθρωτή διεπαφή διακομιστή ιστού Ruby". Το Rack είναι η διεπαφή που μας επιτρέπει να δημιουργήσουμε εφαρμογές ιστού ενοποιώντας το API για διακομιστές ιστού, web frameworks και middleware.
Όπως περιγράφεται στην παραπάνω εικόνα, το Rack ενεργεί ως μεσάζων μεταξύ της Web Application και του Application Server, τυλίγει τα HTTP requests με τον πιο απλό δυνατό τρόπο.
Εφαρμογή Rack
Μια εφαρμογή Rack είναι ένα αντικείμενο Ruby (όχι μια κλάση) που ανταποκρίνεται σε κλήση. Παίρνει ακριβώς ένα όρισμα, το περιβάλλον και επιστρέφει ένα μη παγωμένο Array των ακριβώς τρεις τιμές:
Το κατάσταση,
το επικεφαλίδες,
και το σώμα.
Μπορείτε να βρείτε τις λεπτομερείς προδιαγραφές μιας εφαρμογής Rackεδώ.
απαιτούν 'rack'
κλάση RackApp
def call(env)
status = 200
headers = { 'Content-Type' => 'text/html' }
body = ['<h1>Η εφαρμογή My Rack App<h1>']
[status, headers, body]
end
end
Rack::Handler
Οι χειριστές συνδέουν διακομιστές ιστού με το Rack. Το Rack περιλαμβάνει χειριστές για Thin, WEBrick, FastCGI, CGI, SCGI και LiteSpeed. Κάθε διακομιστής εφαρμογών που υποστηρίζει το Rack θα πρέπει παρέχουν έναν χειριστή για τη δημιουργία της σύνδεσης (το Puma έχει το δικό του χειριστή).Οι χειριστές συνήθως ενεργοποιούνται με την κλήση του MyHandler.run(myapp). Ένα δεύτερο προαιρετικό hash μπορεί να περάσει για να συμπεριλάβει ρυθμίσεις που αφορούν τον διακομιστή.
Χρήση Thin application server
Rack::Handler::Thin.run(app)
Το προεπιλεγμένο αρχείο για την προσθήκη των ρυθμίσεων είναι config.ru και μπορείτε να το εκτελέσετε χρησιμοποιώντας rackup στην κονσόλα σας.
Rack Middleware
Το Rack μας επιτρέπει να δημιουργήσουμε εφαρμογές middleware (εφαρμογές μεταξύ της κύριας διαδικτυακής εφαρμογής μας και του διακομιστή εφαρμογών). Αυτές οι εφαρμογές middleware συνδέονται μεταξύ τους και εκτελούνται διαδοχικά.
Το Rack Middleware πρέπει να εφαρμόζει όλες τις προδιαγραφές ενός Εφαρμογή Rack και να πληρούν τα ακόλουθα σημεία:
Πρέπει να είναι μια τάξη,
έχουν έναν αρχικοποιητή που λαμβάνει μόνο μία παράμετρο (την κύρια εφαρμογή),
και καλεί το επόμενο ενδιάμεσο λογισμικό ή την εφαρμογή.
class RackMiddleware
def initialize(app)
@app = app
end
def call(env)
@app.call(env)
end
end
Rack στην πράξη
Τώρα που γνωρίζουμε τα βασικά, είμαστε έτοιμοι να δημιουργήσουμε την πρώτη μας εφαρμογή Rack με Rack Middleware και να την εκτελέσουμε χρησιμοποιώντας το Puma (Application Server).
Εγκαταστήστε τις εξαρτήσεις
Βεβαιωθείτε ότι έχετε το rack πολύτιμος λίθος και το puma gem εγκατεστημένο.
Πρώτα, πρέπει να δημιουργήσουμε ένα αρχείο με όνομα config.ru και αυτό το αρχείο θα κάνει χρήση της το Rack::Builder DSL για να εκτελέσετε την εφαρμογή και να προσθέσετε το ενδιάμεσο λογισμικό.
Προσθέστε την εφαρμογή Rack
Εντός του config.ru θα προσθέσουμε την απλή εφαρμογή Rack που ορίσαμε στο αρχείο τις προηγούμενες ενότητες.
# config.ru
κλάση RackApp
def call(env)
status = 200
headers = { 'Content-Type' => 'text/html' }
body = ['<h1>Η εφαρμογή My Rack App<h1>']
[status, headers, body]
end
end
Προσθέστε το Rack Middleware
Εδώ θα κάνουμε μια μικρή τροποποίηση στο απλό ενδιάμεσο λογισμικό μας και τώρα θα προσθέσει το λογισμικό του διακομιστή στο σώμα HTML μετά την εκτέλεσή του.
# config.ru
class RackMiddleware
def initialize(app)
@app = app
end
def call(env)
status, headers, body = @app.call(env)
body << env['SERVER_SOFTWARE']
[status, headers, body]
end
end
Εκτελέστε τον διακομιστή εφαρμογών
Ως τελευταίο βήμα, θα τρέξουμε τον διακομιστή και θα δούμε την εφαρμογή μας να εκτελείται. Το μας config.ru θα έχει την ακόλουθη μορφή:
# config.ru
κλάση RackApp
def call(env)
status = 200
headers = { 'Content-Type' => 'text/html' }
body = ['<h1>Η εφαρμογή My Rack App<h1>']
[status, headers, body]
end
end
class RackMiddleware
def initialize(app)
@app = app
end
def call(env)
status, headers, body = @app.call(env)
body << env['SERVER_SOFTWARE']
[status, headers, body]
end
end
use RackMiddleware
run RackApp.new
Στις τελευταίες γραμμές, καθορίζουμε το ενδιάμεσο λογισμικό χρησιμοποιώντας χρήση και εκτελούμε την εφαρμογή χρησιμοποιώντας τρέχει.Είμαστε έτοιμοι να εκτελέσουμε rackup στην κονσόλα μας και βλέπουμε τον διακομιστή να τρέχει. Μπορούμε να ελέγξουμε τη θύρα στην οποία εκτελείται η εφαρμογή μας και θα πρέπει να δούμε κάτι τέτοιο μετά την πρόσβαση σε αυτήν:
Συμπεράσματα
Μερικές φορές είναι καλό να επιστρέφουμε στα βασικά και να μαθαίνουμε τις γνώσεις για την τεχνολογία με την οποία εργαζόμαστε. Η εκμάθηση του Rack μας δίνει μια σαφή εικόνα της αρχιτεκτονικής και αποκαλύπτει τη "μαγεία" πίσω από την Ruby Web Frameworks.