Обзор
С непрерывным расширением бизнеса и все более и более разнообразными операционными действиями, первоначальный метод разработки интерфейсов для обеспечения бизнес-интерфейсов является дорогостоящим для деятельности, жизненный цикл которой может составлять всего несколько дней. Xianyu предпринял некоторые попытки и практики для снижения затрат на разработку и повышения общей эффективности. В этой статье представлены исследования и попытки Xianyu с точки зрения агрегации данных, а внедрение Graphql повысило эффективность исследований и разработок Xianyu.
задний план
В течение долгого времени front-end и back-end разработка сталкивались с противоречием: front-end надеется, что страница получает только структурированные данные и может напрямую отображать компоненты страницы; back-end надеется только на предоставление возможностей API-сервиса в бизнес-поле, а сборка и обработка данных выполняются интерфейсом. Малоценная работа, такая как имитация данных и совместная отладка, будет стоить дорого, а исходная модель разработки уже не сможет поспевать за ритмом быстрого развития бизнеса. Поэтому мы надеемся, что фронтенд сможет напрямую получать данные, а бэкэнд сможет освободиться от повторяющихся малоценных потребительских разработок.
Агрегация данных — это идея, которую мы решаем.
1. Решения для агрегации данных
агрегация данныхОн заключается в объединении нескольких служебных запросов на сервер, и сервер одновременно возвращает результат соответствующего запроса.Этот метод может сократить время сети и сделать обработку данных более удобной. Существует также возможность расширения синтаксиса входных параметров, таких как зависимые вызовы и т. д., что является более гибким и эффективным методом запроса, чем RESTFul.
При вызове агрегации данных, поскольку интерфейсы бизнес-домена сервера уже существуют, эти интерфейсы считаются надежными, и стоимость совместной отладки будет значительно снижена.В некоторых нештатных ситуациях в тестовой среде внешний интерфейс может даже быть проверено прямо в сети.
Принципы дизайна
-
Сервер предоставляет службы данных для распространенных сценариев, то есть стандартные бизнес-API, включая запрос данных и запись;
-
Взаимодействуйте с интерфейсом как можно меньше, получайте все необходимые данные за один вызов
-
Параллельные/асинхронные вызовы сокращают затраты времени
2. Агрегация данных 1.0
Сервер Xianyu разработал первую службу агрегации данных. Предоставляя доступ к базовым службам и вызывая определенные интерфейсы служб одновременно из общей записи запроса, несколько запросов службы на странице могут возвращать все данные во внешний интерфейс одновременно. Процесс вызова выглядит следующим образом:
Эта структура имеет следующие характеристики:
-
очень легкий, около 1000 строк основного кода
-
децентрализацияРазвертывание непосредственно в системе приложений, не полагаясь на другие сторонние пакеты и сервисные системы,
-
взлом без кода, не нужно модифицировать и адаптировать существующие системные сервисы и коды, достаточно зарегистрировать сервис в реестре
-
Все одновременные вызовы, несколько вызываемых сервисных API вызываются одновременно, что занимает меньше времени. Кроме того, мы расширили его синтаксическую структуру и функции: поддержка выбора полей, вызов зависимостей, циклическая проверка зависимостей, псевдонимы и другие функции:
2.1 Онлайн-эффект
В течение полугода после запуска служба агрегации данных поддержала запуск более 30 страниц, что составляет более 80 % аналогичных потребностей, сократив затраты на разработку с обеих сторон более чем на 50 %.
2.2 После запуска службы агрегации Xianyu в сети возникают следующие проблемы:
-
Структура ответа данных недостаточно удобна для вызывающей стороны. Хотя она поддерживает зависимые вызовы, возвращаемые данные представляются в плоской форме представления. Для некоторых пакетных интерфейсов возвращаемая структура часто является структурой Map, которая требует дальнейшей обработки вызывающей стороной и увеличивает сложность. ;
-
проблемы с безопасностью. Строка запроса многозапроса не зашифрована, некоторые незаконные запросы могут изменить оператор запроса и привести к системным рискам, а для некоторых конфиденциальных данных, которые необходимо зашифровать или сделать нечувствительными, в структуре синтаксиса многозапроса отсутствуют точки расширения обработки данных.
-
Система R&D несовершенна: отсутствие метаинформации об услугах, так что вызывающий абонент не знает, какую услугу использовать, каковы входные и выходные данные, и существует определенная стоимость связи между двумя сторонами. Без поддержки IDE писать сложнее.
3. GraphQL — собирать данные как писать sql
3.1 Что такое Graphql
Graphql (https://graphql.org) — это язык запросов данных, запущенный facebook. Его цель разработки — отделить нестабильную часть сборки данных от стабильной логики бизнес-данных, продвинуть вперед логику управления данными и разработать Режим изменен от «отправки данных» к «получению данных».
Преимущества Graphql:
-
Четкая структура: то, что вы видите, это то, что вы получаете, структуры ввода и вывода согласованы, и какие поля данных необходимы во внешнем интерфейсе, просто заполните поля в ql и поддержите многоуровневую структуру, а также может быть отображается горизонтально, и вызывающий абонент выбирает соответствующий вывод в соответствии с бизнес-формой.
-
Уточнение управления сценами: даже в похожих сценах требуемые данные могут не совпадать, и никакие данные в graphql не являются избыточными.
-
Сильная масштабируемость обработки данных: graphql предоставляет множество директив для удовлетворения повседневных потребностей разработки и даже поддерживает код js, разработчики также могут настраивать набор библиотек инструментов для расширения
3.2 Преобразование приложения доступа GraphQL
Xianyu выбрал TQL в качестве серверной реализации Graphql. Tql — это Java-реализация GraphQL, предоставленная Taobao, которая устраняет многие ограничения и болевые точки версии graphql с открытым исходным кодом и предоставляет множество функций, так что graphql можно развертывать в приложениях по низкой цене.
-
Легкий доступ и низкий уровень вторжения кода: Децентрализованный дизайн, не полагается на сторонние сервисы, система приложений напрямую вводит доступные
-
Поддержка системы НИОКР: Предоставляет онлайн-среду IDE, написанную QL, которая может отображать метаинформацию о каждой службе, повышать эффективность разработки, писать подсказки, выполнять трудоемкие журналы, отслеживать сцены вызовов и другие функции для облегчения оптимизации производительности службы.
-
Несколько стратегий исполнения:Предоставляет стратегии параллельного выполнения и стратегии асинхронного выполнения для обеспечения эффективной работы ql в сценариях мультисервисного вызова и иерархического вызова;
-
Объединить вызовы:Элементы в зависимых восходящих наборах данных объединяются перед выполнением, так что мы можем в полной мере использовать запросы пакетного интерфейса, а не одиночные множественные вызовы, производительность значительно повышается.
-
Улучшение безопасности: оператор graphql запрашивается из внешнего интерфейса на сервер, а подпись используется для предотвращения подделки строки запроса.
3.2.1 Трансформация сервера
-
Унифицированный интерфейс запросов graphql
-
Оригинальная служба бизнес-домена обертывает функцию GraphQL.
Преобразование входных параметров функции: параметры службы в фоновом режиме могут отличаться от внешнего интерфейса (слишком много параметров, параметры, влияющие на данные и т. д.).
Непакетный вывод функции: как правило, модификация не требуется, как указано выше.
Поддержка преобразования пакетной функции, возвращаемая структура должна быть упорядоченным списком
Нестандартные параметры DO: поскольку вывод представляет собой JSON, произойдет переполнение стека, когда объект java с циклическими зависимостями выводится с использованием fastjson.
Разработка API-интерфейсов GraphQL
В следующем примере может быть предоставлен Graphql API. Аннотация @GraphQLDataFetcher указывает, что этот метод можно использовать в качестве источника данных Graphql, supportBatch = true указывает, что поддерживаются вызовы слияния, а результаты зависимых данных будут объединены в список в качестве входных параметров перед выполнением;
@GraphQLDataFetcher(supportBatch = true)
@GraphQLDescription("查询用户信息")
public List<BaseUserDO> userInfos(List<Long> userIds){
ResultDO<List<BaseUserDO>> users = readServiceClient.getBaseUserListByUserIds(StringUtils.join(userIds,","));
List<BaseUserDO> userDOList = users.getModule();
//按入参userId的顺序排序
return ObjectUtils.collectionOrder(userIds,users.getModule(),BaseUserDO::getUserId);
}
скопировать код
Поддержка вызовов слияния требует от нас гарантировать две вещи:
-
Длина входных идентификаторов пользователей такая же, как и длина возвращаемого списка, в противном случае он не может быть заполнен обратно в соответствующее поле;
-
Порядок возвращаемых данных должен соответствовать порядку входных параметров, иначе это приведет к ошибкам данных.
Единый API шлюза graphql
//requestString 查询ql语句,ql参数arguments,declaredVariables声明变量,context包含执行策略等
public ExecutionResult execute(String requestString, Map<String, Object> arguments, Set<String> declaredVariables, Object context) {
return execute(requestString, arguments, declaredVariables, context,false);
}
скопировать код
При выполнении будет автоматически введена глобальная информация текущего запроса, такая как пользователь для входа в систему, идентификатор устройства, модель устройства и т. д. Например, UserAgent может получить модель пользователя, систему и другую информацию и может использоваться напрямую без дополнительная внешняя и внутренняя обработка.
3.2.2 Преобразование вызовов во внешнем интерфейсе
-
Интерфейс вызова изменен на унифицированный интерфейс graphql, предоставляемый серверной частью.
-
Используйте синтаксис graphql для выражения необходимых данных в соответствии с бизнес-требованиями.
Вызов API шлюза graphql:
//graphqlAPI调用接口,query:ql查询语句,param ql参数
request(graphqlAPI,query,param);
скопировать код
Напишите запрос GraphQL для получения структурированных данных:
С увеличением количества интерфейсных команд и потока персонала мы выдвинули более высокие требования к стоимости обучения Graphql, повторному использованию и управлению ql.
4. Платформа управления GraphqlQL
Платформа управления предоставляет разработчикам множество удобств. Онлайн-редактирование и сохранение ql, онлайн-отладка, мгновенный выпуск, несколько человек могут видеть, есть примеры ссылок, что снижает стоимость обучения graphql.
public Result<Map<String, Object>> getDataById(Long id, String arguments) {
return this.getAppDataById(this.chordProperties.getApp(), id, arguments);
}
скопировать код
Внешнему интерфейсу нужно только передать соответствующий идентификатор при запросе страницы, и оператор запроса graphql больше не требуется.
//graphqlAPI调用接口,id:ql语句id,param ql参数
request(graphqlAPI,id,param);
скопировать код
Изменения, внесенные GraphQL в Xianyu
Снижение затрат на НИОКР
После внедрения Graphql затраты на исследования и разработки с обеих сторон значительно сокращаются, а общее время запуска операционных сценариев значительно сокращается.В большинстве случаев стоимость сервера равна нулю. Внешний интерфейс может занять всего 10 минут, чтобы написать оператор graphql + самопроверка.
GraphqlQL можно прекрасно комбинировать с платформами для построения страниц, такими как TMS. Многие компоненты страницы были выполнены на основе GraphqlQL. С помощью graphql можно легко создавать различные компоненты страницы, что также полезно в направлении беспилотных исследования и разработки положительные эффекты.
кропотливый
При анализе журнала выполнения graphql основное время занимает время фактически вызываемого интерфейса.Время, затрачиваемое самим graphql, как правило, составляет менее 20 мс, а в некоторых случаях занимает много времени. К трудоемким моментам Graphql относятся:
-
ql сложность
-
Инструкция @js Выполнение скрипта js в фоновом режиме приведет к увеличению затрат времени
-
Обработка входных данных и заполнение вызова слияния также имеют определенное влияние.
5. Резюме
В этой статье представлены некоторые исследования и попытки Xianyu в области агрегации данных, а также введение и преобразование приложений Graphql. От самостоятельно разработанного сервиса до внедрения Graphql эффективность исследований и разработок постоянно повышалась, и были достигнуты хорошие результаты. В настоящее время graphql используется только в сценариях weex/h5, и мы будем использовать его в нативном режиме и постепенно расширять в будущем.
Внедрение GraphqlQL сильно изменило парадигмы клиентского и серверного программирования.
-
Отныне серверу нужно сосредоточиться только на построении стабильной бизнес-модели домена, больше не поддерживать нестабильный и легко изменяемый уровень VO, и ему не нужно повторно связываться с внешним интерфейсом для определения структуры.
-
Фронтенд/клиент больше не полагается на конкретный интерфейс сервера, а предоставляет различные сервисы данных, свободно комбинируя сервер через graphql, а также может более удобно строить страницы, и сервер в принципе не нуждается в участии.
-
Интерфейсный клиент/клиент также будет иметь более глубокое понимание бизнес-модели.
связаться с нами
Если у вас есть какие-либо вопросы или исправления по содержанию текста, пожалуйста, сообщите нам об этом.
Техническая команда Xianyu — это небольшая и мощная инженерно-техническая команда. Мы не только фокусируемся на эффективном решении бизнес-задач, но в то же время продвигаем передовую практику разрушения разделения труда в стеке технологий (унификация моделей и языков программирования android/iOS/Html5/Server) и технология компьютерного зрения на мобильных терминалах. В качестве инженера-программиста в технической команде Xianyu у вас есть возможность продемонстрировать все свои таланты и мужество, доказав, что развитие технологий является движущей силой изменения образа жизни во всей эволюции продукта и решении проблем пользователей.
Доставка резюме: guicai.gxy@alibaba-inc.com
Распознавайте QR-код и осваивайте передовые технологии