Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up
for free
GoでGraphQLサーバを立てるぞ! / Building GraphQL server by go
Masahiro Wakame
August 10, 2018
Technology
15
3.9k
GoでGraphQLサーバを立てるぞ! / Building GraphQL server by go
mercari.go #2 登壇資料です
https://mercari.connpass.com/event/95665/
Masahiro Wakame
August 10, 2018
Tweet
Share
More Decks by Masahiro Wakame
See All by Masahiro Wakame
vvakame
1
350
vvakame
26
11k
vvakame
7
540
vvakame
13
1.2k
vvakame
3
7.3k
vvakame
4
600
vvakame
3
7.8k
vvakame
0
510
vvakame
19
3.2k
Other Decks in Technology
See All in Technology
kawaguti
0
120
mmarukaw
0
1.4k
y0hgi
1
390
oracle4engineer
0
2.7k
vkbaba
0
150
papix
0
130
shimacos
2
340
toshinoritakai
1
200
na2neko
0
110
yokatsuki
1
190
smzksts
0
240
pinboro
0
2.2k
Featured
See All Featured
jensimmons
207
10k
eileencodes
113
25k
revolveconf
200
9.6k
jonrohan
1021
380k
bkeepers
408
57k
nonsquared
81
3.3k
keavy
106
14k
morganepeng
17
1.1k
andyhume
62
3.4k
marktimemedia
6
330
morganepeng
92
14k
rasmusluckow
318
18k
Transcript
GoͰGraphQLαʔόΛཱͯΔͧʂ mercari.go #2 Θ͔Ί ·͞ͻΖ #mercarigo bit.ly/2vyiluP
Θ͔Ί ·͞ͻΖ @v vakame Masahiro Wakame GAE/Go TypeScript ٕज़ॻయ
TL;DR •GraphQLͬͯԿʁ •GitHub v4 APIΛ৮ͬͯΈΔ •github.com/99designs/gqlgen •ઃܭϕετϓϥΫςΟε ΫϥΠΞϯτͷ͠ͳ͍
GraphQLͬͯԿʁ ࡉ͔͍͜ͱ ࠷ޙͷࢀߟࢿྉूͰʂ
GraphQLͬͯԿʁ •Facebook͕2015ʹެ։༷ͨ͠ •άϥϑߏʹର͢ΔQuery Language •༑ୡͷ༑ୡΛ5ਓͣͭऔಘ͢Δͱ͔ •Client→Serverͷσʔλཁٻ࣌ʹ͏
GraphQLͬͯԿʁ RESTͳΒ3RPCඞཁ GraphQLͳΒ1ճ { circle(id: "Q2lyY2xlRXhoaWJpdEluZm86MTIzNAo") { name spaces penName
webSiteURL genre genreFreeFormat products(first: 9) { pageInfo { hasNextPage endCursor } nodes { name description type page price relatedURLs firstAppearanceEventName firstAtTechBookFest images { url height width } } } loginUserChecked { checked } } }
େࣄͳ͜ͱ •ΘΓͱ੍͋Δ (N+1ରࡦͱ͔) •ແݶʹૣ͘ͳ͍ •REST APIͷ্ҐޓͰͳ͍ •ࠩҟΛΑ͘ཧղ͠Α͏
ϝϧΧϦͰͬͯΔʁ •C Sπʔϧ PHP+webonyx/graphql-php •US ϝϧΧϦWeb ??? •MicroserviceԽ CSπʔϧ Go+gqlgen
•ϝϧΧϦWeb Node.js+Apollo •ϝϧϖΠ CSπʔϧ(ݕ౼த) Go+gqlgen ٕज़ॻయWeb࣮ݧதͰ͢
ClientͷྲྀΕ •·ͣSchema(+αʔό)͕͋Δ •ͦ͜ʹOperationΛ͛Δ •Query, Mutation, Subscribe ͷ3छ •ཁٻͨ͠௨ΓͷܗࣜͰσʔλདྷΔ
Queryͷྫ { viewer { id login name location bio company
repositoriesContributedTo(first: 2) { nodes { owner { login } name } } } } { "data": { "viewer": { "id": "MDQ6VXNlcjEyNTMzMg==", "login": "vvakame", "name": "Masahiro Wakame", "location": "Tokyo, Japan", "bio": "TypeScript and GAE/Go", "company": "Merpay, Inc.", "repositoriesContributedTo": { "nodes": [ { "owner": { "login": "mruby" }, "name": "mruby" }, { "owner": { "login": "DefinitelyTyped" }, "name": "DefinitelyTyped" } ] } } } } ରԠͨ͠ߏ͕ฦΔ
ClientͷྲྀΕ •ͭ·Γ… •ΫΤϦʹΑͬͯಘΒΕΔσʔλ͕มΘΔ •ΫΤϦݸผʹฦΓͷσʔλͷܕཉ͍͠ •→ݴޠʹΑ͍ͬͯͮΒ͍Մೳੑʁ ·͊JSͱ૬ੑྑͦ͞͏ͳͷΘ͔Δ
ͬ͘͟ΓServerݪཧ •Query͕དྷΔ •ฦ͢σʔλTreeߏʹͳΔ •Treeͷઅ(ͱ͔)ຖʹResolverΛఆٛ͢Δ •Resolver͕ཁٻ͞ΕͨNodeΛੜ͠ฦ͢ •Resolverͷू߹ == αʔόͷ࣮
ͬ͘͟ΓServerݪཧ type ResolverRoot interface { Query() QueryResolver User() UserResolver CircleExhibitInfo()
CircleExhibitInfoResolver ProductInfo() ProductInfoResolver } type QueryResolver interface { Circle(ctx context.Context, id string) (*CircleExhibitInfo, } type CircleExhibitInfoResolver interface { ID(ctx context.Context, obj *CircleExhibitInfo) (string, err Products(ctx context.Context, obj *CircleExhibitInfo, first } type ProductInfoResolver interface { ID(ctx context.Context, obj *ProductInfo) (string, error) Images(ctx context.Context, obj *ProductInfo) ([]Image, erro } query { circle(id: "Q2lyY2xlRXhoaWJpdEluZm86MTIzNAo") { name spaces penName webSiteURL genre genreFreeFormat products(first: 9) { pageInfo { hasNextPage endCursor } nodes { name description type page price relatedURLs firstAppearanceEventName firstAtTechBookFest images { url height width } } } loginUserChecked { checked } }
ͬ͘͟ΓServerݪཧ Resolverͷू߹ ʹ αʔόͷ࣮
͖͜͜ •୯ҰΤϯυϙΠϯτ •Introspection •SchemaΛΔʹGraphQL͕͑Δ •ڧ͍ܕ͚ʂ
GitHub v4 APIΛ৮Δ
৮Γ·͠ΐ͏ •developer.github.com/v4/explorer/ •GraphiQLʹ৮ΕΔ •GitHubͷߟ͑ͨ࠷ڧͷઃܭʹ৮ΕΔ •͋ΘΑͬͯ͘ΈΔ
σϞ •ϩάΠϯϢʔβͷ໊લग़͢ •ҙͷϦϙδτϦ͕࡞ΒΕͨग़͢ •GraphQLʹؔ࿈ͷ͋ΔUserΛநग़͢Δ
ίʔυ͔Β •దʹPOST͢Δ͚ͩ •Authorization: bearer ${PersonalAccessToken} •https://api.github.com/graphql •https://github.com/settings/tokens bit.ly/2Oo8DlD
github.com/99designs/gqlgen I’m committer!
ͳͥGoͳͷ͔ʁ •Go͍͠ฒߦॲཧ؆୯ͩ͠ •Microservice܈͕GoͳͷͰ…ʂ •GAE/GoͰಈ͘ͷͰ…ʂ •ࣾʹPHPNode.js͍·͢ •Frontend Engineer
GoओཁϥΠϒϥϦൺֱ •github.com/graph-gophers/graphql-go •github.com/graphql-go/graphql •github.com/samsarahq/thunder •github.com/99designs/gqlgen
GoओཁϥΠϒϥϦൺֱ •github.com/graph-gophers/graphql-go •github.com/graphql-go/graphql •github.com/samsarahq/thunder •github.com/99designs/gqlgen ػೳ͕ͪΐͬͱශऑ GoͷίʔυͰSchemaॻ͖ͨ͘ͳ͍ ಉ্ ΘΓͱྑͦ͞͏ʁ
ͳͥgqlgen͔ʁ •ϘΠϥʔϓϨʔτݏʂ •શίʔυੜݏʂ •ίʔυੜ+खॻ͖ΛఔΑ͘… •ΑΖ͍͠ͳΒgqlgenͩʂ
gqlgenྑ͍ͷ͔ʁ ྑ͘͠·ͨ͠❤ Ͱcommitterʹͳͬͨ
gqlgenͷαϙʔτൣғ •Query •Mutation •Subscription •Directive •import syntax •type extend ͋Δ
΄͍͠ ͦͷ͏ͪΓ·͢ committer͔ͩΒͶ
σϞ •gqlgen init ͯ͠ΈΔ •มߋΛՃ͑ͯΈΔ •gqlgen gen ͯ͠ΈΔ •࣮ࡍʹୟ͍ͯΈΔ ࣌ؒ…͋Δʁ
gqlgen.com/ getting-started/
ύʔπͷղઆ •Resolver •Directive •Middleware •ErrorPresenter
ύʔπͷղઆ •Resolver •Directive •Middleware •ErrorPresenter ੜ͞Εͨinterface࣮ͯ͠ʂ ੜ͞ΕͨDirectiveʹ࣮Λ༩͑ͯʂ దʹϩΪϯάͱ͔ʹ͑·͢ ΤϥʔͷΧελϚΠζͰ͖·͢ gitter.im/gqlgen/Lobby
gqlgen.com
Middleware •ResolverMiddleware •Resolverͷಈ࡞લޙʹॲཧΛڬΉ •RequestMiddleware •Req,RespʹॲཧΛڬΉ(ओʹϩΪϯά) bit.ly/2MmjbEE
ઃܭϕετϓϥΫςΟε ຊʹϕετ͔͠ΒΜʂ
RelayΛษڧ͢͠ •RelayΛ࠾༻͠ͳͯ͘ษڧͯ͠ •Server͚ͩߟ͑ΔͱΠϛϑͳ༷͕͋Δ •ओʹFragmentपΓ •UIଆΛඒ͘͠ઃܭ͢ΔͨΊ TSαϙʔτ͖ͨ github.com/facebook/relay/pull/2293
RelayΛษڧ͢͠ •Relay spec 3ܑఋ •cursor, global object, input object •specຊମ͡Όͳ͍ͷͰཤमಀ͕ͪ͠
•GitHub౿ऻ͍ͯ͠Δ •bit.ly/2npeSdv
N+1 •Πϕϯτ3ͭ×αʔΫϧ100݅×൦9ݸ •1+3×1+3×100×1 = 304ճͷDBΞΫηε •ؤுͬͯ࠷దԽ͢Δͱ 1+1+1 ??
N+1 •gqlgenResolverΛฒྻॲཧ͢Δ •→ू͕͍͠ʂ •github.com/vektah/dataloaden •ࢦఆظؒͷϦΫΤετΛҰׅԽ •·ͩະධՁ… ྑ͍ํ๏ࢥ͍ͭ͘ʁ
REST APIͱͷରൺ •REST API = RPC •GraphQL = QueryLanguage •Τϥʔʹର͢Δߟ͑ํ͕ࠜຊతʹҧ͏
•“ਖ਼͍͠Requestͷ͛ํ” ͱ͍͏֓೦ •ڻ͖࠷খͷݪଇ & σόοΨϏϦςΟ
REST APIͱͷରൺ •Τϥʔʹର͢Δߟ͑ํϚδॏཁ •େࣄͳ͜ͱͳͷͰ2ճݴ͍·ͨ͠ •GraphiQLͰ݁͢ΔσόοΨϏϦςΟ •੍ޚͳΔ͘DirectiveϨϕϧͰ ϑϧεΫϥονͰ͖ΔͳΒͦΕ͕Α͍
Schemaઃܭ •Schema͔ΒಡΈऔΕΔใΛ૿͢ •DirectiveΛͬͨScope੍ޚͱ͔ •DBͷ1table=1typeʹ͢Δͱ͔ •มʹ߹ମͤͨ͞Γׂͨ͠Γ͠ͳ͍
AuthपΓ •ಛʹܾ·༷͕ͬͨͳ͍ •ͷͰɺී௨ʹHTTP͢Δ •ηογϣϯ, OAuth2 etc…
·ͩΘ͔ΒΜ
ςετͲ͏͢Δʁ •ࠓͷͱ͜Ζgolden testingͯ͠Δ •Resolver, DirectiveΛݸผʹςετʁ
Mock? •αʔόଆ࣮͕͋ͱʹͳΔ߹ •ΫϥΠΞϯτଆʹͲ͏ ָͤ͞Δ͖ʁ
BFF vs ࣮ •جຊ࣮ͷ΄͏ָ͕ͦ͏ •Backend Engineerతʹ •Microserviceͷͱ͖ʁ •݁ہBFFతଘࡏʹͳΔͷͰ…ʁ
ӡ༻ͷ •ϝτϦΫεऔΓ͍ͨʁ •ϩάऔΓ͍ͨʁ •statsੳ͍ͨ͠ʁ
ΫϥΠΞϯτଆϫʔΫϑϩʔ •ͳʹ͔Θ͔ΒΜ •ಛʹAndroid, iOSͷݟ͕ͳ͍ •Webదʹͬͯ΄͍͠
ࢀߟࢿྉ
ࢀߟࢿྉू •b.hatena.ne.jp/vvakame/GraphQL •graphql.org •www.howtographql.com •ٕज़ॻయ5Ͱຊग़͢…ʁ(མͪͳ͍Ͱ ͜Ε͖͢
͓͠·͍