Согласно официальному веб-сайту, 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 typesservice 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 .
