Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
grpc-swiftの紹介
Search
tanako
May 23, 2018
Technology
1.9k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
grpc-swiftの紹介
tanako
May 23, 2018
More Decks by tanako
See All by tanako
タイミーiOSアプリへの Swift Concurrency 導入までの軌跡
_tanako
4
2.2k
SwiftPM Integration into Xcode
_tanako
0
190
roppongiswift6.pdf
_tanako
1
460
iOSエンジニアの為のgrpc-swift入門
_tanako
6
5.4k
How to write basic unittests
_tanako
0
260
Other Decks in Technology
See All in Technology
PQC移行の今 -- IETF からみた現在地
satokan
4
700
メルカリにおけるAI時代の高速プロトタイピング基盤「Arca」
ryotarai
18
13k
TiDBファミリーにDWHが新登場!! TiDB最新情報 / TiDB update 202609
yoshiakiyamasaki
0
160
大阪オフィスに Unitree Go2 がやってきたので Physical AI やってみた
dafujii
0
160
【データ横丁主催】AI Agentがコンテキストを使って仕事をした後、何が残るのか― 組織の経験を次の判断に引き継ぐ「Agent Memory」
shisyu_gaku
2
280
Meet AgentCore Identity Consent Portal
hironobuiga
2
140
プラットフォームを「作る」、 チームに「入り込む」
sansantech
PRO
0
400
DORA_Metrics.pdf
wagnerfusca
1
140
Codex概要
ymiya55
0
110
AI Native Platform Engineering 〜PlatformとAgileで“作る速さ”を“価値”へ〜
uya116
0
520
Mastering Agentic Development: Harness Engineering for Effective Coding Agents
konippi
3
660
Claude起点の仕様駆動開発
tanakaseiya
0
230
Featured
See All Featured
Abbi's Birthday
coloredviolet
4
10k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
340
Believing is Seeing
oripsolob
1
230
Statistics for Hackers
jakevdp
799
230k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
530
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
960
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
580
Bash Introduction
62gerente
615
220k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
1
540
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
20k
Side Projects
sachag
456
43k
Transcript
gRPC-swiftͷհ Origami ాத @tikidunpon ROPPONGI.swift ୈ3ճʢOrigamiɾVISITSڞ࠵ʣ
gRPCͱʁ
gRPCͱʁ • Google͕։ൃͨ͠RPCϑϨʔϜϫʔΫ • σϑΥϧτHTTP/2্Ͱಈ࡞ • σϑΥϧτͷIDLʢΠϯλʔϑΣʔεهड़ݴޠʣʹProtocol BuffersΛ࠾༻ • ෳݴޠʹରԠ
ͦͦRPCͱʁ
RPCͱʁ • Remote Procedure Callͷུ • ϓϩάϥϜ͔ΒผͷΞυϨεۭؒʹ͋ΔϓϩάϥϜΛ࣮ߦՄೳ ʹ͢Δٕज़
RPCͱʁ • ͬ͘͟Γͱͨ͠ྺ࢙
Protocol Buffersͱʁ • Google͕։ൃͨ͠IDLʢΠϯλʔϑΣʔεهड़ݴޠʣ • ௨৴ӬଓԽͰͷར༻Λతͱͨ͠γϦΞϥΠζϑΥʔϚοτ • .protoϑΝΠϧʹαʔϏεͱϝοηʔδΛܕ͖Ͱఆٛ • proto2Ͱoptional/requiredͳͲ͕දݱͰ͖ͨ
• ࠷৽ͷproto3ͰAPIઃܭͷ୯७Խɺ҆ఆԽɺύϑΥʔϚϯε্ ͷͨΊআ͞Εͨ
Protocol Buffersͱʁ syntax = "proto3"; // όʔδϣϯఆٛ service Greeter {
// αʔϏεఆٛ rpc SayHello (HelloRequest) returns (HelloReply) {}ɹ // RPCϝιουఆٛ } message HelloRequest {ɹ// ϦΫΤετϝοηʔδఆٛ string name = 1; // ϑΟʔϧυܕ ϑΟʔϧυ໊ ϑΟʔϧυ൪߸ } message HelloReply { // Ϩεϙϯεϝοηʔδ string message = 1; }
gRPCଞͷRPCͱԿ͕ҧ͏ͷ͔ʁ
gRPCͷઃܭݪଇͱཁ݅
gRPCͷઃܭݪଇͱཁ݅ • αʔϏεΦϒδΣΫτͰͳ͘ɺϝοηʔδࢀর͞Εͳ͍ ϚΠΫϩαʔϏεͱࢄΦϒδΣΫτͷୈ1๏ଇͱࢄΦϒδΣ Ϋτͷམͱ݀͠Λආ͚ɺγεςϜؒͰૈཻʹϝοηʔδΛަ ͢ΔϚΠΫϩαʔϏεઃܭֶΛଅਐ͢Δɻ
gRPCͷઃܭݪଇͱཁ݅ • ΧόϨοδ&γϯϓϧ͞ ීٴ͍ͯ͠ΔશϓϥοτϑΥʔϜͰ؆୯ʹ։ൃͰ͖ΔɺCPUͱ ϝϞϦ͕ݶΒΕͨσόΠεͰ࣮ߦͰ͖Δɻ • ϑϦʔ&Φʔϓϯ جຊతͳػೳΛͯ͢ແྉͰ༻Ͱ͖ɺͯ͢ͷՌΛOSS ͷऔΓΈͱͯ͠ɺٕज़ͷ࠾༻Λ͛ͳ͍Α͏ͳϥΠηϯεͰ ղ์͢Δ͜ͱɻ
gRPCͷઃܭݪଇͱཁ݅ • ૬ޓӡ༻ੑ&Ϧʔν ϫΠϠϓϩτίϧɺҰൠతͳΠϯλʔωοτΠϯϑϥετϥ ΫνϟΛӽ͑ͯଘଓ͢Δ͜ͱ͕Ͱ͖Δ͜ͱɻ • ൚༻ੑ&ύϑΥʔϚϯε ٕज़ελοΫɺϢʔεέʔεݻ༗ͷRPCελοΫͱൺֱͯ͠ ύϑΥʔϚϯεΛ΄ͱΜͲଛͳ͏͜ͱͳ͘ɺ෯͍Ϣʔεέʔ εʹద༻ՄೳͰ͋Δ͜ͱɻ
gRPCͷઃܭݪଇͱཁ݅ • ϨΠϠԽ ελοΫͷॏཁͳ෦ɺಠཱͯ͠ਐԽͰ͖Δ͜ͱɻϫΠϠϑ ΥʔϚοτͷվగɺΞϓϦέʔγϣϯϨΠϠͷόΠϯυΛ ͍͚͛ͯͳ͍ɻ
gRPCͷઃܭݪଇͱཁ݅ • ϖΠϩʔυඇґଘ ༷ʑͳαʔϏεͰProtocol BuffersɺJSONɺXMLɺThriftͳͲ ҟͳΔϝοηʔδλΠϓͱΤϯίʔσΟϯά͕ඞཁͱͳΔɻϓ ϩτίϧͱ࣮͜ΕΛՄೳʹ͢Δ͜ͱɺಉ༷ʹࠩ͠ସ͑Մೳ ͳϖΠϩʔυͷѹॖϝΧχζϜΛఏڙ ͢Δ͜ͱɻ
gRPCͷઃܭݪଇͱཁ݅ • ετϦʔϛϯά ετϨʔδγεςϜετϦʔϛϯάͱϑϩʔ੍ޚʹґଘͯ͠ େنͳσʔληοτΛදݱ͢Δɻvoice-to-textגՁࢦͳͲ ͷଞͷαʔϏεɺ࣌ؒతʹؔ࿈͢Δϝοηʔδɾγʔέϯε Λද͢ετϦʔϛϯάʹґଘ͢Δɻ
ετϦʔϛϯάͷछྨ RPC ϦΫΤετ Ϩεϙϯε ར༻ྫ Unary 1 1 ୯७ͳrpc Server
streaming 1 n ϑΟʔυ৴ɺα ʔόʔPush Client streaming n 1 ෳσʔλૹ৴ Bidirectional streaming n n speech-to-textɺν ϟοτ
gRPCͷઃܭݪଇͱཁ݅ • ϒϩοΩϯά&ඇϒϩοΩϯά ΫϥΠΞϯτͱαʔόʔͰަ͞ΕΔҰ࿈ͷϝοηʔδͷඇಉ ظ/ಉظॲཧͷ྆ํΛαϙʔτ͢Δɻ͜Εɺಛఆͷϓϥοτϑ ΥʔϜͰͷετϦʔϜͷεέʔϦϯάͱॲཧʹෆՄܽͱͳ Δɻ
gRPCͷઃܭݪଇͱཁ݅ • Ωϟϯηϧ&λΠϜΞτ ΦϖϨʔγϣϯίετ͕ߴ͘ɺ͔͔࣌ؒΔՄೳੑ͕͋Δɻ ΩϟϯηϧΫϥΠΞϯτ͕ਖ਼͘͠ৼΔ͑αʔόʔ͕Ϧι ʔεΛ࠶ར༻Ͱ͖ΔΑ͏ʹ͢Δɻ ຢɺҼՌؔͷ࿈͕͞ ΕΕɺΩϟϯηϧΧεέʔυͰ͖ΔɻΫϥΠΞϯτɺα ʔϏε͕ΫϥΠΞϯτͷχʔζʹ߹Θͤͯಈ࡞ΛௐͰ͖ΔΑ ͏ɺgRPCݺͼग़͠ͷλΠϜΞτΛࢦࣔ͢Δ͜ͱ͕͋Δɻ
gRPCͷઃܭݪଇͱཁ݅ • ϨʔϜμοΫԽʢແޮԽʣ ৽͍͠ϦΫΤετΛڋ൱͠ɺਐߦதͷॲཧΛܧଓ͠ͳ͕Βαʔ όΛਖ਼ৗʹγϟοτμϯ͢Δඞཁ͕͋Δɻ ʢ͍ΘΏΔGraceful Shutdownʣ
gRPCͷઃܭݪଇͱཁ݅ • ϑϩʔ੍ޚʢྲྀྔ੍ޚʣ ίϯϐϡʔςΟϯάͷύϫʔͱωοτϫʔΫ༰ྔɺΫϥΠΞ ϯτͱαʔόʔͷؒͰෆۉߧʹͳΓ͕ͪɺϑϩʔ੍ޚʹΑΓɺ όοϑΝཧ্͕͠ɺաʹΞΫςΟϒͳϐΞʹΑΔDOS͔ Βͷอޢ͕ՄೳͱͳΔɻ
gRPCͷઃܭݪଇͱཁ݅ • ϓϥΨϒϧ ϫΠϠϓϩτίϧɺػೳ͢ΔAPIΠϯϑϥετϥΫνϟͷҰ෦ ʹ͗͢ͳ͍ɻ େنͳࢄγεςϜʹɺηΩϡϦςΟɺϔϧ ενΣοΫɺϩʔυόϥϯγϯάͱϑΣʔϧΦʔόʔɺࢹɺ τϨʔεɺϩάͳͲ͕ඞཁͱͳΔɻ ࣮Ͱɺ͜ΕΒͷػೳͷϓϥάΠϯΛՄೳʹ͢Δ֦ுϙΠϯ τͱɺ༗༻ͳ߹σϑΥϧτͷ࣮Λఏڙ͢Δඞཁ͕͋Δɻ
gRPCͷઃܭݪଇͱཁ݅ • APIͱͯ͠ͷ֦ு αʔϏεؒͷ࿈ܞ͕ඞཁͳ֦ுػೳɺՄೳͰ͋Εϓϩτί ϧ֦ுͰͳ͘APIΛ༻ͨ͠ํ͕·͍͠ ͜ͷλΠϓͷ֦ு ʹɺϔϧενΣοΫɺαʔϏεΠϯτϩεϖΫγϣϯɺෛՙ ࢹɺ͓ΑͼϩʔυόϥϯγϯάͷׂΓؚ͕ͯ·ΕΔɻ
gRPCͷઃܭݪଇͱཁ݅ • ϝλσʔλަ ೝূτϨʔεͷΑ͏ͳɺྑ͋͘Δԣஅతؔ৺ࣄɺαʔϏε ͷએݴ͞ΕͨΠϯλϑΣʔεͷҰ෦Ͱͳ͍σʔλͷަʹґ ଘ͍ͯ͠·͢ɻ σϓϩΠϝϯτɺαʔϏεʹΑͬͯެ։͞Ε ΔݸʑͷAPIͱҟͳΔͰ͜ΕΒͷػೳΛσϓϩΠ͢Δೳ ྗʹґଘ͍ͯ͠Δɻ
gRPCͷઃܭݪଇͱཁ݅ • ඪ४Խ͞Εͨεςʔλείʔυ ΫϥΠΞϯτɺ௨ৗɺݶΒΕͨͷํ๏ͰAPIݺͼग़͠ʹΑͬ ͯฦ͞ΕΔΤϥʔʹԠ͢Δɻ εςʔλείʔυͷ໊લۭؒ ɺ͜ΕΒͷΤϥʔॲཧͷܾఆΛΑΓ໌֬ʹ͢ΔΑ͏ʹ੍͞ ΕΔ͖Ͱ͢ɻ ΑΓ๛ͳυϝΠϯݻ༗ͷεςʔλε͕ඞཁͳ ߹ɺϝλσʔλަϝΧχζϜΛ༻ͯͦ͠ΕΛఏڙͰ͖
Δɻ
iOSͰ͏ʹʁ
SwiftͱObjective-Cͷ࣮͕͋Δ
Objective-Cͷ࣮͕ΘΕ͍ͯΔͷʁ ԼهGoogleͷSDKͰར༻࣮͕͋Δɻ • FirebaseFirestore • CloudSpeech • ͪͳΈʹFirebaseDatabaseͰgRPCΘΕ͍ͯͳ͍
gRPC-Swift
gRPC-Swiftͷঢ়گ • gRPC-C-CoreΛSwiftͰϥοϓ࣮ͨ͠ • AppleͷSwift ProtobufΛར༻ • Ґஔ͚ͮϕʔλͰݱࡏͷόʔδϣϯ0.4.3
gRPC-SwiftΛ͏ࣄલ४උ • protocʢϓϩτίϧίϯύΠϥʣͷ४උ • brew install protobuf • SwiftϓϥάΠϯͷ४උ •
protoc-gen-swift, protoc-gen-swiftgrpc • ಋೖهࣄ
gRPC-SwiftΛϓϩδΣΫτʹಋೖ͢Δ 0.4.2͔ΒCoocoaPodsͰ؆୯ʹಋೖͰ͖ΔΑ͏ʹͳΓ·ͨ͠ɻ target 'gRPC-Client-Sample' do use_frameworks! pod 'SwiftGRPC' target 'gRPC-Client-SampleTests'
do inherit! :search_paths end end
gRPCʹΑΔ։ൃͷྲྀΕ • protoϑΝΠϧΛఆٛʢvscode-proto3͕ศརʣ • protocͰίʔυΛੜ • ੜ͞ΕͨΫϥΠΞϯτ/αʔόʔίʔυΛ࣮
protocͰίʔυΛੜ ࣍ͷίϚϯυͰhelloworld.protoΛίϯύΠϧͯ͠ɺ ϓϥάΠϯʹswift_outͱswiftgrpc_outΛ͍ɺ ͦΕͧΕΧϨϯτσΟϨΫτϦʹίʔυΛग़ྗɻͱ͍͏ҙຯɻ $ protoc helloworld.proto --swift_out=. --swiftgrpc_out=.
protocͰίʔυΛੜ 0.4.3Ͱswiftgrpc_outͷOptionࢦఆ͕Ճ͞Ε·ͨ͠ɻ protoc helloworld.proto \ --swift_out=GeneratedForClient \ --swiftgrpc_out=Client=true,Server=false,TestStubs=true:GeneratedForClient ͜ΕͰɺΫϥΠΞϯτίʔυͱςετ༻ͷελϒ͚ͩੜ͢Δ͜ ͱ͕ग़དྷ·͢ɻ
ੜίʔυʢൈਮʣhelloworld.pb.swift /// The request message containing the user's name. struct
Greeter_HelloRequest { var name: String = String() var unknownFields = SwiftProtobuf.UnknownStorage() init() {} }
ੜίʔυʢൈਮʣhelloworld.grpc.swift internal protocol Greeter_GreeterSayHelloCall: ClientCallUnary {} fileprivate final class Greeter_GreeterSayHelloCallBase:
ClientCallUnaryBase<Greeter_HelloRequest, Greeter_HelloReply>, Greeter_GreeterSayHelloCall { override class var method: String { return "/greeter.Greeter/SayHello" } } internal protocol Greeter_GreeterService: ServiceClient { /// Synchronous. Unary. func sayHello(_ request: Greeter_HelloRequest) throws -> Greeter_HelloReply /// Asynchronous. Unary. func sayHello(_ request: Greeter_HelloRequest, completion: @escaping (Greeter_HelloReply?, CallResult) -> Void) throws -> Greeter_GreeterSayHelloCall } internal final class Greeter_GreeterServiceClient: ServiceClientBase, Greeter_GreeterService { //লུ }
gRPCαʔόʔ //ϓϩτίϧΛ࣮͠·͢ final class GreeterProvider: Greeter_GreeterProvider { func sayHello( request:
Greeter_HelloRequest, session: Greeter_GreeterSayHelloSession) throws -> Greeter_HelloReply{ var g = Greeter_HelloReply() g.message = request.name + " world" return g } }
gRPCΫϥΠΞϯτ class ViewController: UIViewController { let client = Greeter_GreeterServiceClient.init(address: "127.0.0.1:50051",
secure: false) override func viewDidLoad() { super.viewDidLoad() var request = Greeter_HelloRequest() request.name = "hello" let ret = try? client.sayHello(request) //ಉظॲཧ print("gRPC Server returns " + ret!.message) } }
gRPCΫϥΠΞϯτ // ඇಉظॲཧ var request = Greeter_HelloRequest() request.name = "hello"
let _ = try? client.sayHello(request) { (reply, result) in if result.success, result.statusCode == .ok { print("gRPC Server returns " + reply!.message) } else { print("result \(result)") } }
ͪͳΈʹଞͷετϦʔϛϯάํࣜΛ͏ʹ service Echo { //Unary rpc Get(EchoRequest) returns (EchoResponse) {}
//Server streaming rpc Expand(EchoRequest) returns (stream EchoResponse) {} //Client streaming rpc Collect(stream EchoRequest) returns (EchoResponse) {} //Bidirectional streaming rpc Update(stream EchoRequest) returns (stream EchoResponse) {} }
·ͱΊ gRPCͱProtocol BuffersΛ͏ͱ • ܕ͖ͷAPIఆ͕ٛprotoϑΝΠϧҰՕॴʹ·ͱ·Δ • ෳݴޠͷϘΠϥʔϓϨʔτΛࣗಈੜͰ͖Δ • ෳͷετϦʔϛϯάํࣜʹॊೈʹରԠՄೳ •
Nullable͕ѻ͍ͮΒ͍͕՝ͱ͍͏ఔͰͳ͍ • Contributer͕গͳ͍ͷͰߩݙΛ͍͖͍ͬͯͨͰ͢Ͷʂ
ࢀߟใ • https://grpc.io/ • https://grpc.io/blog/principles • https://developers.google.com/protocol-buffers/docs/proto3 • https://github.com/grpc/grpc-swift •
https://github.com/tikidunpon/gRPC-Swift-Sample