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
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
依頼文化をやめる日 EM視点で語るPlatform EngineeringとInclusive SRE / Discussing Platform Engineering and Inclusive SRE from an EM's Perspective
shin1988
4
5.3k
ゴールデンパスは敷いただけでは道にならない ─ 企画部門のエンジニアが技術標準を事業価値に変えるまで
mhrtech
0
140
キャリアの中で本を作る / Making a Book During Your Career
ak1210
0
130
貴方はどのエンジニアリングを磨くのか
hatyibei
0
120
あなたの『Site』はどこですか? — xREという考え方
miyamu
0
1.2k
証券システムを10年Scalaで作り続けるということ - 関数型まつり2026
krrrr38
3
840
AI時代の EM への処方箋
staka121
PRO
0
130
End-to-Endで考える信頼性 —LINEアプリにおけるクライアント開発×SRE連携の実践
maruloop
4
4.1k
オブザーバビリティ、本当に活用できてる? 〜API連携×生成AIで成熟度を自動評価〜
dmmsre
1
3k
ポストモーテム! DDoSからサイトは守れた。 でもビジネスは守れなかった。
bengo4com
0
2.8k
プロンプト_きのこカンファレンス2026_LT
yurufuwahealer
0
150
穢れた技術選定について
watany
3
310
Featured
See All Featured
WENDY [Excerpt]
tessaabrams
11
38k
Agile that works and the tools we love
rasmusluckow
331
22k
WCS-LA-2024
lcolladotor
0
680
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
550
We Are The Robots
honzajavorek
0
270
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
220
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.6k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.2k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
800
Claude Code のすすめ
schroneko
67
230k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
240
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