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
eBPF 簡介 2026 版
shunghsiyu
0
180
"AWSはちょっと苦手"でも大丈夫。AWS Blocks で手軽に作る Flutter のバックエンド #FlutterKaigi
tacck
PRO
0
150
Maestro MCPとClaude Code Skillsによる自律的なE2Eテスト支援
asmz
0
420
デザインレビューは自動化できるのか?─ Flutter × Figma で UI 品質保証を考える
techiro
2
790
re:Invent2026 事前勉強会 歴史と愉しみ方10分LT編
toshi_atsumi
0
130
AIコーディングはじめました
miso
0
150
Active Directory と Entra ID のむむむな関係
murachiakira
PRO
3
1.5k
Microsoft Entra Kerberos で実現するクラウド デバイス管理
tamaiyutaro
2
470
Building Audio Plugin Ecosystem for Android in 2026
atsushieno
2
150
Software Engineering in an AI-Driven World
erikjhordan_rey
0
120
ライフワーク「猫でもわかるDirectConnect」
kentapapa
0
150
リアクションエンジニア ― 小さなリアクションから、話しかけやすい組織をつくる ―
ryuguyana
1
130
Featured
See All Featured
My Coaching Mixtape
mlcsv
0
380
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
Exploring anti-patterns in Rails
aemeredith
4
560
A better future with KSS
kneath
240
18k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
970
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
480
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
290
Designing Experiences People Love
moore
143
24k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.4k
Six Lessons from altMBA
skipperchong
29
4.6k
Are puppies a ranking factor?
jonoalderson
2
4.1k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
47k
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