Статьи

Apache Thrift с Java быстрый старт

Apache Thrift — это RPC-фреймворк, основанный Facebook, и теперь это проект Apache. Thrift позволяет определять типы данных и интерфейсы служб в файле определения, не зависящего от языка. Этот файл определения используется в качестве входных данных для компилятора для генерации кода для создания клиентов RPC и серверов, которые взаимодействуют на разных языках программирования. Вы также можете сослаться на Thrift white paper .

Согласно официальному веб-сайту, Apache Thrift представляет собой программную среду, предназначенную для разработки масштабируемых межъязыковых сервисов, которая объединяет программный стек с механизмом генерации кода для создания сервисов, которые работают эффективно и без проблем между C ++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C #, Какао, JavaScript, Node.js, Smalltalk, OCaml и Delphi и другие языки. Изображение предоставлено Википедией

Установка Apache Thrift в Windows

Установка Thrift может быть утомительным процессом. Но для Windows компилятор доступен в виде готового exe. Загрузите thrift.exe и добавьте его в переменные среды.

Написание файла определения Thrift (.thrift file)

Написание файла определения Thrift становится действительно легким, когда вы привыкнете к нему. Я нашел этот учебник довольно полезным для начала.

Пример файла определения (add.thrift)

1
2
3
4
5
6
7
namespace java com.eviac.blog.samples.thrift.server  // defines the namespace
 
typedef i32 int  //typedefs to get convenient names for your types
 
service AdditionService {  // defines the service to add two numbers
        int add(1:int n1, 2:int n2), //defines a method
}

Компиляция файла определения Thrift

Чтобы скомпилировать файл .thrift, используйте следующую команду.

1
thrift --gen <language> <Thrift filename>

Для моего примера команда

1
thrift --gen java add.thrift

После выполнения команды в каталоге gen-java вы найдете исходные коды, которые полезны для построения RPC-клиентов и серверов. В моем примере это создаст код Java под названием AdditionService.java

Написание сервисного обработчика

Класс обработчика службы необходим для реализации интерфейса AdditionService.Iface .

Пример обработчика службы (AdditionServiceHandler.java)

01
02
03
04
05
06
07
08
09
10
11
12
package com.eviac.blog.samples.thrift.server;
 
import org.apache.thrift.TException;
 
public class AdditionServiceHandler implements AdditionService.Iface {
 
 @Override
 public int add(int n1, int n2) throws TException {
  return n1 + n2;
 }
 

Написание простого сервера

Ниже приведен пример кода для запуска простого благотворительного сервера. Чтобы включить многопоточный сервер, раскомментируйте закомментированные части примера кода.

Пример сервера (MyServer.java)

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package com.eviac.blog.samples.thrift.server;
 
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TServerTransport;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TServer.Args;
import org.apache.thrift.server.TSimpleServer;
 
public class MyServer {
 
 public static void StartsimpleServer(AdditionService.Processor<AdditionServiceHandler> processor) {
  try {
   TServerTransport serverTransport = new TServerSocket(9090);
   TServer server = new TSimpleServer(
     new Args(serverTransport).processor(processor));
 
   // Use this for a multithreaded server
   // TServer server = new TThreadPoolServer(new
   // TThreadPoolServer.Args(serverTransport).processor(processor));
 
   System.out.println("Starting the simple server...");
   server.serve();
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
  
 public static void main(String[] args) {
  StartsimpleServer(new AdditionService.Processor<AdditionServiceHandler>(new AdditionServiceHandler()));
 }
 
}

Написание клиента

Ниже приведен пример кода Java-клиента, который использует сервис, предоставляемый AdditionService.

Пример клиентского кода (AdditionClient.java)

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.eviac.blog.samples.thrift.client;
 
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.TTransportException;
 
public class AdditionClient {
 
 public static void main(String[] args) {
 
  try {
   TTransport transport;
 
   transport = new TSocket("localhost", 9090);
   transport.open();
 
   TProtocol protocol = new TBinaryProtocol(transport);
   AdditionService.Client client = new AdditionService.Client(protocol);
 
   System.out.println(client.add(100, 200));
 
   transport.close();
  } catch (TTransportException e) {
   e.printStackTrace();
  } catch (TException x) {
   x.printStackTrace();
  }
 }
 
}

Запустите код сервера (MyServer.java). Он должен вывести следующее и будет слушать запросы.

1
Starting the simple server...

Затем запустите клиентский код (AdditionClient.java). Это должно вывести следующее.

1
300

Ссылка: Apache Thrift с кратким описанием Java от нашего партнера JCG Павитры Сиривардены в блоге EVIAC .