Τι είναι το gRPC; Επεξήγηση πρωτοκόλλων, ροής και αρχιτεκτονικής

Το gRPC είναι ένα ισχυρό πλαίσιο για εργασία με κλήσεις απομακρυσμένης διαδικασίας. Τα RPC σάς επιτρέπουν να γράφετε κώδικα σαν να εκτελείται σε τοπικό υπολογιστή, παρόλο που μπορεί να εκτελεστεί σε άλλον υπολογιστή.

Τις τελευταίες μέρες έχω βουτήξει βαθιά στο gRPC. Θα μοιραστώ μερικές από τις μεγάλες ανακαλύψεις μου εδώ σε αυτό το άρθρο.

Σημειώστε ότι θα επικεντρωθώ περισσότερο σε έννοιες παρά στις λεπτομέρειες εφαρμογής. Θα μάθετε τη βασική αρχιτεκτονική του ίδιου του gRPC. Θα μάθετε επίσης:

  • Γιατί το gRPC χρησιμοποιείται τόσο ευρέως από τους προγραμματιστές
  • Πώς λειτουργεί τόσο καλά
  • Και πώς λειτουργούν όλα κάτω από την κουκούλα.

Ας επιστρέψουμε λίγο

Πριν προχωρήσουμε στο gRPC, πρέπει να ρίξουμε μια ματιά σε τι είναι οι κλήσεις απομακρυσμένης διαδικασίας .

Το RPC είναι μια μορφή επικοινωνίας πελάτη-διακομιστή που χρησιμοποιεί μια κλήση συνάρτησης και όχι μια συνηθισμένη κλήση HTTP.

Χρησιμοποιεί το IDL (Interface Definition Language) ως μορφή συμβολαίου για τις λειτουργίες που θα κληθούν και για τον τύπο δεδομένων.

Εάν δεν το έχετε καταλάβει ακόμη, το RPC στο gRPC σημαίνει Απομακρυσμένη διαδικασία κλήσης. Και ναι, το gRPC αναπαράγει αυτό το αρχιτεκτονικό στυλ επικοινωνίας διακομιστή πελατών, μέσω κλήσεων λειτουργίας.

Επομένως, το gRPC δεν είναι τεχνικά μια νέα ιδέα. Αντίθετα, υιοθετήθηκε από αυτήν την παλιά τεχνική και βελτιώθηκε, καθιστώντας το πολύ δημοφιλές σε μόλις 5 χρόνια.

Επισκόπηση του gRPC

Το 2015, η Google άνοιξε το έργο τους, το οποίο τελικά θα ήταν αυτό που ονομάζεται gRPC. Αλλά τι σημαίνει το "g" στο gRPC;

Πολλοί άνθρωποι μπορεί να το αναλάβουν για το Google επειδή το έκανε το Google, αλλά δεν το κάνει.

Το Google αλλάζει την έννοια του "g" για κάθε έκδοση στο σημείο όπου έκαναν ακόμη και ένα README για να απαριθμήσουν όλες τις έννοιες.

Από τότε που έχει εισαχθεί το gRPC, έχει αποκτήσει αρκετή δημοτικότητα και πολλές εταιρείες το χρησιμοποιούν.

Τι κάνει το gRPC τόσο δημοφιλές;

Υπάρχουν πολλοί λόγοι για τους οποίους το gRPC είναι τόσο δημοφιλές:

  • Η αφαίρεση είναι εύκολη (είναι μια κλήση λειτουργίας)
  • Υποστηρίζεται σε πολλές γλώσσες
  • Είναι πολύ καλό
  • Οι κλήσεις HTTP συχνά προκαλούν σύγχυση, επομένως αυτό διευκολύνει

Και εκτός από όλους τους παραπάνω λόγους, το gRPC είναι δημοφιλές, επειδή οι μικροϋπηρεσίες είναι πολύ δημοφιλείς.

Οι υπηρεσίες μικροϋπολογιστών εκτελούν συχνά πολλές υπηρεσίες σε διαφορετικές γλώσσες προγραμματισμού. Συχνά θα έχουν πολλές αλληλεπιδράσεις μεταξύ υπηρεσιών.

Εδώ είναι που το gRPC βοηθάει περισσότερο παρέχοντας την υποστήριξη και την ικανότητα επίλυσης των τυπικών ζητημάτων που προκύπτουν από αυτές τις καταστάσεις.

Το gRPC είναι πολύ δημοφιλές στις κλήσεις από υπηρεσία σε υπηρεσία, καθώς συχνά οι κλήσεις HTTP είναι πιο δύσκολο να κατανοηθούν με την πρώτη ματιά.

Οι συναρτήσεις gRPC είναι πολύ πιο εύλογες, επομένως οι προγραμματιστές δεν χρειάζεται να ανησυχούν για τη σύνταξη πολλών τεκμηρίωσης, επειδή ο ίδιος ο κώδικας πρέπει να εξηγεί τα πάντα.

Ορισμένες από τις υπηρεσίες μπορεί επίσης να γραφτούν σε διαφορετικές γλώσσες και το gRPC συνοδεύεται από πολλές βιβλιοθήκες για να το υποστηρίξει.

Η απόδοση είναι το κεράσι στην κορυφή - και είναι ένα μεγάλο κεράσι.

Αρχιτεκτονική gRPC

Έχω αναφέρει πολλές φορές ότι η απόδοση του gRPC είναι πολύ καλή, αλλά μπορεί να αναρωτιέστε τι το κάνει τόσο καλό; Τι κάνει το gRPC πολύ καλύτερο από το RPC όταν τα σχέδιά τους είναι αρκετά παρόμοια;

Ακολουθούν μερικές βασικές διαφορές που κάνουν το gRPC τόσο αποτελεσματικό.

HTTP / 2

Το HTTP είναι εδώ και πολύ καιρό. Τώρα, σχεδόν όλες οι υπηρεσίες backend χρησιμοποιούν αυτό το πρωτόκολλο.

Όπως δείχνει η παραπάνω εικόνα, το HTTP / 1.1 παρέμεινε σχετικό για μεγάλο χρονικό διάστημα.

Στη συνέχεια, το 2015, το HTTP / 2 βγήκε και ουσιαστικά αντικατέστησε το HTTP / 1.1 ως το πιο δημοφιλές πρωτόκολλο μεταφοράς στο Διαδίκτυο.

Αν θυμάστε ότι το 2015 ήταν επίσης η χρονιά που βγήκε το gRPC, δεν ήταν καθόλου τυχαίο. Το HTTP / 2 δημιουργήθηκε επίσης από την Google για χρήση από το gRPC στην αρχιτεκτονική του.

Το HTTP / 2 είναι ένας από τους μεγάλους λόγους για τους οποίους το gRPC μπορεί να αποδώσει τόσο καλά. Και σε αυτήν την επόμενη ενότητα, θα δείτε γιατί.

Αίτημα / Πολλαπλή απόκριση

Σε ένα παραδοσιακό πρωτόκολλο HTTP, δεν είναι δυνατή η αποστολή πολλαπλών αιτημάτων ή η λήψη πολλαπλών απαντήσεων σε μία σύνδεση. Θα πρέπει να δημιουργηθεί μια νέα σύνδεση για καθένα από αυτά.

Αυτό το είδος αιτήματος / απόκρισης πολυπλεξίας καθίσταται δυνατή στο HTTP / 2 με την εισαγωγή ενός νέου επιπέδου HTTP / 2 που ονομάζεται δυαδικό framing.

Αυτό το δυαδικό επίπεδο ενσωματώνει και κωδικοποιεί τα δεδομένα. Σε αυτό το επίπεδο, το αίτημα / απάντηση HTTP χωρίζεται σε πλαίσια.

Το πλαίσιο κεφαλίδων περιέχει τυπικές πληροφορίες κεφαλίδων HTTP και το πλαίσιο δεδομένων περιέχει το ωφέλιμο φορτίο. Χρησιμοποιώντας αυτόν τον μηχανισμό, μπορείτε να έχετε δεδομένα από πολλαπλά αιτήματα σε μία σύνδεση.

Αυτό επιτρέπει ωφέλιμα φορτία από πολλά αιτήματα με την ίδια κεφαλίδα, αναγνωρίζοντας έτσι ως ένα μόνο αίτημα.

Συμπίεση κεφαλίδας

Μπορεί να έχετε αντιμετωπίσει πολλές περιπτώσεις όπου οι κεφαλίδες HTTP είναι ακόμη μεγαλύτερες από το ωφέλιμο φορτίο. Και το HTTP / 2 έχει μια πολύ ενδιαφέρουσα στρατηγική που ονομάζεται HPack για να το χειριστεί αυτό.

Πρώτον, τα πάντα στο HTTP / 2 κωδικοποιούνται πριν από την αποστολή τους, συμπεριλαμβανομένων των κεφαλίδων. Αυτό βοηθά στην απόδοση, αλλά αυτό δεν είναι το πιο σημαντικό πράγμα για τη συμπίεση κεφαλίδας.

Το HTTP / 2 χαρτογραφεί την κεφαλίδα τόσο στον πελάτη όσο και στον διακομιστή. Από αυτό, το HTTP / 2 μπορεί να γνωρίζει αν η κεφαλίδα περιέχει την ίδια τιμή και στέλνει την τιμή κεφαλίδας μόνο εάν είναι διαφορετική από την προηγούμενη κεφαλίδα.

Όπως φαίνεται στην παραπάνω εικόνα, το Αίτημα # 2 θα στείλει τη διαδρομή μόνο αφού οι άλλες τιμές είναι ακριβώς οι ίδιες. Και ναι, αυτό μειώνει πολύ το μέγεθος του ωφέλιμου φορτίου και, με τη σειρά του, βελτιώνει ακόμη περισσότερο την απόδοση του HTTP / 2.

Protocol Buffer, γνωστό και ως Protobuf

Το Protobuf είναι το πιο συχνά χρησιμοποιούμενο IDL (Interface Definition Language) για το gRPC. Εκεί αποθηκεύετε βασικά τα δεδομένα και τις συμβάσεις λειτουργίας σας με τη μορφή ενός πρωτοκόλλου αρχείου.

message Person { required string name = 1; required int32 id = 2; optional string email = 3; }

Καθώς αυτό έχει τη μορφή συμβολαίου, τόσο ο πελάτης όσο και ο διακομιστής πρέπει να έχουν το ίδιο πρωτότυπο αρχείο. Το πρωτότυπο αρχείο λειτουργεί ως ενδιάμεσο συμβόλαιο για τον πελάτη να καλεί τυχόν διαθέσιμες συναρτήσεις από το διακομιστή.

Το Protobuf διαθέτει επίσης μηχανισμούς, σε αντίθεση με ένα συνηθισμένο REST API που στέλνει απλώς συμβολοσειρές JSON ως byte. Αυτοί οι μηχανισμοί επιτρέπουν το ωφέλιμο φορτίο να είναι πολύ μικρότερο και να επιτρέπει ταχύτερη απόδοση.

Η μέθοδος κωδικοποίησης που χρησιμοποιεί το Protobuf είναι αρκετά περίπλοκη. Εάν θέλετε να κάνετε μια βαθιά βουτιά στον τρόπο λειτουργίας, ρίξτε μια ματιά σε αυτήν την ολοκληρωμένη τεκμηρίωση.

Τι άλλο προσφέρει το gRPC;

αστέρια στον ουρανό

Τώρα θα πρέπει να έχετε μια βασική κατανόηση της αρχιτεκτονικής του gRPC, του τρόπου λειτουργίας του και του τι μπορεί να κάνει.

Αλλά εδώ είναι μερικά άλλα ενδιαφέροντα πράγματα που μας προσφέρει το gRPC.

Μεταδεδομένα

Αντί να χρησιμοποιεί μια συνηθισμένη κεφαλίδα αιτήματος HTTP, το gRPC έχει κάτι που ονομάζεται μεταδεδομένα. Τα μεταδεδομένα είναι ένας τύπος δεδομένων κλειδιού-τιμής που μπορούν να ρυθμιστούν είτε από την πλευρά του πελάτη είτε του διακομιστή.

Headerμπορούν να εκχωρηθούν από την πλευρά του πελάτη, ενώ οι διακομιστές μπορούν να εκχωρήσουν Headerκαι Trailersεφόσον είναι και οι δύο με τη μορφή μεταδεδομένων.

Ροή

Η ροή είναι μια από τις βασικές έννοιες του gRPC όπου πολλά πράγματα μπορούν να συμβούν σε ένα μόνο αίτημα. Αυτό γίνεται εφικτό με την ικανότητα πολλαπλής πολυπλεξίας του HTTP / 2 που αναφέρθηκε προηγουμένως.

Υπάρχουν διάφοροι τύποι ροής:

  • Server Streaming RPC: Όπου ο πελάτης στέλνει ένα μόνο αίτημα και ο διακομιστής μπορεί να στείλει πίσω πολλές απαντήσεις. Για παράδειγμα, όταν ένας πελάτης στέλνει ένα αίτημα για μια αρχική σελίδα που έχει μια λίστα με πολλά στοιχεία, ο διακομιστής μπορεί να στείλει πίσω απαντήσεις ξεχωριστά, επιτρέποντας στον πελάτη να χρησιμοποιεί τεμπέλης φόρτωση.
  • CPC πελάτη ροής: Όπου ο πελάτης στέλνει πολλά αιτήματα και ο διακομιστής στέλνει πίσω μόνο μία απάντηση. Για παράδειγμα, ένα zip / κομμάτι που ανέβηκε από τον πελάτη.
  • Bidirectional Streaming RPC: Όταν ο πελάτης και ο διακομιστής στέλνουν μηνύματα ο ένας στον άλλο ταυτόχρονα χωρίς να περιμένουν απάντηση.

Αναχαιτιστές

Το gRPC υποστηρίζει τη χρήση αναχαιτιστών για το αίτημα / απόκριση. Οι αναχαιτιστές, λοιπόν, παρακολουθούν μηνύματα και σας επιτρέπουν να τα τροποποιήσετε.

Αυτό ακούγεται οικείο; Εάν έχετε παίξει με διαδικασίες HTTP σε ένα REST API, οι αναχαιτιστές είναι πολύ παρόμοιοι με το middleware.

Οι βιβλιοθήκες gRPC συνήθως υποστηρίζουν αναχαιτιστές και επιτρέπουν εύκολη εφαρμογή. Οι αναχαιτιστές συνήθως χρησιμοποιούνται για:

  • Τροποποιήστε το αίτημα / απάντηση πριν μεταβείτε. Μπορεί να χρησιμοποιηθεί για την παροχή υποχρεωτικών πληροφοριών πριν αποσταλεί στον πελάτη / διακομιστή.
  • Σας επιτρέπει να χειριστείτε κάθε κλήση λειτουργίας, όπως η προσθήκη επιπλέον καταγραφής για παρακολούθηση του χρόνου απόκρισης.

Φόρτωση εξισορρόπησης

Εάν δεν είστε ήδη εξοικειωμένοι με την εξισορρόπηση φορτίου, είναι ένας μηχανισμός που επιτρέπει στα αιτήματα των πελατών να εξαπλωθούν σε πολλούς διακομιστές.

Αλλά η εξισορρόπηση φορτίου γίνεται συνήθως σε επίπεδο διακομιστή μεσολάβησης (για παράδειγμα, NGINX). Γιατί λοιπόν το μιλάω εδώ;

Αποδεικνύεται ότι το gRPC υποστηρίζει μια μέθοδο εξισορρόπησης φορτίου από τον πελάτη. Έχει ήδη εφαρμοστεί στη βιβλιοθήκη Golang και μπορεί να χρησιμοποιηθεί με ευκολία.

Ενώ μπορεί να φαίνεται σαν μια τρελή μαγεία, δεν είναι. Υπάρχει κάποιο είδος επίλυσης DNS για να λάβετε μια λίστα IP και έναν αλγόριθμο εξισορρόπησης φορτίου.

Ακύρωση κλήσης

Οι πελάτες gRPC μπορούν να ακυρώσουν μια κλήση gRPC όταν δεν χρειάζονται πλέον απάντηση. Ωστόσο, η επαναφορά από την πλευρά του διακομιστή δεν είναι δυνατή.

Αυτή η λειτουργία είναι ιδιαίτερα χρήσιμη για ροή στην πλευρά του διακομιστή όπου ενδέχεται να προέρχονται πολλαπλά αιτήματα διακομιστή. Η βιβλιοθήκη gRPC διαθέτει ένα μοτίβο μεθόδου παρατηρητή για να γνωρίζει αν ένα αίτημα ακυρώνεται και επιτρέπει την ακύρωση πολλαπλών αντίστοιχων αιτημάτων ταυτόχρονα.

Τυλίγοντας

Χάθηκε στο διάστημα και στο χρόνο

Όλα όσα μοιράστηκα σήμερα απλώς γρατσουνίζουν την επιφάνεια του gRPC, τι είναι ικανό και περίπου πώς λειτουργεί.

Ελπίζω πραγματικά ότι αυτό το άρθρο σας βοήθησε να κατανοήσετε περισσότερα σχετικά με το gRPC. Αλλά υπάρχει ακόμα πολύ περισσότερα να μάθετε, οπότε μην σταματήσετε εδώ! Συνεχίστε να σκάβετε.

Ευχαριστώ για την ανάγνωση!