A preview of MicroProfile GraphQL

このエントリは以下のエントリをベースにしています。
This entry is based on the following one, written by Jean-François James
(Senior Software Architect, Worldline by Atos Worldline).
https://jefrajames.wordpress.com/2019/07/25/a-preview-of-microprofile-graphql/

このエントリはmpql-previewプロジェクトに関連しています。

Microprofile GraphQL preview
https://github.com/jefrajames/mpql-preview

Objectives

このプロジェクトは将来のEclipse MicroProfileのGraphQL仕様のプレビューを提供することを目的としています。

MicroProfile GraphQLが何者かご存知ない方は、以前のエントリとGitHubをご覧ください。手短に言うと、モダンなAPIを開発するためのGraphQLを第1級のMicroProfileプラットフォームの市民にすることを目指しています。

When GraphQL meets MicroProfile
https://jefrajames.wordpress.com/2019/01/04/when-graphql-meets-microprofile/
https://logico-jp.io/2019/04/22/when-graphql-meets-microprofile/
microprofile-graphql
https://github.com/eclipse/microprofile-graphql

GraphQLはFacebookが作成し、2018年11月からLinux Foundationがホストしている仕様で、特にデータ指向APIに関連して、クライアントサイドでの柔軟性が非常に増します。

GraphQL
https://graphql.github.io/graphql-spec/

GraphQLについて詳しく知りたい方は、Bojan Tomicの素晴らしいチュートリアルをお試しください。

graphql-java Tutorial
https://www.howtographql.com/graphql-java/0-introduction/

Status of Eclipse MicroProfile GraphQL

MicroProfile GraphQLは、 code-firstアプローチをとるGraphQLアプリケーションのための標準APIを定義するEclipseのプロジェクトで、2018年12月にスタートしました。”Code-first” とはGraphQLスキーマを事前に定義せず、アプリケーション開始時にJavaコードから派生することを意味します。

現在のAPIはアノテーションで構成されています。

GraphQL APIのアノテーション
https://github.com/eclipse/microprofile-graphql/tree/master/api/src/main/java/org/eclipse/microprofile/graphql

現在開発中ですが、すでにお試し頂ける状態にあります。

  1. プロジェクトはGitHubからご利用頂けます。
    microprofile-graphql
    https://github.com/eclipse/microprofile-graphql
  2. APIはMaven Centralに公開済みです。
    MicroProfile GraphQL :: API
    https://mvnrepository.com/artifact/org.eclipse.microprofile.graphql/microprofile-graphql-api
  3. 最初のプロトタイプ実装はspqrを使っています。プロトタイプ実装はmicroprofile-protoブランチでご利用頂けます。
    Java 8+ API for rapid development of GraphQL services
    https://github.com/leangen/graphql-spqr/tree/microprofile-proto

そのため、完全なMicroProfile GraphQL実装がまだ利用可能でないことを除いて、すべてをお試し頂けます。これがまさにこのプレビュープロジェクトの目的です!

What is this preview project about?

このプロジェクトは3パートから構成されています。

  1. SuperHero デモアプリケーション
  2. SuperHeroアプリケーションとspqr実装との間をつなぐ、CDI拡張に基づくrunner。MicroProfile GraphQL実装はまだ開発中のためにこれが必要で、現在IBM、Red Hat、Tomitribeが積極的に取り組んでいます。HTTPトランスポートを確実にするために、サーブレットもrunnerで定義されます。
  3. テスト実行のための基本的なGraphQLクライアント

Payara-5.192を使ってJava EE Webアプリケーションとして開発されました。任意のJava EE 8プラットフォームで動作します。

Building and running the project

Preambles

前提として、JDK (8以上) と Maven (3.5) がインストールされているものとします。正確には、このプロジェクトは以下のコンポーネントを使って開発されました。

  1. Maven 3.6.1
  2. OpenJDK 11.0.3 (OpenJ9)

Building the project

以下の手順を踏んでください。

  1. プロジェクトをクローン
  2. spqrのmicroprofile-protoブランチをGitHubからクローン
  3. ビルドしてローカルにインストール(Maven centralは使えません)
  4. Payara 5.192(執筆時、現在の最新は193)をダウンロード
    https://www.payara.fish/software/downloads/
  5. Payaraを起動
    asadmin start-domain domain1 (テストのために必要)
  6. Mavenを使ってプロジェクトをビルド
  7. warファイルが出来たら、お好きなIDEを使ってソースコードを変更したり、アプリケーションサーバを変えたりしてみてください。

コードを変更する場合、アプリケーションを開始するために@GraphQLApi が付いたクラスが少なくとも1個必要であることにご注意ください。

Running

SuperHeloアプリケーションが含まれているWARファイルはJava/Jakarta EE 8に完全に対応しており、任意のアプリケーションサーバで稼働させることができます。以下の環境でのテストが済んでいます。

  1. GlassFish 5.1
  2. OpenLiberty 19.0.5
  3. TomEE plus 8.0.0-M2
  4. Wildfly 16.0.0.Final

Playing around with GraphQL

アプリケーション起動後、2個の選択肢があるインデックスページに移動してください。

Index page
http://localhost:8080/mpql-preview/

  1. introspect the GraphQL schema(GraphQLスキーマのイントロスペクト)
    これはGraphQLのキーコンセプトで、サーバとクライアント間のコントラクト(契約)として振る舞います。GraphQLはネイティブなイントロスペクションを提供します。
  2. play with GraphiQL (GraphQLと戯れる)
    SuperHeroアプリケーションと対話しましょう。GraphiQLは、クエリやmutationをブラウザから送信できるインタラクティブなJavaScriptベースのツールです。
    GraphiQL
    https://github.com/graphql/graphiql

GraphQL の構文がよくわからない場合、graphql-config.,propertiesで定義されているテストが利用するクエリをコピー&ペーストしてください。

全てのヒーローを取り出すには

query allHeroes {
  allHeroes {
    name
    primaryLocation
    superPowers
    realName
  }
}

Avengersチームに属するヒーローを取り出すには

query allAvengers {
  allHeroesInTeam(team: "Avengers") {
    name
    primaryLocation
    superPowers
  }
}

Avengersチームに新たなヒーローを作成し超能力を与えるには

mutation createNewHero {
  createNewHero(
    hero: {
           name: "Captain America", 
           realName: "Steven Rogers", 
           superPowers: ["Super strength", "Vibranium Shield"], 
           primaryLocation: "New York, NY", 
           teamAffiliations: [{name: "Avengers"}]
           }
         ) 
  {
  name
  primaryLocation
  superPowers
  realName
  }
}

GitHubのmpql-previewプレビューでお試しください。そして、MicroProfile GraphQLをお楽しみに。

Microprofile GraphQL preview
https://github.com/jefrajames/mpql-preview

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中