Introduction à Thrift
1. Qu'est-ce que Thrift ?
Thrift a été développé au début par l'équipe interne de Facebook. Il est principalement utilisé pour implémenter des appels de méthode dans plusieurs langues. Appel de méthode Plus tard, l’open source a été incorporé à Apache et est devenu le projet Apache Thrift.
Thrift permet de définir des types de données et des interfaces de service dans un simple fichier de définition en tant que fichier d'entrée, et le compilateur génère du code pour générer facilement une communication client et serveur RPC pour des langages de programmation croisés transparents.
2. Qu'est-ce que RPC ?
RPC (Remote Procedure Call Protocol), protocole d'appel de procédure à distance.
En termes simples, RPC consiste à appeler une autre machine (serveur) à partir d'une machine (client) en passant des paramètres Une fonction ou une méthode et obtenez le. résultat renvoyé.
RPC masquera les détails de la communication sous-jacente (pas besoin de gérer directement la communication Socket ou la communication Http). RPC est un modèle de réponse à une demande.
Le client initie une requête et le serveur renvoie une réponse (de la même manière que le fonctionnement de Http est utilisé pour appeler des fonctions (ou méthodes) distantes, tout comme pour appeler des fonctions (ou méthodes) locales.
Structure de la pile d'épargne
Type de données d'épargne
Type de base :
bool : valeur booléenne, vraie ou fausse, correspondant au booléen
octet de Java : entier signé de 8 bits, correspondant à l'octet de Java
i16 : entier signé de 16 bits, correspondant au court
i32 de Java : 32 entier signé en bits, correspondant à l'int
i64 de Java : entier signé de 64 bits, correspondant au long
double de Java : nombre à virgule flottante de 64 bits, correspondant à la chaîne double
de Java : texte d'encodage inconnu ou chaîne binaire , correspondant au type de structure String
de Java :
struct : définit un objet public, similaire à la définition de structure en langage C. En Java, il s'agit d'un conteneur JavaBean
. tapez :
list : correspond à l'ArrayList de Java
set : correspond au HashSet de Java
map : correspond au HashMap de Java
Type d'exception :
exception : Exception correspondant à Java
Type de service:
service : Classe correspondant au service
Générer du code java thrift
http://thrift . apache.org/download
namespace java service.demo service Hello{ string helloString(1:string para) i32 helloInt(1:i32 para) bool helloBoolean(1:bool para) void helloVoid() string helloNull() }
Contenu Hello.java
(1) Classe client asynchrone AsyncClient et interface asynchrone AsyncIface
(2) Classe client synchrone Client et interface synchrone Iface La classe Client hérite de TServiceClient et implémente l'interface synchrone Iface Elle est générée ; basé sur la fonction d'interface définie dans le fichier thrift ; la classe Client est utilisée lors du développement de programmes clients Thrift. La classe Client est l'implémentation du stub client d'Iface. Iface est utilisée lors du développement du serveur Thrift. Le programme doit. implémenter l'interface Iface.
(3) Classe de processeur, cette classe est principalement utilisée lors du développement de programmes serveur Thrift. Cette classe définit une carte en interne, qui enregistre le mappage de tous les noms de fonction aux objets de fonction. Une fois que Thrift reçoit une demande d'appel de fonction, recherchez simplement le. objet fonction de la fonction à partir de la carte selon le nom de la fonction, puis exécutez-le ;
(4) Classe de paramètres, définissez une classe de paramètres pour chaque fonction d'interface, par exemple : générer une classe de paramètres pour l'interface helloInt : helloInt_args , Généralement, la méthode de dénomination de la classe de paramètres de fonction d'interface est : interface function name_args;
(5) Classe de valeur de retour. Chaque fonction d'interface définit une classe de valeur de retour, par exemple : une classe de valeur de retour est générée pour l'interface helloInt : helloInt_result. Généralement, la méthode de dénomination de la classe de valeur de retour de la fonction d'interface est : interface function name_result;
Il existe des opérations de lecture et d'écriture sur les données dans la classe de paramètres et la classe de valeurs de retour, La classe de paramètres appelée. le nom de la fonction et les paramètres sont encapsulés selon la classe de protocole. Dans la classe de valeur de retour, les données seront lues conformément aux réglementations du protocole.
Client
Iface
HelloServiceImpl
Processus d'appel
Au cours du processus d'appel Thrift, les trois classes principales de la classe de couche de transport, de la classe de couche de protocole et de la classe de traitement sont principalement utilisées entre le client et le serveur Thrift. les classes coopèrent entre elles pour terminer l'ensemble du processus d'appel de rpc
(1) Transmettez le nom de la fonction et les paramètres appelés par le programme client à la couche de protocole (TProtocol), et la couche de protocole encapsule le nom de la fonction et paramètres selon le format du protocole, puis le résultat encapsulé est transmis à la couche de transport inférieure. Notez ici : le type de protocole utilisé par le programme du serveur Thrift doit être le même, sinon le programme du serveur Thrift ne pourra pas analyser les données au niveau de sa couche de protocole
(2) La couche de transport (TTransport) traite les données transmises ; par la couche protocole, par exemple, la classe d'implémentation TFramedTransport de la couche transport encapsule les données dans une trame, c'est-à-dire « longueur des données + contenu des données », puis envoie les données traitées au serveur Thrift via le réseau ; vous devez également faire attention ici : vous devez communiquer avec le serveur Thrift. La classe d'implémentation de la couche de transport utilisée par le programme est cohérente, sinon la couche de transport de Thrift ne peut pas traiter les données à l'envers
(3) Le serveur Thrift reçoit ; les données de demande d'appel transmises sur le réseau via la couche transport (TTransport), puis traitement inverse des données reçues. Par exemple, la classe d'implémentation TFramedTransport de la couche transport convertit les données réseau sous la forme de « longueur des données + contenu des données ». sous la forme d'un contenu de données uniquement, puis le transmet à la classe de protocole (TProtocol) du serveur Thrift );
(4) La classe de protocole (TProtocol) du serveur Thrift décapsule les données traitées par la couche de transport. selon le protocole, et transmet les données décapsulées à la classe Processor pour traitement
( 5) La classe Processor du serveur Thrift trouve l'objet fonction correspondant au nom de la fonction en fonction du résultat de la couche de protocole ; (TProtocol) analyse ;
(6) Le serveur Thrift utilise les paramètres transmis pour appeler l'objet fonction trouvé
(7) Le serveur Thrift fournit le résultat de l'exécution de l'objet fonction à la couche de protocole ; (8) La couche de protocole du serveur Thrift encapsule le résultat de l'exécution de la fonction
(9) La couche de transport du serveur Thrift Traite les résultats encapsulés de la couche de protocole, par exemple en les encapsulant dans des trames, puis envoie au programme client Thrift ;
(10) La couche de transport du programme client Thrift traite à l'envers les résultats du réseau reçus pour obtenir les données de protocole réelles ;
(11) La couche de protocole du client Thrift décapsule les données en fonction au format du protocole, puis obtient le résultat d'exécution de la fonction spécifique et le transmet à la fonction appelante ;
Serveur
Client
Résultats de sortie
Protocoles et méthodes de transmission
Thrift permet aux utilisateurs de choisir le type de protocole de communication de transmission entre le client et le serveur. Le protocole de transmission est généralement divisé en protocoles de transmission texte et binaire afin d'économiser la bande passante et d'améliorer l'efficacité de la transmission. De manière générale, la plupart des protocoles de transmission de type binaire sont utilisés, et parfois des protocoles basés sur du texte sont également utilisés. Cela doit être basé sur les besoins réels du projet/produit. Les protocoles couramment utilisés sont les suivants :TBinaryProtocol : le protocole par défaut de Thrift, qui utilise un format de codage binaire pour la transmission de données, envoyant essentiellement des données brutes directement.
TCompactProtocol : protocole de transmission de données compressé et dense, basé sur le codage en zigzag de Variable-length Quantity. format
TJSONProtocol : transmission de données à l'aide du protocole d'encodage de données JSON (JavaScript Object Notation)
TDebugProtocol : souvent utilisé pour les tests par les codeurs, présenté sous forme de texte pour une lecture facile
Couches de transport couramment utilisées inclure les éléments suivants : TSocket - utilise le blocage des E/S pour la transmission, qui est le mode le plus courant
TFramedTransport - utilise le mode non bloquant pour transmettre par taille de bloc, similaire à NIO en Java
TNonblockingTransport - utilisation d'une méthode non bloquante pour créer des clients asynchrones
TServerSocket : socket non bloquant, utilisé côté serveur, les types de socket acceptés sont tous TSocket (c'est-à-dire un socket de type bloquant)
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!