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