Ir para o conteúdo

Thrift

RPC: Thrift

Thrift

Instalação

  • Baixe e compile o thrift
  • ou instale-o usando apt-get, por exemplo. apt-get install thrift-compiler
  • execute "thrift" na linha de comando.
  • Para thrift com Java, também precisarão dos seguintes arquivos
  • slf4j
  • libthrift0.13.0.jar
  • coloque-os na pasta jars

IDL Thrift

  • Serviços
    1
    2
    3
    4
    5
    service ChaveValor {
        void set(1:i32 key, 2:string value),
        string get(1:i32 key) throws (1:KeyNotFound knf),
        void delete(1:i32 key)
    }
    
  • Não se pode retornar NULL!!!
  • Exceções
    1
    2
    3
    4
    exception KeyNotFound {
       1:i64 hora r,
       2:string chaveProcurada="thrifty"
    }
    

Exemplo: chavevalor.thrift

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
namespace java chavevalor
namespace py chavevalor


exception KeyNotFound
{
}


service ChaveValor
{
    string getKV(1:i32 key) throws (1:KeyNotFound knf),
    bool setKV(1:i32 key, 2:string value),
    void delKV(1:i32 key)
}  

Compilação

thrift --gen java chavevalor.thrift

thrift --gen py chavevalor.thrift

ChaveValorHandler.java

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
namespace java chavevalor
namespace py chavevalor


exception KeyNotFound
{
}


service ChaveValor
{
    string getKV(1:i32 key) throws (1:KeyNotFound knf),
    bool setKV(1:i32 key, 2:string value),
    void delKV(1:i32 key)
}  

package chavevalor;

import org.apache.thrift.TException;
import java.util.HashMap;
import chavevalor.*;

public class ChaveValorHandler implements ChaveValor.Iface {
   private HashMap<Integer,String> kv = new HashMap<>();
   @Override
   public String getKV(int key) throws TException {
       if(kv.containsKey(key))
          return kv.get(key);
       else
          throw new KeyNotFound();
   }
   @Override
   public boolean setKV(int key, String valor) throws TException {
       kv.put(key,valor);
       return true;
   }
   @Override
   public void delKV(int key) throws TException {
       kv.remove(key);
   }    
}

Arquitetura

  • Runtime library -- componentes podem ser selecionados em tempo de execução e implementações podem ser trocadas
  • Protocol -- responsável pela serializaçãoo dos dados
    • TBinaryProtocol
    • TJSONProtocol
    • TDebugProtocol
    • ...
  • Transport -- I/O no ``fio''
    • TSocket
    • TFramedTransport (non-blocking server)
    • TFileTransport
    • TMemoryTransport
  • Processor -- Conecta protocolos de entrada e saída com o handler

  • Handler -- Implementação das operações oferecidas

  • Server -- Escuta portas e repassa dados (protocolo) para o processors
    • TSimpleServer
    • TThreadPool
    • TNonBlockingChannel

Classpath

1
2
3
javac  -cp jars/libthrift0.9.3.jar:jars/slf4japi1.7.21.jar:gen-java  -d . *.java 
java -cp jars/libthrift0.9.3.jar:jars/slf4japi1.7.21.jar:gen-java:. chavevalor.ChaveValorServer
java -cp jars/libthrift0.9.3.jar:jars/slf4japi1.7.21.jar:gen-java:. chavevalor.ChaveValorClient