Slide 1

Slide 1 text

Vapor + ProtocolBuffers + DockerͰServer Side Swiftೖ໳ @nonchalant0303 Otemachi.swift x Kyobashi.swift #2

Slide 2

Slide 2 text

ࣗݾ঺հ • Takeshi Ihara • Recruit Marketing Partners • iOS Engineer • Twitter: @nonchalant0303 • GitHub: Nonchalant

Slide 3

Slide 3 text

Kyobashi.swift

Slide 4

Slide 4 text

Sample Project • https://github.com/Nonchalant/ VaporProtobufSample • Server, Clientͷαϯϓϧίʔυ (GET, POST) • Vapor + ProtocolBuffers + Docker

Slide 5

Slide 5 text

Server Side Swift https://swift.org/download • Swift͕2015೥12݄ʹΦʔϓϯιʔεԽ • LinuxαϙʔτΛ։࢝ • Vapor, Kitura, PerfectͳͲͷϑϨʔϜϫʔΫ͕ ొ৔

Slide 6

Slide 6 text

Vapor https://github.com/vapor/vapor • ࠷΋࢖ΘΕ͍ͯΔSwift੡ͷWebϑϨʔϜϫʔ Ϋ • PHPͷLaravelϑϨʔϜϫʔΫʹӨڹΛड͚ͯ ͍Δ • Swift Package ManagerʹΑΔϥΠϒϥϦ؅ཧ • पลπʔϧ΋ॆ࣮

Slide 7

Slide 7 text

Vapor / Toolbox https://github.com/vapor/toolbox • ެ͕ࣜఏڙ͍ͯ͠ΔCLλεΫπʔϧ CSFXJOTUBMMWBQPSUBQUPPMCPY WBQPSOFX\QSPKFDU@OBNF^ŠBQJ WBQPSCVJME WBQPSSVO

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

Environment WBQPSŠWFSTJPO 7BQPS5PPMCPY 7BQPS'SBNFXPSL TXJGUŠWFSTJPO "QQMF4XJGUWFSTJPO TXJGUMBOH DMBOH 5BSHFUY@BQQMFNBDPTY TXJGUQBDLBHFUPPMTWFSTJPO

Slide 10

Slide 10 text

Droplet.swift https://github.com/vapor/vapor/blob/master/Sources/Vapor/Droplet/Droplet.swift • VaporͷRoutingΛ࢘ΔΫϥε extension Droplet { func setupRoutes() throws { get("hello") { req in var json = JSON() try json.set("hello", "world") return json } } } ฦΓ஋͕"1*Ϩεϙϯε

Slide 11

Slide 11 text

ProtocolBuffers (protobuf) https://github.com/google/protobuf • Google͕։ൃͨ͠௨৴΍ӬଓԽͰͷར༻Λ
 ໨తͱͨ͠γϦΞϥΠζϑΥʔϚοτ • .protoͰσʔλߏ଄Λఆٛ͢Δ • Apple͕.swiftʹม׵͢ΔϓϥάΠϯΛެ։

Slide 12

Slide 12 text

protobufͷϝϦοτ • σʔλྔ͕খ͍͞ • ௨৴ͷߴ଎Խ • σʔλߏ଄Λෳ਺ϓϥοτϑΥʔϜͰڞ༗Մೳ

Slide 13

Slide 13 text

protobuf - ಋೖ https://github.com/apple/swift-protobuf CSFXJOTUBMMQSPUPCVG HJUDMPOFHJU!HJUIVCDPNBQQMFTXJGUQSPUPCVGHJU DETXJGUQSPUPCVGTXJGUCVJME HFOFSBUFCVJMEEFCVHQSPUPDHFOTXJGU

Slide 14

Slide 14 text

.proto syntax = "proto3"; import "proto/gender.proto"; message User { int64 id = 1; string name = 2; Gender gender = 3; }

Slide 15

Slide 15 text

generate .swift QSPUPDŠQMVHJOQSPUPDHFOTXJGUCVJMEEFCVH QSPUPDHFOTXJGUŠTXJGU@PVU6TFSQSPUP

Slide 16

Slide 16 text

User.pb.swift import Foundation import SwiftProtobuf … struct User: SwiftProtobuf.Message { static let protoMessageName: String = "User" var id: Int64 = 0 var name: String = String() var gender: Gender = .other var unknownFields = SwiftProtobuf.UnknownStorage() init() {} … }

Slide 17

Slide 17 text

Serialize extension Message { … public func serializedData(partial: Bool = default) throws -> Data public func jsonUTF8Data() throws -> Data … }

Slide 18

Slide 18 text

Vapor + protobuf extension Droplet { func setupRoutes() throws { get("user") { req in return UserResponse.with { $0.users = [ User.with { $0.name = "Takeshi Ihara" $0.gender = Gender.male }, User.with { $0.name = "Hanako Yamada" $0.gender = Gender.female } ] }.serializedData() // or .jsonUTF8Data() } } }

Slide 19

Slide 19 text

Deserialize (Client) var urlRequest = URLRequest(url: URL(string: "http://localhost: 9000/user")!) urlRequest.allHTTPHeaderFields = [ "Accept": "application/protobuf" ] URLSession.shared.dataTask(with: urlRequest) { data, _, _ in guard let data = data else { return } let response = try! UserResponse(serializedData: data) }.resume() • Serverͱಉ͡ϞσϧΛ࢖͑Δ (User.pb.swift)

Slide 20

Slide 20 text

Docker https://www.docker.com/ • ίϯςφܕͷԾ૝Խ؀ڥΛఏڙ͢ΔΦʔϓϯιʔ ειϑτ΢ΣΞ • ׬શԾ૝ԽͰ͸ͳ͘1ϓϩηε • VMWareͳͲͷ׬શԾ૝Խʹൺ΂ͯɺσΟεΫ ࢖༻ྔ͕গͳ͍ɺىಈ͕ૣ͍ɺॲཧ͕ߴ଎

Slide 21

Slide 21 text

docker-swift https://github.com/swiftdocker/docker-swift • UbuntuͰಈ࡞ՄೳͳApple͕ఏڙ͍ͯ͠ΔSwift όΠφϦ͕ಈ࡞ՄೳͳDockerΠϝʔδ • ຊ൪ʹ͍ۙLinuxͰͷಈ࡞ΛݕূͰ͖Δ • FoundationͳͲͷίΞϥΠϒϥϦ͸MacOS, Linux ͷίʔυ͕ҟͳΔ (Linux൛͸ෆ׬શ)

Slide 22

Slide 22 text

Dockerfile FROM swift:4.0.3 USER root RUN mkdir -p /server COPY ./Config /server/Config COPY ./Sources /server/Sources COPY ./Makefile /server/Makefile COPY ./Package.resolved /server/Package.resolved COPY ./Package.swift /server/Package.swift ENV PORT 9000 EXPOSE 9000 WORKDIR /server RUN make build CMD ["make", "run"]

Slide 23

Slide 23 text

docker-compose https://docs.docker.com/compose/ • ෳ਺ίϯςφͷఆٛɾىಈͷߏ੒πʔϧ version: "2" services: server: image: nonchalant/server:0.1 ports: - "9000:9000" ϩʔΧϧɺԾ૝؀ڥͷϙʔτͷϚοϐϯά

Slide 24

Slide 24 text

·ͱΊ • ؆୯ͳπʔϧɾΞϓϦͳͲ͸Server Side SwiftͰ ॻ͍ͯ΋͍͍͔΋ • Linux - SwiftίΞϥΠϒϥϦ͕ະ׬੒ͳͷ͕πϥ Π (࣮ߦ࣌Τϥʔ) • Clientͷಈ࡞ݕূʹ΋Docker࢖͑Δ͔΋ (CircleCI 2.0)