- Notifications
You must be signed in to change notification settings - Fork31
GraphQL Orchestrator stitches the schemas from multiple micro-services and orchestrates the graphql queries to these services accurately at runtime
License
graph-quilt/graphql-orchestrator-java
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
A powerful Java library for aggregating and executing GraphQL operations from multiple microservices using a single unified schema.
graphql-orchestrator-java simplifies the process of accessing data from various GraphQL microservices by providing a unified GraphQL schema.This enables you to query multiple microservices through a single endpoint, reducing complexity and improving performance.
The library supports two strategies to aggregate and combine the schemas from multiple microservices
- Schema Stitching witha recursive strategy
- Apollo Federation Style Schema Composition. (_Currently, it supports
@key, @requires, @extends, and @externaldirectives)
At query execution time, it orchestrates the GraphQL queries to the appropriate micro-services, using the populargraphql-javalibrary as the execution engine.
- Apollo Federation Style Schema Composition
- Recursive Stitching
- Query Batching
- Type Conflict Resolution Strategy
- Pluggable
graphql-javaInstrumentation
<dependency> <groupId>com.intuit.graphql</groupId> <artifactId>graphql-orchestrator-java</artifactId> <version>${graphql.orchestrator.version}</version></dependency>
- Implement the ServiceProvider interface. You will need a new instance for each GraphQL Service.
Consider the following 2 service providers below
classPersonNameServiceimplementsServiceProvider {publicstaticfinalStringschema ="type Query { person: Person } " +"type Person { firstName : String lastName: String }";@OverridepublicStringgetNameSpace() {return"PERSON_NAME"; }@OverridepublicMap<String,String>sdlFiles() {returnImmutableMap.of("schema.graphqls",schema); }@OverridepublicCompletableFuture<Map<String,Object>>query(finalExecutionInputexecutionInput,finalGraphQLContextcontext) {//{'data':{'person':{'firstName':'GraphQL Orchestrator', 'lastName': 'Java'}}}"Map<String,Object>data =ImmutableMap .of("data",ImmutableMap.of("person",ImmutableMap.of("firstName","GraphQL Orchestrator","lastName","Java")));returnCompletableFuture.completedFuture(data); }}
classPersonAddressServiceimplementsServiceProvider {publicstaticfinalStringschema ="type Query { person: Person }" +"type Person { address : Address }" +"type Address { city: String state: String zip: String}";@OverridepublicStringgetNameSpace() {return"PERSON_ADDRESS";}@OverridepublicMap<String,String>sdlFiles() {returnImmutableMap.of("schema.graphqls",schema);}@OverridepublicCompletableFuture<Map<String,Object>>query(finalExecutionInputexecutionInput,finalGraphQLContextcontext) {//{'data':{'person':{'address':{ 'city' 'San Diego', 'state': 'CA', 'zip': '92129' }}}}"Map<String,Object>data =ImmutableMap .of("data",ImmutableMap.of("person",ImmutableMap.of("address",ImmutableMap.of("city","San Diego","state","CA","zip","92129"))));returnCompletableFuture.completedFuture(data); }}
- Create an instance of Orchestrator and execute the query as below.
// create a runtimeGraph by stitching service providersRuntimeGraphruntimeGraph =SchemaStitcher.newBuilder() .service(newPersonNameService()) .service(newPersonAddressService()) .build() .stitchGraph();// pass the runtime graph to GraphQLOrchestratorGraphQLOrchestratorgraphQLOrchestrator =GraphQLOrchestrator.newOrchestrator() .runtimeGraph(runtimeGraph).build();//Execute the queryCompletableFuture<ExecutionResult>execute =graphQLOrchestrator .execute(ExecutionInput.newExecutionInput() .query("query {person {firstName lastName address {city state zip}}}") .build() );ExecutionResultexecutionResult =execute.get();System.out.println(executionResult.getData().toString());// Output:// {person={firstName=GraphQL Orchestrator, lastName=Java, address={city=San Diego, state=CA, zip=92129}}}
The Orchestrator uses a recursive algorithm to combine the schemas from multiple services and generate the following unified schema.
typeQuery {person:Person }typePerson {firstName:StringlastName:Stringaddress:Address}typeAddress {city:Stringstate:Stringzip:String}
Graph Quilt Gateway is a SpringBoot application that uses the graphql-orchestrator-java.
DetailedDocumentation can be found here
If you are interested in contributing to this project, please read theCONTRIBUTING.md file for details on our code of conduct, and the process for submitting pull requests to us.
This project is licensed under the MIT License - see theLICENSE file for details.
- Thanks to the contributors of thegraphql-java library.
- Thanks to the contributors of this project for their hard work and dedication.
About
GraphQL Orchestrator stitches the schemas from multiple micro-services and orchestrates the graphql queries to these services accurately at runtime
Topics
Resources
License
Code of conduct
Contributing
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Uh oh!
There was an error while loading.Please reload this page.
