Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
grpc-swiftの紹介
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
tanako
May 23, 2018
Technology
1.8k
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.1k
SwiftPM Integration into Xcode
_tanako
0
180
roppongiswift6.pdf
_tanako
1
450
iOSエンジニアの為のgrpc-swift入門
_tanako
6
5.3k
How to write basic unittests
_tanako
0
240
Other Decks in Technology
See All in Technology
アンオフィシャルな、オフィシャルからのお願い
wyamazak_devrel
0
140
Oracle AI Database@Azure:サービス概要のご紹介
oracle4engineer
PRO
6
2k
コミュニティの有益性 ~JAWS Days 2026 での体験を通して~ / The Benefits of a Community ~Through My Experience at JAWS Days 2026~
seike460
PRO
0
160
自宅LLMの話
jacopen
1
620
エラーバジェットのアラートのタイミングを考える.pdf
kairim0
0
170
スタートアップにAmazon EKSは早すぎる? マルチプロダクト戦略を加速する Platform Engineeringの実践 / Is Amazon EKS Too Soon for Startups? Practical Platform Engineering to Accelerate a Multi-Product Strategy
elmodev09
0
340
SONiC Scale-Up Working Group から探る Scale-UpやUltraEthernet機能の実装方法
ebiken
PRO
2
410
AIネイティブな開発のサプライチェーンリスク対策 〜激動の開発現場でリスクに立ち向かう〜【ZennFes】
cscengineer
PRO
2
140
AI時代のコスト管理を考えよう〜明日から使える実践AWSノウハウ~
yoshimi0227
0
290
不要なレビューをAIにまかせて AIコーディングの環境改善を加速した
shoota
1
220
OTel × Datadog で 「AI活用」を計測し、改善に繋げる
shihochan
1
410
Oracle AI Database@Google Cloud:サービス概要のご紹介
oracle4engineer
PRO
6
1.5k
Featured
See All Featured
Statistics for Hackers
jakevdp
799
230k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
750
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.6k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
260
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.5k
What does AI have to do with Human Rights?
axbom
PRO
1
2.2k
GraphQLとの向き合い方2022年版
quramy
50
15k
Prompt Engineering for Job Search
mfonobong
0
350
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
610
Testing 201, or: Great Expectations
jmmastey
46
8.2k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.2k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
300
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