SlideShare a Scribd company logo
1 of 75
Download to read offline
#greachConf @marioggar ©	Mario	Garcia	2017
GRAPHQL	AND	GROOVYGRAPHQL	AND	GROOVYGRAPHQL	AND	GROOVYGRAPHQL	AND	GROOVYGRAPHQL	AND	GROOVYGRAPHQL	AND	GROOVY
GRAPHQL	AND	GROOVY
GRAPHQL	AND	GROOVY
GRAPHQL	AND	GROOVY
GRAPHQL	AND	GROOVY
GRAPHQL	AND	GROOVY
GRAPHQL	AND	GROOVY
GRAPHQL	AND	GROOVY
GRAPHQL	AND	GROOVY
GRAPHQL	AND	GROOVYGRAPHQL	AND	GROOVY
@marioggar
1
#greachConf @marioggar ©	Mario	Garcia	2017
ABOUT	ME
Name
Mario	Garcia
You	can	find	me:
https://twitter.com/marioggar
https://github.com/mariogarcia
2 . 1
#greachConf @marioggar ©	Mario	Garcia	2017
PROUD	MEMBER	OF…​
2 . 2
#greachConf @marioggar ©	Mario	Garcia	2017
WORKING	AT	KALEIDOS
2 . 3
#greachConf @marioggar ©	Mario	Garcia	2017
BUT	A	GREAT	FAMILY
2 . 4
#greachConf @marioggar ©	Mario	Garcia	2017
LET	ME	TELL	YOU	WHY	YOU’RE	HERE…​
I’ve	heard	GraphQL	is	the	next	big	thing
If	I	do	one	more	REST	app	I’ll	kill	myself
I	didn’t	find	any	other	interesting	talk
Whatever	it	is…​
3 . 1
#greachConf @marioggar ©	Mario	Garcia	2017
3 . 2
#greachConf @marioggar ©	Mario	Garcia	2017
SUMMARY
4 . 1
#greachConf @marioggar ©	Mario	Garcia	2017
GraphQL	overview
GraphQL	types	query	language
GraphQL	+	JVM	+	HTTP
Conclusions
4 . 2
#greachConf @marioggar ©	Mario	Garcia	2017
GRAPHQL	OVERVIEW
5 . 1
#greachConf @marioggar ©	Mario	Garcia	2017
WHAT	IS	GRAPHQL
Is	a	query	language
Is	also	a	server-side	runtime	spec
It	uses	a	type	system	to	define	those	queries
5 . 2
#greachConf @marioggar ©	Mario	Garcia	2017
WHAT	IS	NOT	GRAPHQL
Is	not	a	web	framework
Is	not	about	HTTP
And	definitely,	definitely,	definitely…​
GraphQL	is	not	REST
5 . 3
#greachConf @marioggar ©	Mario	Garcia	2017
GRAPHQL	VS	REST
5 . 4
#greachConf @marioggar ©	Mario	Garcia	2017
WHY	WE	COULD	WANT	TO	MOVE	TO	GRAPHQL	?
5 . 5
#greachConf @marioggar ©	Mario	Garcia	2017
FIRST	OF	ALL
While	REST	is	an	architectural	concept
GraphQL	is	just	a	query	language
5 . 6
#greachConf @marioggar ©	Mario	Garcia	2017
DIFFERENCES
Resources	vs	Queries
Rest:	1	URI	=⇒	1	resource
GraphQL:	1	URI	=⇒	n	dataset
Application	layer
Rest	==	HTTP
GraphQL	is	not	tied	to	any	specific	protocol
Front-End	friendly
Rest:	Back	end	is	the	king	...and	the	bottleneck
5 . 7
#greachConf @marioggar ©	Mario	Garcia	2017
NO	PROBLEM.	I'LL	SEE	WHAT	I	CAN	DO
5 . 8
#greachConf @marioggar ©	Mario	Garcia	2017
THE	CHALLENGE
I	want	to	expose	all	James	Bond	films	information
Users	will	ONLY	use	web	browsers...FOR	NOW
BUT	we	have	to	be	ready	for	mobile	AT	SOME	POINT
5 . 9
#greachConf @marioggar ©	Mario	Garcia	2017
WHAT	DO	WE	DO	?
We	build	up	1	API	endpoint
Only	targets	1	device
Still	we	can	create	a	couple	of	views	for	the
same	data
5 . 10
#greachConf @marioggar ©	Mario	Garcia	2017
THEN	SHIT	HAPPENS!
5 . 11
#greachConf @marioggar ©	Mario	Garcia	2017
AND	NORMALLY	GETS	WORST
Users	want	to	see	A,	B,	and	C	in	user	home
Front	end	could	reuse	views
and/or	aggregate	calls
still	may	not	be	enough	and	they	will	start	asking	back-end
to	do	more…​	and	more	…​	and	more…​
5 . 12
#greachConf @marioggar ©	Mario	Garcia	2017
5 . 13
#greachConf @marioggar ©	Mario	Garcia	2017
THEN	YOU	REMEMBER	THAT…​
ONLY	means	in	addition
FOR	NOW	means	within	the	next	two	weeks
BUT	means	winter	is	coming!
and	of	course…​AT	SOME	POINT	means	probably	next
week
5 . 14
#greachConf @marioggar ©	Mario	Garcia	2017
GRAPHQL	+	HTTP	TO	THE	RESCUE!
5 . 15
#greachConf @marioggar ©	Mario	Garcia	2017
5 . 16
#greachConf @marioggar ©	Mario	Garcia	2017
WHAT	CHANGED	?
GraphQL	HTTP	endpoint	as	a	common	query	interface
Therefore	a	lot	more	flexibility	for	front	end
Your	REST/NOT-REST	microservices	will	be	easier	to
maintain
Will	be	easier	to	keep	one	single	responsability	in	each	one
of	them
5 . 17
#greachConf @marioggar ©	Mario	Garcia	2017
EXECUTING	QUERIES
6 . 1
#greachConf @marioggar ©	Mario	Garcia	2017
STEPS	TO	EXECUTE	A	QUERY
Define	TYPES
Define	QUERIES
Execute	queries	against	schema
6 . 2
#greachConf @marioggar ©	Mario	Garcia	2017
FIRST	EXAMPLE
6 . 3
#greachConf @marioggar ©	Mario	Garcia	2017
FIRST	EXAMPLE:	SCHEMA
type	Film	{
		title:	!String
		year:	Int
}
type	Queries	{
			lastFilm:	Film
			filmByYear(year:	Int):	Film
}
schema	{
	query:	Queries
}
http://facebook.github.io/graphql/
6 . 4
#greachConf @marioggar ©	Mario	Garcia	2017
FIRST	EXAMPLE:	TYPES
Client	CAN	add/omit	as	many	optional	fields	as	it	wants
Client	MUST	add	mandatory	fields	in	the	query
type	Film	{
		title:	!String
		year:	Int
}
6 . 5
#greachConf @marioggar ©	Mario	Garcia	2017
FIRST	EXAMPLE	:	QUERIES
Queries	always	use	types	or	scalars
Queries	may	have	arguments
type	Queries	{
			lastFilm:	Film
			filmByYear(year:	Int):	Film
}
6 . 6
#greachConf @marioggar ©	Mario	Garcia	2017
FIRST	EXAMPLE	:	EXECUTE	QUERY
query:	"give	me	the	last	James	Bond	film	with	its	title
result:	"SPECTRE"
{
		lastFilm	{
				title
		}
}
{
		"data":	{
				"lastFilm":	{
						"title":	"SPECTRE"
				}
		}
}
6 . 7
#greachConf @marioggar ©	Mario	Garcia	2017
LITTLE	BIT	CLOSER
query
1.	lastFilm:	Is	the	query	I’m	interested	in
2.	title:	Is	a	specific	field	in	the	return	type	(Film)
{
		lastFilm	{	(1)
				title				(2)
		}
}
6 . 8
#greachConf @marioggar ©	Mario	Garcia	2017
VALIDATION
title	is	mandatory
invalid	query
type	Film	{
		title:	!String
		year:	Int
}
{
		lastFilm
}
6 . 9
#greachConf @marioggar ©	Mario	Garcia	2017
6 . 10
#greachConf @marioggar ©	Mario	Garcia	2017
JVM	LIBRARIES	OUT	THERE!
GraphQL-Java
https://github.com/graphql-java/graphql-java
6 . 11
#greachConf @marioggar ©	Mario	Garcia	2017
FIRST	EXAMPLE	REVISITED:	TYPES
type	Film	{
		title:	!String
		year:	Int
}
GraphQLObjectType.newObject()
.name("Film")
.field(newFieldDefinition()
							.type(GraphQLString)
							.name("title"))
.field(newFieldDefinition()
							.type(GraphQLInt)
							.name("year"))
.build();
6 . 12
#greachConf @marioggar ©	Mario	Garcia	2017
FIRST	EXAMPLE	REVISITED:	QUERIES
type	Queries	{
			lastFilm:	Film
			filmByYear(year:	Int):	Film
}
schema	{
	query:	Queries
}
GraphQLObjectType	lastFilm	=
		GraphQLObjectType.newObject()
		.name("Queries")
		.field(newFieldDefinition()
									.type(filmType)
									.name("lastFilm")
									.dataFetcher(Queries::findLastFilm))
		.build();
return	GraphQLSchema
		.newSchema()
		.query(lastFilm)
		.build();
6 . 13
#greachConf @marioggar ©	Mario	Garcia	2017
DATA	FETCHER
Functional	Interface	graphql.schema.DataFetcher
If	using	JDK	could	use	method	reference
If	using	Groovy	Closures	FTW
If	using	Groovy	w	Parrot	→	Both	o/
6 . 14
#greachConf @marioggar ©	Mario	Garcia	2017
FIRST	EXAMPLE	REVISITED:	EXECUTION
1.	schema:	query	+	types	definition
2.	query:	query	string
3.	context:	helpful	for	adding	metadata	(e.g.	authorization)
4.	variables:	if	the	query	has	any
Map<String,Object>	result	=	new	GraphQL(schema)	(1)
.execute(query,																																	(2)
									null,																																		(3)
									"")																																				(4)
.getData()	as	Map<String,Object>
6 . 15
#greachConf @marioggar ©	Mario	Garcia	2017
TOO	MUCH	JAVA	CODE…​
6 . 16
#greachConf @marioggar ©	Mario	Garcia	2017
6 . 17
#greachConf @marioggar ©	Mario	Garcia	2017
GRAPHQL	DSL	(GQL)
DSL	over	GraphQL-Java
Still	alpha
Feeback	is	very	welcome	:)
https://github.com/grooviter/gql
6 . 18
#greachConf @marioggar ©	Mario	Garcia	2017
GROOVY	TIME:	TYPES
type	Film	{
		title:	!String
		year:	Int
}
DSL.type('Film')	{
		field('title')	{
				type	nonNull(GraphQLString)
		}
		field('something',	GraphQLBoolean)
		field('year')	{
				description	'release	date'
				type	GraphQLString
		}
}
6 . 19
#greachConf @marioggar ©	Mario	Garcia	2017
GROOVY	TIME:	TYPES	(II)
vs
GraphQLObjectType.newObject()
.name("Film")
.field(newFieldDefinition()
							.type(GraphQLString)
							.name("title"))
.field(newFieldDefinition()
							.type(GraphQLInt)
							.name("year"))
.build();
DSL.type('Film')	{
		field('title')	{
				type	nonNull(GraphQLString)
		}
		field('something',	GraphQLBoolean)
		field('year')	{
				description	'release	date'
				type	GraphQLString
		}
}
6 . 20
#greachConf @marioggar ©	Mario	Garcia	2017
GROOVY	TIME:	QUERIES
type	Queries	{
			lastFilm:	Film
			filmByYear(year:	Int):	Film
}
schema	{
	query:	Queries
}
return	DSL.schema	{
		query('Queries')	{
				field('lastFilm')	{
						type	Schema.FilmType
						fetcher	Queries.&findLastFilm
				}
				field('byYear')	{
						type	Schema.FilmType
						fetcher	Queries.&findByYear
						argument('year')	{
								type	GraphQLString
						}
				}
		}
}
6 . 21
#greachConf @marioggar ©	Mario	Garcia	2017
GROOVY	TIME:	QUERIES	(II)
vs
GraphQLObjectType	lastFilm	=
		GraphQLObjectType.newObject()
		.name("Queries")
		.field(newFieldDefinition()
									.type(filmType)
									.name("lastFilm")
									.dataFetcher(Queries::findLastFilm))
		.build();
return	GraphQLSchema
		.newSchema()
		.query(lastFilm)
		.build();
return	DSL.schema	{
		query('Queries')	{
				field('lastFilm')	{
						type	Schema.FilmType
						fetcher	Queries.&findLastFilm
				}
				field('byYear')	{
						type	Schema.FilmType
						fetcher	Queries.&findByYear
						argument('year')	{
								type	GraphQLString
						}
				}
6 . 22
#greachConf @marioggar ©	Mario	Garcia	2017
GROOVY	TIME:	QUERY	EXECUTION
yields
def	result	=	DSL
		.execute(schema,	queryString)
		.data	as	Map<String,Object>
{
		lastFilm:	{
				year:	2015,
				title:	'SPECTRE'
		}
}
6 . 23
#greachConf @marioggar ©	Mario	Garcia	2017
GROOVY	TIME:	QUERY	EXECUTION	(II)
vs
Map<String,Object>	result	=	new	GraphQL(schema)	(1)
.execute(query,																																	(2)
									null,																																		(3)
									"")																																				(4)
.getData()	as	Map<String,Object>
def	result	=	DSL
		.execute(schema,	queryString)
		.data	as	Map<String,Object>
6 . 24
#greachConf @marioggar ©	Mario	Garcia	2017
QUERIES	WITH	ARGUMENTS
6 . 25
#greachConf @marioggar ©	Mario	Garcia	2017
WHO	KNOWS	THE	TITLE	OF	1962	?
query
query	execution
queryString	=	'''
		query	FindBondFilmByYear($year:	String){
				byYear(year:	$year)	{
						year
						title
				}
		}
'''
Map<String,Object>	result	=	DSL
		.execute(schema,	queryString,	[year:	year])
		.data
6 . 26
#greachConf @marioggar ©	Mario	Garcia	2017
DR.	NO
[byYear:	[
				title:	'DR.	NO',
				year:	"1962"
		]
]
6 . 27
#greachConf @marioggar ©	Mario	Garcia	2017
NOW…​
6 . 28
#greachConf @marioggar ©	Mario	Garcia	2017
WOULDN’T	IT	COOL	IF	I	EXPOSE	THIS	TO	THE
WORLD	?
6 . 29
#greachConf @marioggar ©	Mario	Garcia	2017
HTTP	+	GRAPHQL
7 . 1
#greachConf @marioggar ©	Mario	Garcia	2017
RATPACK	+	GRAPHQL
7 . 2
#greachConf @marioggar ©	Mario	Garcia	2017
TECHNOLOGIES	USED
Ratpack
GraphQL-java
GQL
GraphiQL
7 . 3
#greachConf @marioggar ©	Mario	Garcia	2017
FULL	FILM	TYPE
And	it	fits	in	the	slide!!
static	final	GraphQLObjectType	Film	=
		DSL.type('Film')	{
				field	'title'							,	nonNull(GraphQLString)
				field	'year'								,	GraphQLInt
				field	'directedBy'		,	GraphQLString
				field	'bond'								,	GraphQLString
				field	'themeSong'			,	list(ThemeSong)
				field	'bondGirls'			,	list(BondGirl)
				field	'villains'				,	list(Villain)
				field	'counterparts',	list(CounterPart)
				field	'gadgets'					,	list(GraphQLString)
				field	'vehicles'				,	list(GraphQLString)
		}
7 . 4
#greachConf @marioggar ©	Mario	Garcia	2017
QUERIES
return	DSL.schema	{
		query('Queries')	{
				field('lastFilm')	{
						type	Schema.Film
						fetcher	Queries.&findLastFilm
				}
				field('byYear')	{
						type	Schema.Film
						fetcher	Queries.&findByYear
						argument('year')	{
								type	GraphQLString
						}
				}
				field('byBondActorNameLike')	{
						type	list(Schema.Film)
						fetcher	Queries.&byBondActorNameLike
						argument('name')	{
								type	GraphQLString
						}
				}
		}
}
7 . 5
#greachConf @marioggar ©	Mario	Garcia	2017
RATPACK	HANDLER
class	GraphQLHandler	implements	Handler	{
		@Inject
		GraphQLSchema	schema
		@Override
		void	handle(final	Context	ctx)	{
				def	payload	=	ctx.get(Map)	//	JSON	request	=>	Map
				Blocking.get	{
						DSL.execute(schema,	"${payload.query}",	payload.variables	as	Map<String,Object>)
				}.then	{	ExecutionResult	result	->
						def	response	=	[data:	result.errors	?:	result.data]
						ctx.render	json(response)
				}
		}
}
7 . 6
#greachConf @marioggar ©	Mario	Garcia	2017
URI	MAPPING
1.	GraphQL	endpoint
2.	GraphiQL	web	console
handlers	{
		prefix('graphql')	{	(1)
						all(createBindingHandler(Map))
						post(GraphQLHandler)
		}
		files	{		(2)
				dir('static').indexFiles('index.html')
		}
}
7 . 7
#greachConf @marioggar ©	Mario	Garcia	2017
SHOWTIME!
query	UserHome($actor:	String,	$year:	String)	{
		latest:	lastFilm	{
				title
				year
				directedBy
				bond
		}
		whenIwasBorn:	byYear(year:	$year)	{
				title
		}
		favouriteActorMovies:	byBondActorNameLike(name:	$actor)	{
				title
				year
				bond
		}
}
7 . 8
#greachConf @marioggar ©	Mario	Garcia	2017
A	WORD	ON	QUERIES	&	MUTATIONS
Queries	are	supposed	to	be	able	to	be	batched
Queries	are	supposed	to	be	computed	in	parallel
Mutations	are	supposed	to	run	sequentially
7 . 9
#greachConf @marioggar ©	Mario	Garcia	2017
GRAILS	+	RELAY
7 . 10
#greachConf @marioggar ©	Mario	Garcia	2017
RELAY	?
Good	GraphQL	practices	implemented	in	a	JS	library
https://facebook.github.io/relay/
7 . 11
#greachConf @marioggar ©	Mario	Garcia	2017
RELAY
How	to	handle	pagination
How	to	handle	ids
HTTP	recommended	features
…​
http://graphql.org/learn/best-practices/
7 . 12
#greachConf @marioggar ©	Mario	Garcia	2017
GORM	GRAPHQL
Plugin	Grails	3
https://github.com/mrcirillo/relay-gorm-connector
7 . 13
#greachConf @marioggar ©	Mario	Garcia	2017
GRAPHQL	SCHEMA
@RelayType(description='An	optional	description	of	a	film')
class	Film	{
		@RelayField(description='An	optional	description	of	name')
		String	title
		String	year
		String	bond
}
7 . 14
#greachConf @marioggar ©	Mario	Garcia	2017
GRAILS	URLMAPPINGS
post	"/graphql"(controller:	"graph")
7 . 15
#greachConf @marioggar ©	Mario	Garcia	2017
GRAILS	CONTROLLER
class	GraphController	{
				def	relayService	//	provided	by	plugin
				def	index()	{
						def	query	=	request.JSON.query.toString()
						def	vars	=	request.JSON.variables
						def	result	=	relayService.query(query,	null,	vars?:[:])
												render(result	as	JSON)
				}
}
7 . 16
#greachConf @marioggar ©	Mario	Garcia	2017
GRAPHQL	BEST	PRACTICES	HINT:	ID	HASHING
Instead	of	passing	1	use	a	hash	like	hagghsXy==
def	idString	=	RelayHelpers.toGlobalId("Film",	film.id.toString())
def	query	=	"""
				query	{
								node(id:	"$idString")	{
												...	on	Film	{
																title
												}
								}
				}
"""
7 . 17
#greachConf @marioggar ©	Mario	Garcia	2017
CONCLUSIONS
Is	not	GraphQL	instead	of	REST
Is	about	GraphQL	over	your	existent	services
A	great	improvement	from	the	business	point	of	view
Your	front	end	workmates	will	love	you
8 . 1
#greachConf @marioggar ©	Mario	Garcia	2017
THANK	YOU!
8 . 2
#greachConf @marioggar ©	Mario	Garcia	2017
QUESTIONS	&	ANSWERS
9

More Related Content

What's hot

Getting Started on Amazon EKS
Getting Started on Amazon EKSGetting Started on Amazon EKS
Getting Started on Amazon EKSMatthew Barlocker
 
Getting Started With Continuous Delivery on AWS - AWS April 2016 Webinar Series
Getting Started With Continuous Delivery on AWS - AWS April 2016 Webinar SeriesGetting Started With Continuous Delivery on AWS - AWS April 2016 Webinar Series
Getting Started With Continuous Delivery on AWS - AWS April 2016 Webinar SeriesAmazon Web Services
 
Building Data Lakes in the AWS Cloud
Building Data Lakes in the AWS CloudBuilding Data Lakes in the AWS Cloud
Building Data Lakes in the AWS CloudAmazon Web Services
 
Microservices on AWS: Architectural Patterns and Best Practices | AWS Summit ...
Microservices on AWS: Architectural Patterns and Best Practices | AWS Summit ...Microservices on AWS: Architectural Patterns and Best Practices | AWS Summit ...
Microservices on AWS: Architectural Patterns and Best Practices | AWS Summit ...Amazon Web Services
 
AWS re:Invent 2016: Workshop: Choose Your Own SAML Adventure: A Self-Directed...
AWS re:Invent 2016: Workshop: Choose Your Own SAML Adventure: A Self-Directed...AWS re:Invent 2016: Workshop: Choose Your Own SAML Adventure: A Self-Directed...
AWS re:Invent 2016: Workshop: Choose Your Own SAML Adventure: A Self-Directed...Amazon Web Services
 
Docker Compose | Docker Compose Tutorial | Docker Tutorial For Beginners | De...
Docker Compose | Docker Compose Tutorial | Docker Tutorial For Beginners | De...Docker Compose | Docker Compose Tutorial | Docker Tutorial For Beginners | De...
Docker Compose | Docker Compose Tutorial | Docker Tutorial For Beginners | De...Simplilearn
 
How To Run Your Containers on AWS with ECS & Fargate: Collision 2018
How To Run Your Containers on AWS with ECS & Fargate: Collision 2018How To Run Your Containers on AWS with ECS & Fargate: Collision 2018
How To Run Your Containers on AWS with ECS & Fargate: Collision 2018Amazon Web Services
 
Deep Dive into Container Scheduling with Amazon ECS - CON404 - re:Invent 2017
Deep Dive into Container Scheduling with Amazon ECS - CON404 - re:Invent 2017Deep Dive into Container Scheduling with Amazon ECS - CON404 - re:Invent 2017
Deep Dive into Container Scheduling with Amazon ECS - CON404 - re:Invent 2017Amazon Web Services
 
AWS Interview Questions Part - 1 | AWS Interview Questions And Answers Part -...
AWS Interview Questions Part - 1 | AWS Interview Questions And Answers Part -...AWS Interview Questions Part - 1 | AWS Interview Questions And Answers Part -...
AWS Interview Questions Part - 1 | AWS Interview Questions And Answers Part -...Simplilearn
 
Kubernetes on AWS with Amazon EKS
Kubernetes on AWS with Amazon EKSKubernetes on AWS with Amazon EKS
Kubernetes on AWS with Amazon EKSAmazon Web Services
 
Introduction to Modern Identity with Auth0's Developer
 Introduction to Modern Identity with Auth0's Developer Introduction to Modern Identity with Auth0's Developer
Introduction to Modern Identity with Auth0's DeveloperProduct School
 
Getting Started with Amazon CloudSearch
Getting Started with Amazon CloudSearchGetting Started with Amazon CloudSearch
Getting Started with Amazon CloudSearchAmazon Web Services
 

What's hot (20)

Docker by Example - Basics
Docker by Example - Basics Docker by Example - Basics
Docker by Example - Basics
 
Getting Started on Amazon EKS
Getting Started on Amazon EKSGetting Started on Amazon EKS
Getting Started on Amazon EKS
 
Getting Started With Continuous Delivery on AWS - AWS April 2016 Webinar Series
Getting Started With Continuous Delivery on AWS - AWS April 2016 Webinar SeriesGetting Started With Continuous Delivery on AWS - AWS April 2016 Webinar Series
Getting Started With Continuous Delivery on AWS - AWS April 2016 Webinar Series
 
A Hands-on Introduction to Docker
A Hands-on Introduction to DockerA Hands-on Introduction to Docker
A Hands-on Introduction to Docker
 
Building Data Lakes in the AWS Cloud
Building Data Lakes in the AWS CloudBuilding Data Lakes in the AWS Cloud
Building Data Lakes in the AWS Cloud
 
Microservices on AWS: Architectural Patterns and Best Practices | AWS Summit ...
Microservices on AWS: Architectural Patterns and Best Practices | AWS Summit ...Microservices on AWS: Architectural Patterns and Best Practices | AWS Summit ...
Microservices on AWS: Architectural Patterns and Best Practices | AWS Summit ...
 
AWS re:Invent 2016: Workshop: Choose Your Own SAML Adventure: A Self-Directed...
AWS re:Invent 2016: Workshop: Choose Your Own SAML Adventure: A Self-Directed...AWS re:Invent 2016: Workshop: Choose Your Own SAML Adventure: A Self-Directed...
AWS re:Invent 2016: Workshop: Choose Your Own SAML Adventure: A Self-Directed...
 
Docker Compose | Docker Compose Tutorial | Docker Tutorial For Beginners | De...
Docker Compose | Docker Compose Tutorial | Docker Tutorial For Beginners | De...Docker Compose | Docker Compose Tutorial | Docker Tutorial For Beginners | De...
Docker Compose | Docker Compose Tutorial | Docker Tutorial For Beginners | De...
 
AWS Cloud Security Fundamentals
AWS Cloud Security FundamentalsAWS Cloud Security Fundamentals
AWS Cloud Security Fundamentals
 
Running Kubernetes on AWS
Running Kubernetes on AWSRunning Kubernetes on AWS
Running Kubernetes on AWS
 
How To Run Your Containers on AWS with ECS & Fargate: Collision 2018
How To Run Your Containers on AWS with ECS & Fargate: Collision 2018How To Run Your Containers on AWS with ECS & Fargate: Collision 2018
How To Run Your Containers on AWS with ECS & Fargate: Collision 2018
 
Cloud Summit Canada com Rodrigo Montoro
Cloud Summit Canada com Rodrigo MontoroCloud Summit Canada com Rodrigo Montoro
Cloud Summit Canada com Rodrigo Montoro
 
Deep Dive into Container Scheduling with Amazon ECS - CON404 - re:Invent 2017
Deep Dive into Container Scheduling with Amazon ECS - CON404 - re:Invent 2017Deep Dive into Container Scheduling with Amazon ECS - CON404 - re:Invent 2017
Deep Dive into Container Scheduling with Amazon ECS - CON404 - re:Invent 2017
 
In Depth: AWS IAM and VPC
In Depth: AWS IAM and VPCIn Depth: AWS IAM and VPC
In Depth: AWS IAM and VPC
 
AWS Interview Questions Part - 1 | AWS Interview Questions And Answers Part -...
AWS Interview Questions Part - 1 | AWS Interview Questions And Answers Part -...AWS Interview Questions Part - 1 | AWS Interview Questions And Answers Part -...
AWS Interview Questions Part - 1 | AWS Interview Questions And Answers Part -...
 
AWS Lambda Features and Uses
AWS Lambda Features and UsesAWS Lambda Features and Uses
AWS Lambda Features and Uses
 
Docker 101
Docker 101Docker 101
Docker 101
 
Kubernetes on AWS with Amazon EKS
Kubernetes on AWS with Amazon EKSKubernetes on AWS with Amazon EKS
Kubernetes on AWS with Amazon EKS
 
Introduction to Modern Identity with Auth0's Developer
 Introduction to Modern Identity with Auth0's Developer Introduction to Modern Identity with Auth0's Developer
Introduction to Modern Identity with Auth0's Developer
 
Getting Started with Amazon CloudSearch
Getting Started with Amazon CloudSearchGetting Started with Amazon CloudSearch
Getting Started with Amazon CloudSearch
 

More from Mario García

Blockchain 101 (spanish)
Blockchain 101 (spanish)Blockchain 101 (spanish)
Blockchain 101 (spanish)Mario García
 
Jbake workshop (Greach 2019)
Jbake workshop (Greach 2019)Jbake workshop (Greach 2019)
Jbake workshop (Greach 2019)Mario García
 
Groovy 2.5 and 3.0 (Spanish)
Groovy 2.5 and 3.0 (Spanish)Groovy 2.5 and 3.0 (Spanish)
Groovy 2.5 and 3.0 (Spanish)Mario García
 
Calidad del codigo (MadridGUG)
Calidad del codigo (MadridGUG)Calidad del codigo (MadridGUG)
Calidad del codigo (MadridGUG)Mario García
 
Macro macro, burrito burrit
Macro macro, burrito burritMacro macro, burrito burrit
Macro macro, burrito burritMario García
 
Creating ASTTs The painful truth
Creating ASTTs The painful truthCreating ASTTs The painful truth
Creating ASTTs The painful truthMario García
 
Functional Programming with Groovy
Functional Programming with GroovyFunctional Programming with Groovy
Functional Programming with GroovyMario García
 
Test Motherfucker...Test
Test Motherfucker...TestTest Motherfucker...Test
Test Motherfucker...TestMario García
 
Programación concurrente con GPars
Programación concurrente con GParsProgramación concurrente con GPars
Programación concurrente con GParsMario García
 
Greach 2011 : Creando Plugins Con Griffon
Greach 2011 : Creando Plugins Con GriffonGreach 2011 : Creando Plugins Con Griffon
Greach 2011 : Creando Plugins Con GriffonMario García
 

More from Mario García (16)

Blockchain 101 (spanish)
Blockchain 101 (spanish)Blockchain 101 (spanish)
Blockchain 101 (spanish)
 
Jbake workshop (Greach 2019)
Jbake workshop (Greach 2019)Jbake workshop (Greach 2019)
Jbake workshop (Greach 2019)
 
Groovy 2.5 and 3.0 (Spanish)
Groovy 2.5 and 3.0 (Spanish)Groovy 2.5 and 3.0 (Spanish)
Groovy 2.5 and 3.0 (Spanish)
 
GraphQL & Ratpack
GraphQL & RatpackGraphQL & Ratpack
GraphQL & Ratpack
 
GraphQL y Groovy
GraphQL y GroovyGraphQL y Groovy
GraphQL y Groovy
 
Calidad del codigo (MadridGUG)
Calidad del codigo (MadridGUG)Calidad del codigo (MadridGUG)
Calidad del codigo (MadridGUG)
 
Macro macro, burrito burrit
Macro macro, burrito burritMacro macro, burrito burrit
Macro macro, burrito burrit
 
Creating ASTTs The painful truth
Creating ASTTs The painful truthCreating ASTTs The painful truth
Creating ASTTs The painful truth
 
Groovy android
Groovy androidGroovy android
Groovy android
 
Groovy on Android
Groovy on AndroidGroovy on Android
Groovy on Android
 
Gpars Workshop 2014
Gpars Workshop 2014Gpars Workshop 2014
Gpars Workshop 2014
 
Functional Programming with Groovy
Functional Programming with GroovyFunctional Programming with Groovy
Functional Programming with Groovy
 
Test Motherfucker...Test
Test Motherfucker...TestTest Motherfucker...Test
Test Motherfucker...Test
 
Programación concurrente con GPars
Programación concurrente con GParsProgramación concurrente con GPars
Programación concurrente con GPars
 
Gradle vs Maven
Gradle vs MavenGradle vs Maven
Gradle vs Maven
 
Greach 2011 : Creando Plugins Con Griffon
Greach 2011 : Creando Plugins Con GriffonGreach 2011 : Creando Plugins Con Griffon
Greach 2011 : Creando Plugins Con Griffon
 

Recently uploaded

A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersNicole Novielli
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfSo einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfpanagenda
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteDianaGray10
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningLars Bell
 
Exploring ChatGPT Prompt Hacks To Maximally Optimise Your Queries
Exploring ChatGPT Prompt Hacks To Maximally Optimise Your QueriesExploring ChatGPT Prompt Hacks To Maximally Optimise Your Queries
Exploring ChatGPT Prompt Hacks To Maximally Optimise Your QueriesSanjay Willie
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxLoriGlavin3
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxLoriGlavin3
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
What is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfWhat is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfMounikaPolabathina
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxLoriGlavin3
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...
Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...
Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...Scott Andery
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfLoriGlavin3
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPathCommunity
 

Recently uploaded (20)

A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software Developers
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfSo einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test Suite
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine Tuning
 
Exploring ChatGPT Prompt Hacks To Maximally Optimise Your Queries
Exploring ChatGPT Prompt Hacks To Maximally Optimise Your QueriesExploring ChatGPT Prompt Hacks To Maximally Optimise Your Queries
Exploring ChatGPT Prompt Hacks To Maximally Optimise Your Queries
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
What is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfWhat is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdf
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...
Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...
Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdf
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to Hero
 

GraphQL and Groovy