Open Liberty 20.0.0.6 вводит новую функцию, Микропрофиль GraphQL , который позволяет разработчикам быстро и легко писать приложения GraphQL с помощью микропрофиля.
Если вы здесь читаете о GraphQL в Open Liberty, то, скорее всего, вы уже немного знаете о GraphQL. Короче говоря, GraphQL – это API удаленного доступа к данным, который решает такие проблемы, как недостаточная выборка и чрезмерная выборка, присущие большинству приложений RESTful. Это позволяет клиентам указывать точные данные, которые они хотят, чтобы “все было по–своему”. Если вы хотите узнать больше о GraphQL, я рекомендую ознакомиться с учебным пособием по адресу GraphQL.org .
Приложения GraphQL используют схему, которая действует как описание данных, предоставляемых сервером, и как контракт между клиентом и сервером. Большинство моделей программирования GraphQL требуют от разработчиков двойной поддержки своей схемы и кода приложения, который ее поддерживает. MicroProfile GraphQL использует подход “сначала код”, который позволяет разработчикам писать код Java с использованием аннотаций для обозначения элементов схемы GraphQL, а затем реализация MicroProfile GraphQL генерирует схему во время выполнения.
Функция Open Liberty Microprofile GraphQL ( mpGraphQL-1.0
) реализует спецификацию Микропрофиля GraphQL 1.0 .
В этом сообщении в блоге мы рассмотрим, как легко создавать приложения GraphQL, используя этот образец .
Установка
Чтобы настроить среду Maven для разработки приложения Amp GraphQL, вам понадобится такая зависимость, как:
org.eclipse.microprofile.graphql microprofile-graphql-api 1.0.2 provided
Я рекомендую использовать плагин Liberty Maven , но в этом нет строгой необходимости, если вы создаете файл веб-архива (WAR) для развертывания.
При настройке сервера Liberty для развертывания убедитесь, что элемент FeatureManager
в server.xml
файл содержит функцию mpGraphQL-1.0
. Например:
mpGraphQL-1.0 mpMetrics-2.3
мпМетрика-2,3
функция не требуется, но будет отслеживать количество вызовов запросов/мутаций GraphQL и совокупное время, когда она включена.
Теперь, когда мы все настроили, давайте посмотрим на код.
Кодирование приложения Micro Profile GraphQL
Микропрофильное приложение GraphQL должно иметь по крайней мере один запрос и/или мутацию корневого уровня. Чтобы создать запрос или мутацию, вы начинаете с общедоступного класса Java с аннотацией @GraphQLApi
. Затем вы добавляете общедоступные методы, которые помечаются @Query
или @Mutation
для запроса или мутации соответственно. Методы запроса/мутации всегда должны возвращать непустой тип. Эти методы могут возвращать простые типы, такие как String
, int
, double
, логическое значение
и т.д. которые будут сопоставлены скалярам GraphQL, таким как Строка
, Int
, Float
, Логическое значение
и т.д. В качестве альтернативы эти методы могут возвращать пользовательские типы Java – типы будут сопоставлены типам GraphQL и определены в сгенерированной схеме. Для получения более подробной информации см. Документы API MicroProfile GraphQL 1.0.2 .
Например, в примере приложения метод запроса currentconditIons
возвращает тип с именем Условия
– этот тип имеет такие свойства, как temperatureF
, Temperaturec
, Тип осадков
, текст о погоде
и т.д. Следующая схема создается на основе запроса и его возвращаемого значения:
type Conditions { dayTime: Boolean! epochTime: BigInteger! hasPrecipitation: Boolean! "ISO-8601" localObservationDateTime: DateTime location: String precipitationType: PrecipType temperatureC: Float! temperatureF: Float! weatherText: String wetBulbTempF: Float! } "Query root" type Query { currentConditions(location: String): Conditions currentConditionsList(locations: [String]): [Conditions] } ...
Запрос текущие условия
имеет аргумент, называемый местоположение
. В коде Java аргумент представлен параметром метода. Как и типы вывода, аргументы/параметры могут быть простыми типами Java (сопоставление скалярам GraphQL) или пользовательскими типами, которые будут сопоставлены с типами ввода в сгенерированной схеме.
При сопоставлении пользовательских типов можно изменить имя, используемое в схеме, с помощью аннотации @Name
. Например, если бы мы хотели изменить схему для отображения температуры в градусах Фаренгейта
вместо
температура мы могли бы просто добавить
@Имя (“температура по Фаренгейту”) в поле
температура в классе
Условия
Если ваше приложение использует JSON-B, то @Jsonproperty
, @Jsondataformat
и @JsonbNumberFormat
аннотации могут использоваться вместо @Name
, @Формат даты
или @формат номера
. Когда используются оба набора аннотаций, аннотации из API-интерфейсов Micro Profile GraphQL имеют приоритет над API-интерфейсами JSON-B при использовании для генерации схемы или выполнения запросов/мутаций.
Еще одна полезная аннотация – @Источник
. Эту аннотацию можно использовать для добавления поля в объект сущности, поиск или вычисление которого может быть дорогостоящим, и поэтому вы можете не захотеть тратить ресурсы на стороне сервера для вычисления этого поля, когда клиент в любом случае этого не хочет. Вот пример из образца:
public double wetBulbTempF(@Source @Name("conditions") Conditions conditions) { // TODO: pretend like this is a really expensive operation // ... return conditions.getTemperatureF() - 3.0; }
Этот пример немного надуман, но он показывает нам, что поле Температура влажной лампы F
будет вычислено только в том случае, если клиент запросит это поле. Этот метод относится к классу, аннотированному @GraphQLApi
((в этом примере Служба погоды
) и содержит параметр с аннотацией @Источник
, который принимает объект сущности, Условия
. Когда клиент выдает запрос или мутацию, которая возвращает сущность Условия
, и в этом запросе/мутации указывается поле wetBulbTempF
, реализация GraphQL вызывает метод wetBulbTempF(Условия условий)
, передавая объект Условия
, который был возвращен из метода запроса/мутации.
Запуск приложения Micro Profile GraphQL
Чтобы запустить и протестировать приложение GraphQL, вам просто нужно развернуть его в виде файла WAR. Плагин Liberty Maven упрощает сборку, развертывание и тестирование с помощью Apache Maven. После того, как вы клонировали образец с GitHub ( git clone git@github.com:OpenLiberty/sample-mp-graphql.git
) или скачал исходный ZIP-файл, просто запустите: mvn чистый пакет.: бежать
Это создает, упаковывает и развертывает приложение GraphQL до последней версии среды выполнения Open Liberty server и запускает сервер и приложение. Затем вы можете использовать предварительно упакованный HTML-интерфейс GraphiQL для отправки запросов или изменений по адресу: http://localhost:9080/mpGraphQLSample/graphiql.html
Вот несколько примеров запросов и мутаций, которые вы могли бы использовать для начала – вы можете увидеть некоторые интересные результаты:
#Temperature (Fahrenheit) for Las Vegas query LasVegas { currentConditions(location: "Las Vegas") { temperatureF } } #Is it really always sunny in Philadelphia? query SunnyInPhilly { currentConditions(location: "Philadelphia") { weatherText } } # Weather conditions for three locations - one roundtrip query threeLocations { atlanta: currentConditions(location: "Atlanta") { hasPrecipitation temperatureF weatherText precipitationType } newyork: currentConditions(location: "New York") { hasPrecipitation temperatureF weatherText precipitationType } chicago: currentConditions(location: "Chicago") { hasPrecipitation temperatureF weatherText precipitationType } } # See partial results when one portion of the query fails query fourLocations { atlanta: currentConditions(location: "Atlanta") { hasPrecipitation temperatureF weatherText precipitationType wetBulbTempF } nowhere: currentConditions(location: "Nowhere") { hasPrecipitation temperatureF weatherText precipitationType } newyork: currentConditions(location: "New York") { hasPrecipitation temperatureF weatherText precipitationType } chicago: currentConditions(location: "Chicago") { hasPrecipitation temperatureF weatherText precipitationType wetBulbTempF } } # Reset the stored weather conditions mutation { reset }
Разрешение доступа к определенным запросам/мутациям
Может потребоваться ограничить доступ к определенным запросам/мутациям определенным аутентифицированным пользователям. Хотя это не является частью спецификации MicroProfile GraphQL 1.0 (она рассматривается для будущей версии спецификации), Open Liberty делает проверку авторизации возможной с помощью @denyAll
, @PermitAll
, и @Роли разрешены
аннотации. Эти аннотации должны быть размещены в классе или методе классов, помеченных @GraphQLApi
.
При реализации авторизации с помощью микропрофиля GraphQL вам необходимо включить Безопасность приложений-3.0
((или Безопасность приложений-2.0
) функция в конфигурации сервера. Вам также необходимо настроить реестр пользователей и метаданные веб-контейнера для аутентификации и авторизации.
В примере мы используем базовый реестр пользователей, который определяет двух пользователей, по одному для каждой из двух ролей:
Это означает, что пользователь1
является частью Роли 1
и пользователь2
является частью Роли 2
. Тот web.xml
объявляет эти роли, а также настраивает проверку подлинности на основе форм, чтобы при включении функции безопасности приложений клиентам предлагалось войти в систему с помощью веб-формы перед доступом к HTML-странице GraphiQL. Это также позволяет приложению запрещать пользователям, не входящим в Роль 2
, вызывать метод мутации сброс
:
@RolesAllowed("Role2") @Mutation @Description("Reset the cached conditions so that new queries will return newly randomized weather data." + "Returns number of entries cleared.") public int reset() { int cleared = currentConditionsMap.size(); currentConditionsMap.clear(); return cleared; }
Интеграция с метриками микропрофиля
Если вы включите функцию mpMetrics-2.3
с помощью mpGraphQL-1.0
, Open Liberty отслеживает количество раз, когда вызывается конкретный метод запроса или мутации, и совокупное время, затраченное на этот метод. Эти показатели могут быть полезны для определения того, к каким данным осуществляется доступ, как часто и сколько времени тратится на выполнение.
Сбор показателей и отчетность для приложений GraphQL не упоминаются ни в спецификации Micro Profile GraphQL 1.0, ни в спецификации MicroProfile Metrics 2.3, поэтому фактическая статистика собирается и сообщается в категории “поставщик”. Чтобы просмотреть эту статистику, вы можете перейти по ссылке: http://localhost:9080/metrics/vendor
Статистика имеет префикс vendor_mp_graphql_
и должна выглядеть примерно так:
# TYPE vendor_mp_graphql_Query_currentConditions_total counter vendor_mp_graphql_Query_currentConditions_total 27 # TYPE vendor_mp_graphql_Query_currentConditions_elapsedTime_seconds gauge vendor_mp_graphql_Query_currentConditions_elapsedTime_seconds 0.10273818800000001 # TYPE vendor_mp_graphql_Conditions_wetBulbTempF_total counter vendor_mp_graphql_Conditions_wetBulbTempF_total 4 # TYPE vendor_mp_graphql_Conditions_wetBulbTempF_elapsedTime_seconds gauge vendor_mp_graphql_Conditions_wetBulbTempF_elapsedTime_seconds 0.031866015000000004 # TYPE vendor_mp_graphql_Mutation_reset_total counter vendor_mp_graphql_Mutation_reset_total 3 # TYPE vendor_mp_graphql_Mutation_reset_elapsedTime_seconds gauge vendor_mp_graphql_Mutation_reset_elapsedTime_seconds 0.007540145000000001
Резюме
GraphQL – это мощный и популярный язык запросов для удаленного доступа к данным. Микропрофиль GraphQL упрощает разработку графических приложений на Java. И теперь вы используете GraphQL в Open Liberty!
Первоначально опубликовано 10 июня 2020 года на: Первоначально опубликовано 10 июня 2020 года на:
Оригинал: “https://dev.to/andymc12/have-it-your-way-with-microprofile-graphql-c81”