Рубрики
Без рубрики

Делайте все по-своему с помощью микропрофильного GraphQL!

Open Liberty 20.0.0.6 представляет новую функцию, микропрофиль GraphQL, которая позволяет разработчикам… Помеченный java, graphql, микропрофиль.

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”