Начало работы с Thrift и реализация простой демонстрации на Java

RPC

Пример кода для этой статьи:гитхаб-портал

Эта статья не интегрирована с загрузкой Spring, реализована только демо.Вы можете использовать классы в этой статье как bean-компоненты в Spring.

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

Введение

Наконец-то я сменил работу с написания Http-интерфейса на написание RPC-интерфейса (улыбается).

Поэтому мне нужно узнать о структуре RPC, почемуThriftвместоDubboили другое, потому что работа используетThrift, так что изучите это в первую очередь.

Введение в бережливость (из Википедии)

Thrift — это язык описания интерфейса и двоичный протокол связи[1], который используется для определения и создания межъязыковых сервисов. [2] Он используется в качестве среды удаленного вызова процедур (RPC) и был разработан Facebook для «крупномасштабной разработки межъязыковых сервисов». Он объединяет программный стек с механизмом генерации кода для создания различных степеней бесшовных межплатформенных эффективных сервисов с использованием C#, C++ (на основе систем, совместимых с POSIX [3]), Cappuccino, [4] Cocoa, Delphi, Erlang, Go, Haskell, Java, Node.js, OCaml, Perl, PHP, Python, Ruby и Smalltalk. [5] Хотя ранее он был разработан Facebook, теперь это проект с открытым исходным кодом Apache Software Foundation. Реализация была описана в техническом документе, опубликованном Facebook в апреле 2007 г., который сейчас размещается на Apache.

подробные шаги

1. Установите экономию

Здесь указан только способ установки Mac OS, а другие платформы можно поискать в Интернете.

Выполнить в оболочке:

brew install thrift.

Если brew не установлен, настоятельно рекомендуется его установить.

Команда установки:

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

2. Новый проект

Создайте новый проект maven иpom.xmlДобавьте следующие зависимости в .

    <dependency>
      <groupId>org.apache.thrift</groupId>
      <artifactId>libthrift</artifactId>
      <version>0.12.0</version>
    </dependency>

3. Определите файл интерфейса

Примечание: Конкретный синтаксис файла thrift здесь не поясняется, он относительно прост, в приложение добавлены только некоторые часто используемые типы заметок.Друзья, кому это нужно, могут просмотреть его прямо в конце статьи.

Вот демонстрация, мы определяем два интерфейса, один для запроса пользователя в соответствии с идентификатором, а другой — для определения того, существует ли пользователь.

namespace java thrift_demo

service  UserService {
  string getName(1:i32 id)
  bool isExist(1:string name)
}

4. Сгенерируйте файлы Java в соответствии с определением интерфейса.

введите в командной строкеuser.thriftкаталог, а затем выполнитьthrift -r -gen java user.thrift.

Вы обнаружите, что он создается в текущем каталогеgen-javaпапку, поместитеuserServiceСкопируйте файл в каталог проекта.

Этот файл определяет接口,入参,出参, — это файл, используемый клиентом и сервером, а также важная часть системы бережливости.

5. Напишите конкретную реализацию сервера.

Сервер должен реализоватьUserServiceсерединаUserService.IfaceИнтерфейс предоставляет для этого конкретную бизнес-логику.

код показывает, как показано ниже:

package thrift_demo.server;

import org.apache.thrift.TException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import thrift_demo.UserService;

/**
 * Created by pfliu on 2019/03/28.
 */
public class UserServiceImpl implements UserService.Iface {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    private final static String HUYANSHI = "HUYANSHI";

    @Override
    public String getName(int id) throws TException {
        logger.info("received getName, id = {}:", id);
        return HUYANSHI;
    }

    @Override
    public boolean isExist(String name) throws TException {
        logger.info("receive isExist, name = {}", name);
        return HUYANSHI.equals(name);
    }
}

6. Напишите класс запуска сервера

Класс запуска службы не задействует бизнес-логику, а просто вызывает некоторые методы бережливости для прослушивания порта tcp.2345порт.

package thrift_demo.server;

import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TThreadPoolServer;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TServerTransport;
import org.apache.thrift.transport.TTransportFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import thrift_demo.UserService;

/**
 * Created by huyanshi on 2019/03/28.
 */
public class Server {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    private void startServer() {
        UserService.Processor processor = new UserService.Processor<UserService.Iface>(new UserServiceImpl());
        try {
            TServerTransport transport = new TServerSocket(2345);
            TThreadPoolServer.Args tArgs = new TThreadPoolServer.Args(transport);
            tArgs.processor(processor);
            tArgs.protocolFactory(new TBinaryProtocol.Factory());
            tArgs.transportFactory(new TTransportFactory());
            tArgs.minWorkerThreads(10);
            tArgs.maxWorkerThreads(20);
            TServer server = new TThreadPoolServer(tArgs);
            server.serve();
        } catch (Exception e) {
            logger.error("thrift服务启动失败", e);
        }
    }

    public static void main(String[] args) {
        Server server = new Server();
        server.startServer();
    }
}

Приведенная выше реализация является однопоточной, только для демонстрации, и во многих случаях ежедневно запускается несколько потоков.

7. Напишите клиентский код

Код клиента относительно прост, достаточно создать клиент для вызова соответствующего метода.

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

package thrift_demo.client;

import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.*;
import thrift_demo.UserService;

/**
 * Created by huyanshi on 2019/03/28.
 */
public class Client {
    private static final String SERVER_IP = "localhost";
    private static final int SERVER_PORT = 2345;//Thrift server listening port
    private static final int TIMEOUT = 3000;

    private void startClient(String userName) {
        TTransport transport = null;
        try {
            transport = new TSocket(SERVER_IP, SERVER_PORT, TIMEOUT);
            // 协议要和服务端一致
            TProtocol protocol = new TBinaryProtocol(transport);
            UserService.Client client = new UserService.Client(protocol);
            transport.open();
            System.out.println(client.getName(1));
            System.out.println(client.isExist("haha"))
        } catch (TTransportException e) {
            e.printStackTrace();
        } catch (TException e) {
            e.printStackTrace();
        } finally {
            if (null != transport) {
                transport.close();
            }
        }
    }

    public static void main(String[] args) {
        Client client = new Client();
        client.startClient("Tom");
    }

}

8. Запустите сервер

Вы можете видеть, что приведенный выше класс запуска сервера являетсяmainКласс метода, вы можете запустить его напрямую.

9. Запустите клиент для тестирования.

То же, что и выше, только начните.

Вы можете проверить, соответствуют ли бревна на обоих концах ожиданиям по отдельности.

Суммировать

Все шаги в предыдущей статье проверены, и следующий шаг - анализ потока сознания.Так как я тоже связался с бережливостью в первый день, то не факт, что он будет правильным, просто взгляните.

Что такое RPC Удаленные вызовы процедур, мы надеемся, что сможем вызывать удаленные методы так же, как и локальные.

Процесс выглядит следующим образом:

2019-03-29-09-36-07

Это слишком большая проблема, поэтому существует RPC-фреймворк, цель RPC-фреймворка — инкапсулировать все остальные шаги, кроме желтой части, чтобы остальные шаги, кроме первого и последнего шагов, были невидимы.

Как этого добиться? (Предупреждение о суровом потоке сознания, теперь я это знаю, я вернусь и изменю его после того, как закончу пощечину)

Из того, что я знаю о бережливости на данный момент:

  1. Определите файл интерфейса, thrift генерирует классы Java.Этот класс принадлежит и используется клиентом и сервером.
  2. Сервер делает конкретную реализацию в соответствии с интерфейсом, определенным в файле.
  3. Клиент подключается к серверу, вызывает клиентский метод в файле, а thrift отвечает за сериализацию, десериализацию, отражение и др. Получаем результат.

Пример кода для этой статьи:гитхаб-портал

Справочная статья

woo woo woo.cn blog on.com/short-term Earing/afraid/55…

zh.wikipedia.org/wiki/Thrift

приложение

  • основной тип:
    • bool: логическое значение, true или false, соответствующее логическому значению Java.
    • байт: 8-битное целое число со знаком, соответствующее байту Java
    • i16: 16-битное целое число со знаком, соответствующее короткому
    • i32: 32-битное целое число со знаком, соответствующее int в Java.
    • i64: 64-битное целое число со знаком, соответствующее длинному
    • double: 64-битное число с плавающей запятой, соответствующее double в Java
    • строка: строка в кодировке utf-8, соответствующая строке Java.
  • Тип структуры:
    • struct: определяет общедоступный объект, аналогичный определению структуры в языке C, и является JavaBean в Java.
  • Тип контейнера:
    • список: ArrayList, соответствующий Java
    • set: HashSet, соответствующий Java
    • карта: HashMap, соответствующая Java
  • Тип исключения:
    • исключение: исключение, соответствующее Java
  • Тип Обслуживания:
    • сервис: класс соответствующего сервиса




ChangeLog

2019-03-28 Завершено

Все вышеизложенное является личными мыслями, если есть какие-либо ошибки, пожалуйста, исправьте их в комментариях.

Добро пожаловать на перепечатку, пожалуйста, подпишите и сохраните исходную ссылку.

Контактный адрес электронной почты: huyanshi2580@gmail.com

Дополнительные заметки об обучении см. в личном блоге ------>Хуян тен