Share
Embed
Transcript
58 slides
-
ϚΠΫϩαʔϏε? • > ThoughtWorksࣾͷϚʔνϯɾϑΝ ϥʔͱδΣʔϜεɾϧΠε͕࠷ॳʹఏএ ͨ͠ιϑτΣΞΞʔΩςΫνϟͰ͢ɻ ϞϊϦγοΫʢҰຕؠʣͳΞʔΩςΫ νϟΛɺϏδωεػೳʹԊͬͯෳͷখ ͍͞ʮϚΠΫϩαʔϏεʯʹׂ͠ɺͦ ΕΒΛ࿈ܞͤ͞ΔΞʔΩςΫνϟʹ͢Δ
͜ͱͰɺਝͳσϓϩΠɺ༏Εͨճ෮ੑ εέʔϥϏϦςΟͱ͍ͬͨརΛ࣮ݱ ͠Α͏ͱ͢ΔͷͰ͢ɻ ϚΠΫϩαʔϏεΞʔΩςΫνϟ(O'Reilly) -
ϚΠΫϩαʔϏεͷ࿈ܞ > In short, the microservice architectural style is an
approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. => HTTPϦιʔεΛ༻ͨܰ͠ྔAPIͰ௨৴ Microservices @Martin Fowler, @James Lewis https://martinfowler.com/articles/microservices.html -
RESTful API > RESTful APIͱɺWebγεςϜΛ֎෦͔Βར༻͢ΔͨΊͷϓϩάϥϜͷ ݺͼग़͠ن(API)ͷछྨͷҰͭͰɺRESTͱݺΕΔઃܭݪଇʹैͬͯࡦఆ ͞ΕͨͷɻRESTͦͷͷద༻ൣғͷ͍நతͳϞσϧ͕ͩɺҰൠత ʹRESTͷߟ͑ํΛWeb APIʹద༻ͨ͠ͷΛRESTful APIͱݺΜͰ͍Δ
> URL/URIͰͯ͢ͷϦιʔεΛҰҙʹࣝผ͠ɺηογϣϯཧঢ়ଶཧ ͳͲΛߦΘͳ͍(εςʔτϨε)ɻ > Ϧιʔεͷૢ࡞HTTPϝιουʹΑͬͯࢦఆ͞Εɺ݁ՌXMLHTMLɺ JSONͳͲͰฦ͞ΕΔɻ·ͨɺॲཧ݁ՌHTTPεςʔλείʔυͰ௨͢ Δͱ͍͏ݪଇؚ͕·ΕΔ͜ͱ͋Δɻ e-Words http://e-words.jp/w/RESTful_API.html * Ҏ߱লུͷͨΊRESTful APIΛREST APIͱهࡌ͠·͢ -
ϙΠϯτ • Web APIͱͯ͠Α͘ΘΕΔ • ϦιʔεΛURL/URIͰҰҙࣝผ • ૢ࡞: HTTPϝιου •
݁Ռ: XMLɺHTMLɺJSON + HTTPεςʔλείʔυ • ઃܭݪଇ:̋ ༷:✕ -
Q1. όʔδϣχϯάઃܭ Q. APIͷόʔδϣχϯάͲ͏ߦ͏ʁ 1. URLʹຒΊࠐΉ 2. ύϥϝʔλͱͯ͢͠ 3. HTTP
HeaderΛ༻͢Δ 4. ͦͷଞ -
Q3. ΤϥʔAPIઃܭ • Q. σʔλߋ৽࣌ʹDBͷഉଞϩοΫΤϥʔ͕ൃੜͨ࣌͠ͷεςʔλε ίʔυ? 1. DBΤϥʔͳͷͰɺγεςϜΤϥʔͱͯ͠500 2. γεςϜతʹແ͍ঢ়ଶͰൃੜ͢ΔͷͰϢʔβʹϦτϥΠ͠
ͯΒ͏ͨΊ400+ϝοηʔδ 3. ϝοηʔδͰϓϩάϥϜతʹϋϯυϦϯά͠ʹ͍ͷͰ409ͳͲ 4. ͦͷଞ -
ઃܭܳज़ > ϓϩάϥϚʔ͕2ਓ͍ͯɺ2ਓͱ ઃܭʹ͍ͭͯڞ௨ͷߟ͑Λ࣋ͬ ͍ͯͨͱͯ͠ɺಉ͡Λղ͘ ࣌ʹղܾࡦͷίʔυ·Ͱಉ͡ʹͳ Δͱ͜·ͣ͋Γ·ͤΜɻ ࢤΛಉͨ͛ܳ͘͡͠ज़Ո͕ͨͪಛ ผͳΞϓϦέʔγϣϯΛ࡞Γ্͛ ΔࣄͰ͢ɻ
=> ݸਓʹΑͬͯࠨӈ͞ΕΔ ΦϒδΣΫτࢦઃܭ࣮ફΨΠυ(ٕज़ධࣾ) -
RESTfulͳઃܭͷҙຯ • Web APIʹ͓͍ͯҰఆͷઃܭݪଇΛఏڙ ɹ=> ݪଇ͚ͩͰදݱ͖͠Εͳ͍߹͋Δ ɹ=> σʔλͱϦιʔεͷมΠϯϐʔμϯε ϛεϚονΛղফ͢ΔΑ͏ͳ࡞ۀ *1
RESTͷΠϯϐʔμϯεϛεϚον https://togetter.com/li/14062 -
ઃܭ͢ΔͨΊʹ • REST APIΛΔ • ཧղ͕͍ͱ֦ுੑɺอकੑ͕ѱ͍ • ؔऀͷίϯςΩετΛҰகͤ͞Δ • ίϯςΩετ͕ͣΕ͍ͯΔͱ͕ٞൃࢄͯ͠ਐ·
ͳ͍ • ΫϥΠΞϯτ͕֤API͝ͱʹ༷ཧղ͕ඞཁʹͳΔ -
࠷ݶͷࣝᶃ • جຊࣝɺΨΠυϥΠϯ • WebΛࢧ͑Δٕज़(ٕज़ධࣾ) • RESTful WebαʔϏε(O'Reilly) • Web
API: The Good Parts(O'Reilly) • Microsoft REST API Guidelines • https://github.com/Microsoft/api-guidelines/blob/master/ Guidelines.md • Google API Design Guide • https://cloud.google.com/apis/design/ -
࠷ݶͷࣝᶄ • ͦͷଞ࣌ͷྲྀΕ • GoogleɺMicrosoftɺAmazonɺTwitterɺFacebookɺ NetflixͳͲେखاۀͷAPIߏ • DropboxRESTΛΊɺAWSͷҰ෦APIRESTΛ࠾༻͠ ͍ͯͳ͍ •
https://medium.com/@voluntas/http-api-ͷઃܭํ -7ccaca671d9d -
ઃܭͷϙΠϯτ • URLɺύϥϝʔλɺΤϥʔͳͲͷઃܭ • جຊతͳઃܭཧɺ࣌ͷಈɺٕज़ελοΫɺ৫ؒͷؔੑ • ֤ݴޠ͝ͱͷมϥΠϒϥϦɺαʔόɺΫϥΠΞϯτͷબఆɺઃܭɺӡ༻ݕ౼ • όϦσʔγϣϯ •
͢Δ or ͠ͳ͍͔: ͢ΔͳΒ֤ݴޠͷػೳൺֱɺϥΠϒϥϦɺӡ༻ݕ౼ • υΩϡϝϯτɺπʔϧ܈ • SwaggerɺAPI BlueprintɺRAMLɺJSON (Hyper)SchemeɺಠࣗܗࣜͳͲͷػೳൺֱɺ ϥΠϒϥϦɺӡ༻ݕ౼ • ೝূɺೝՄ • ࠷ۙͷಈɺ֤ݴޠͷػೳൺֱɺϥΠϒϥϦɺӡ༻ݕ౼ • ςετ • ϢχοτςετɺΠϯςάϨʔγϣϯςετɺE2EɺϞοΫɺConsumer-Driven Contracts • ΠϯϑϥɺωοτϫʔΫɺAPIήʔτΣΠɺࢹɺϩΪϯάɺτϨʔγϯά… -
తͱखஈ • RESTʹΑΔઃܭཧखஈͰɺతͰͳ͍ • ֎෦ެ։͢Δϑϩϯτผͱͯ͠ɺόοΫΤϯυ·Ͱ༏ΕͨRESTઃܭ ཧʹൃల͕ͪ͠ • RESTҰఆͷݪଇΛͨΒ͢ͷͷɺͦΕͳΓͷࣗ༝ΔͨΊɺ ຊ࣭Ͱͳ͍෦ʹ͕͔͔࣌ؒͬͯ͠·͏ •
ඞવతʹؔ࿈͢ΔπʔϧνΣΠϯɺΤίγεςϜͱ࣭֨ࠩɺݕূ ࡞ۀ͕૿͑Δ • ઃܭࢥʹ͑ͳ͍ɺଞʹߟ͑ͳ͍ͱ͍͚ͳ͍͜ͱࢁ΄Ͳ͋Δ -
ͳͥREST APIͩͬͨͷ͔ • ϑϩϯτΤϯυͰΘΕΔٕज़Λͦͷ··͑Δ • ϒϥβπʔϧ͔Β؆୯ʹѻ͑Δ • HTTPϝιουΛ༻͢Δ͜ͱͰɺҰ؏ੑͷ͋Δૢ࡞Λߦ ͏͜ͱ͕Ͱ͖Δ •
APIʹΑ͘ΘΕΔJSONJavaScript͔Βѻ͍͍͢ => ϓϩάϥϜಉ࢜ͷ௨৴ͱͳΔόοΫΤϯυAPIͰඞਢ ཁ݅Ͱͳ͍ -
Web APIσβΠϯͷమଇ >Web APIͷΞʔΩςΫνϟελΠϧʹ RESTɺRPCɺSOAPͳͲ͕͋Δ > RPCελΠϧͷಛ: Remote Procedure
Callͷ໊લͷ௨Γɺ ϦϞʔτϗετͷؔΛݺͼग़͢Α͏ͳ ελΠϧɻҰൠతͳϓϩάϥϛϯάͷߟ ͑ํΛͦͷ··Ԡ༻͍͢͠ɻ > RPC͕͍͍ͯΔ߹: ΫϥΠΞϯτ͕ࣾʹݶఆ͞Ε͍ͯͨΓɺ SDKͷΑ͏ͳܗͰඞͣϥοϓ͞Ε͍ͯΔ ߹ -
Web APIσβΠϯͷమଇ >Web APIͷΞʔΩςΫνϟελΠϧʹ RESTɺRPCɺSOAPͳͲ͕͋Δ > RPCελΠϧͷಛ: Remote Procedure
Callͷ໊લͷ௨Γɺ ϦϞʔτϗετͷؔΛݺͼग़͢Α͏ͳ ελΠϧɻҰൠతͳϓϩάϥϛϯάͷߟ ͑ํΛͦͷ··Ԡ༻͍͢͠ɻ > RPC͕͍͍ͯΔ߹: ΫϥΠΞϯτ͕ࣾʹݶఆ͞Ε͍ͯͨ ΓɺSDKͷΑ͏ͳܗͰඞͣϥοϓ͞Εͯ ͍Δ߹ ຊʹඞཁͩͬͨͷ ϚΠΫϩαʔϏεͷΑ͏ͳڥ -
Web APIσβΠϯͷమଇ >Web APIͷΞʔΩςΫνϟελΠϧʹ RESTɺRPCɺSOAPͳͲ͕͋Δ > RPCελΠϧͷಛ: Remote Procedure
Callͷ໊લͷ௨Γɺ ϦϞʔτϗετͷؔΛݺͼग़͢Α͏ͳ ελΠϧɻҰൠతͳϓϩάϥϛϯάͷߟ ͑ํΛͦͷ··Ԡ༻͍͢͠ɻ > RPC͕͍͍ͯΔ߹: ΫϥΠΞϯτ͕ࣾʹݶఆ͞Ε͍ͯͨΓɺ SDKͷΑ͏ͳܗͰඞͣϥοϓ͞Ε͍ͯΔ ߹ gRPC (ޙड़) -
PRC? > ϓϩάϥϜ͔ΒผͷΞυϨε ۭؒʢ௨ৗɺڞ༗ωοτϫʔΫ ্ͷผͷίϯϐϡʔλ্ʣʹ͋ Δαϒϧʔνϯखଓ͖Λ࣮ߦ ͢Δ͜ͱΛՄೳʹ͢Δٕज़ > ϓϩάϥϚϩʔΧϧͳαϒ ϧʔνϯݺͼग़͠ͱجຊతʹಉ
͡ίʔυΛϦϞʔτݺͼग़͠ʹ ͍ͭͯߦ͏ Wikipedia https://ja.wikipedia.org/wiki/RPC -
දతͳRPC • Java RMI • XML-RPC • JSON-RPC • Apache
Thrift • gRPC -
දతͳRPC • Java RMI • XML-RPC • JSON-RPC • Apache
Thrift • gRPC ࠓճͷ -
gRPCͱ • Google͕ެ։ͨ͠RPCϑϨʔϜϫʔΫ • Google͕ࣾͰ༻͍ͯͨ͠RPCϑϨʔϜϫʔΫͷOSS൛ • Protocol Buffers *1ʹΑΓαʔϏεͷΠϯλʔϑΣΠεఆٛ •
αʔόɺΫϥΠΞϯτࣗಈੜ • ௨৴ϓϩτίϧ͕HTTP/2 • ߴ • ैདྷܕͷϦΫΤετ/ϨεϙϯεܗࣜҎ֎ʹ୯ํɺํ StreamingՄೳ *1. gRPCͷγϦΞϥΠβଞͷϑΥʔϚοταϙʔτ͍ͯ͠·͕͢ɺ͜ͷࢿྉͰProtocol BuffersΛ༻͢Δલఏ -
Protocol Buffers? • ߏԽ͞ΕͨσʔλΛγϦΞϥΠζ ͢ΔͨΊͷݴޠඇґଘͳϓϥοτ ϑΥʔϜ • IDL(ΠϯλʔϑΣΠεఆٛݴޠ) ʹΑΓهड़ •
ओཁͳݴޠͷιʔείʔυੜ • ߴɺܰྔ • ޙํޓੑͷ͋ΔγϦΞϥΠζϑΥʔ Ϛοτ • IDLʹΑΔߏఆٛ • γϦΞϥΠζ • σγϦΞϥΠζ -
ઌਓʹֶͿ • GoogleͷதͷσʔλશͯProtocol Buffersʹ ͳ͍ͬͯΔ • ϩάɺDBʹೖΕΔσʔλɺBigDataͷύΠϓϥ ΠϯʹProtocol Buffers rebuild.fm#169
@omo https://rebuild.fm/169/ -
gRPC࠾༻ࣄྫ • ւ֎ • Google • Square • Netflix •
CoreOS • Docker • Cisco • ࠃ • ϝϧΧϦ • GRPCͷ࣮ફͱݱঢ়Ͱͷརܽ *1 • AbeamTV • AbeamTVʹ͓͚ΔMicroservices *2 • υϫϯΰ • Protocol Buffers *3 *1. https://speakerdeck.com/kazegusuri/go-conference-2016-spring *2. http://www.slideshare.net/RyotaNishio/abematvmicroservices-architecture *3. http://tayama0324.github.io/slides/20161127-kbkz-tech.html#/ -
URLɾύϥϝʔλɾΤϥʔઃܭ • IDLΛ༻͠ɺҰൠతͳϓϩάϥϛϯάͷΑ͏ʹ هड़ • ఆٛࡁΈߏ • جຊܕ • repeatɺmapɺenum
• messageɺstreamɺserviceɺnestͳͲ • Τϥʔ • ༷ͱͯ͠ఆٛ *1 • ϥΠϒϥϦΈࠐΈ *2 *1. http://www.grpc.io/docs/guides/error.html *2. ex:Java) http://www.grpc.io/grpc-java/javadoc/io/grpc/Status.html -
υΩϡϝϯτཧɺπʔϧ • IDL͕ͦͷ··ΠϯλʔϑΣΠευΩϡϝϯτ • ؔ࿈ΤίγεςϜ • protoc-gen-doc: IDL͔ΒMarkdown, HTMLͳͲͷυΩϡϝϯτੜ*1 •
grpc-gateway: gRPCαʔό͔ΒJSONϨεϙϯεΛฦͨ͢ΊͷϦόʔεϓϩ Ωγ*2 • polyglot: grpcͷCLIΫϥΠΞϯτ*3 => IDL͔Β։ൃ͢ΔελΠϧ͕֬ఆ͍ͯ͠ΔͨΊɺͦΕΛϕʔεͱͯ͠Τίγες Ϝ͕ߏங͍͢͠ => ۀݻ༗ͷπʔϧͳͲͰੜ͢ΔίʔυͷݴޠΛબͰ͖ΔͨΊѻ͍͍͢ • *1. https://github.com/estan/protoc-gen-doc • *2. https://github.com/grpc-ecosystem/grpc-gateway • *3. https://github.com/grpc-ecosystem -
όϦσʔγϣϯ • ެࣜʹͳ͠(Protocol Buffers) • IDLͰఆٛͰ͖ΔόϦσʔγϣϯʹݶք͕͋Δ • ૬ؔόϦσʔγϣϯͳͲͷϩδοΫΛؚΉόϦσʔγϣϯʹධՁ͢Δ ͨΊͷॲཧܥ͕ඞཁ •
ೖྗνΣοΫ/ϏδωεϩδοΫͷڥքஅ͕͍͠ • ֤ݴޠɺαʔϏεؒΛލ͍ͩҰݩཧ࣮ϨϕϧͰͼ͕ੜ·Ε͢ ͍ • ϑϩϯτΤϯυͱҧͬͯɺ1จࣈೖྗ୯Ґͷଈ࣌௨ͳͲͳͯ͘Α͍ => ݱ࣌ͰIDLʹίϝϯτϕʔεͰهड़͢Δͷ͕ݱ࣮త? -
ςετ • ੜ͞ΕΔίʔυΛ׆༻ʢ࣮ݴޠґଘ͋Γʣ • ΫϥΠΞϯτ • αʔό • ΠϯλʔϑΣΠε •
ϞοΫ => ιʔείʔυੜΛߦ͏ͨΊɺ࣮ࡍʹ༻͢Δίʔυϕʔεͷςετ͕Մೳ • ςετʹϞοΫඞཁ͔ʁ • https://github.com/grpc/grpc-java/issues/ 1469#issuecomment-230852433 -
Other Pros • ܰྔɺߴͳγϦΞϥΠζ௨৴ • σʔλߏݴޠɺڥʹґଘ͢Δͷͷɺଟ͘ͷ߹XMLJSONΑ Γߴ • ετϦʔϛϯάαϙʔτ •
αʔόϓογϡେ༰ྔͷ௨৴ͳͲՄೳ • Protocol BuffersҎ֎ͷγϦΞϥΠζϑΥʔϚοτʹରԠ(JSONɺXMLͳͲ) • ΫϥΠΞϯτϩʔυόϥϯγϯά • ϔϧενΣοΫ -
Cons • ֶशίετ • RESTful APIઃܭɺӡ༻Λཏతʹཧղ͢Δͷʹൺগͳ͍͕ɺ༷ʹͦΕͳΓͷϘ ϦϡʔϜ => ॳظࢿ͋ͷͷɺͦΕΛ͑ΕRESTΑΓΑ͍ (ϝϧΧϦɺAbemaTV)
• γϦΞϥΠζ͞Ε͍ͯΔͨΊJSONͷΑ͏ʹؾܰʹݺͼग़͠ɺσόοάͰ͖ͳ͍ => grpc-gatewayɺpolyglotͳͲͷ׆༻ => ֤ΞϓϦέʔγϣϯͰΠϯλʔηϓλʔΛ͏ • ϒϥβ͔Β͑ͳ͍ => ϚΠΫϩαʔϏεόοΫΤϯυͰͳ͍ => ࠓ͙͢ඞཁͰ͋Εgrpc-gatewayɺকདྷతʹϒϥβରԠ*1ʹظ • HTTP/2पΓͷΠϯϑϥߏங => ΫϥυKubernetesͳͲϚωʔδυͳػೳͷڥ׆༻ *1. https://github.com/grpc/grpc-experiments/issues/159 -
Note • gRPC͕ϕετͱݶΒͳ͍ɺࣺͯΔ֮ޛඞཁ • gRPCʹݶΒͣίΞϩδοΫ͔Βɺ֎෦ґଘΛऔΓআ͘ • DDDϨΠϠʔԽΞʔΩςΫνϟ + DIPɺϔΩαΰφ ϧɺΫϦʔϯΞʔΩςΫνϟͳͲ
• ϑϩϯτΤϯυAPI(ϒϥβ͚)όοΫΤϯυͱผ ʹߟ͑Δ -
REST APIઃܭͱͷҧ͍ • جຊతʹαʔϏεؒͷΠϯλʔϑΣΠεఆٛ(IDL)Λ࠷ॳʹ࣮ࢪ => ݴޠʹඇґଘͰαʔϏεؒͷΠϯλʔϑΣΠε߹ҙΛߦ͏ελΠϧ => RESTͷݪଇɺΠϯϐʔμϯεϛεϚονղফͷͨΊͷཧͳͲඞཁͳ͘ɺ௨ৗͷϓϩάϥϛϯά Ϟσϧʹ͍ۙ =>
ܗࣜͷ౷Ұ͞ΕͨυΩϡϝϯτͱͯ͠׆༻Ͱ͖Δ • αʔόɺΫϥΠΞϯτࣗಈੜ͕جຊ => ݴޠ͝ͱͷϥΠϒϥϦબఆͳͲ͕ෆཁ => ௨৴෦ͷ࣮ෆཁ • Google͕։ൃͨ͠ͷ͋ΓɺϚΠΫϩαʔϏεʹඞཁͳػೳ͕ఆٛɺΈࠐΈͰ༻ҙ͞Ε͍ͯΔ • ΤϥʔɺೝূɺೝՄɺετϦʔϛϯάɺϩʔυόϥϯγϯάɺϔϧενΣοΫ… => αʔϏεؒ࿈ܞʹඞཁͳΈɺػೳͷଟ͕͘ఏڙ͞ΕΔɹɹ ɹ=> ػೳ࣮ʹूத͍͢͠ -
·ͱΊ • ϚΠΫϩαʔϏεͰैདྷͷγεςϜͷؔݺͼग़ͩͬͨ͠ॲཧ͕ɺωο τϫʔΫΛܦ༝ • ௨৴ʹHTTPΛ༻͍ͨAPI͕Α͘ΘΕΔ • RESTful API •
ेͳφϨοδɺΤίγεςϜ • ϑϩϯτΤϯυͱͷੑ • Ұఆͷݪଇͷఏڙ • gRPC • ϚΠΫϩαʔϏεʹٻΊΒΕΔ௨৴༷ͷఏڙ • αʔϏεؒ࿈ܞʹඞཁͳ࣮ͷੜ • େखاۀʹࢧ͑ΒΕͨ࠾༻࣮