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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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
AIカンパニーへの転換を支えた、エンジニアの仕事の再定義
kworkdev
PRO
2
1.4k
Kiro Crewで「みのるん式」仕事術やってみた
minorun365
PRO
3
930
20261017福岡devIO 「AIは"良いダッシュボード"を作れるか?
jtakeda
0
210
AI コーディングと人間の認知スループット / CTO Night & Day 2026 Morning Session / AI Coding and Human Cognitive Throughput
prog893
5
1.4k
Optunaの最新リリースv5.0について
pfn
PRO
0
120
Code for Security プロジェクト紹介 2026年10月
yu23ki14
0
120
hackers_champloo_2026_tidb
makocchi
0
170
データエンジニアの次の戦場は "プロセスエンジニアリング"
sansantech
PRO
1
120
ブラウザとサーバーから考えるAI時代のフロントエンド監視
shogo4131
3
1k
SAENM ~Jupyterで残すPoCの試行錯誤、未来の自分と仲間を助ける記録!~
terapyon
0
160
AI × アーキテクト 第1・2章|生成AIの課題とアーキテクトの素養
daidaidai
0
190
CloudWatch Logsのコスト最適化:どこまでAIに任せてどこから人間が承認すべきか
yama3133
0
120
Featured
See All Featured
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
330
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.6k
The World Runs on Bad Software
bkeepers
PRO
72
12k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6.1k
Building Flexible Design Systems
yeseniaperezcruz
330
41k
Navigating Team Friction
lara
192
16k
brightonSEO & MeasureFest 2025 - Winning Strategies for Black Friday CRO & PPC - Christian Goodrich
cargoodrich
3
870
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
320
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
35
2.9k
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