Upgrade to Pro — share decks privately, control downloads, hide ads and more …

gRPC on Android @DroidconSF Report

TakuSemba
November 20, 2017

gRPC on Android @DroidconSF Report

TakuSemba

November 20, 2017
Tweet

More Decks by TakuSemba

Other Decks in Technology

Transcript

  1. gRPC on Android
    TakuSemba
    CyberAgent.Inc

    View Slide

  2. @takusemba
    https://github.com/TakuSemba

    View Slide

  3. Droidcon SF

    View Slide

  4. View Slide

  5. What’s gRPC?

    View Slide

  6. gRPC
    ɾProtocol Buffers
    ɾRemote Procedure Call
    ɾHTTP/2

    View Slide

  7. ɾProtocol Buffers
    ɾRemote Procedure Call
    ɾHTTP/2
    gRPC

    View Slide

  8. ɾProtocol Buffers
    ɾRemote Procedure Call
    ɾHTTP/2
    gRPC

    View Slide

  9. What’s Protocol Buffers?

    View Slide

  10. ɾBinary based transmission
    Protocol Buffers
    ɾAvailable for many languages
    ɾFaster than Json

    View Slide

  11. ɾBinary based transmission
    ɾAvailable for many languages
    ɾFaster than Json
    Protocol Buffers

    View Slide

  12. ɾBinary based transmission
    ɾAvailable for many languages
    ɾFaster than Json
    Protocol Buffers

    View Slide

  13. Protocol BuffersͰͷ௨৴͸jsonͱൺ΂ͯૣ͍ͷ͔
    IUUQTRJJUBDPNUBLVTFNCBJUFNTGFBCEBEDFEEC

    View Slide

  14. Let’s gRPC

    View Slide

  15. message CoffeeRequest {

    string name = 1;

    }
    Request
    //coffee.proto

    View Slide

  16. message CoffeeResponse {

    int32 price = 1;

    string name = 2;

    string message = 3;

    }
    Response
    //coffee.proto

    View Slide

  17. service Coffee {

    rpc Order (CoffeeRequest) returns (CoffeeResponse) {}

    }
    Service
    //coffee.proto

    View Slide

  18. Service
    service Coffee {

    rpc Order (CoffeeRequest) returns (CoffeeResponse) {}

    }
    service Coffee {

    rpc Order (stream CoffeeRequest) returns (CoffeeResponse) {}

    }
    service Coffee {

    rpc Order (CoffeeRequest) returns (stream CoffeeResponse) {}

    }
    service Coffee {

    rpc Order (stream CoffeeRequest) returns (stream CoffeeResponse) {}

    }

    View Slide

  19. syntax = "proto3";

    option java_package = "com.takusemba.grpc.android.protos";

    option go_package = "protos";

    package Coffee;

    message CoffeeRequest {

    string name = 1;

    }

    message CoffeeResult {

    string message = 1;

    }

    service Coffee {

    rpc Order (CoffeeRequest) returns (CoffeeResult) {}

    }
    //coffee.proto

    View Slide

  20. ->% curl -OL https://github.com/google/protobuf/releases/download/v3.5.0/
    protobuf-java-3.5.0.tar.gz
    ->% tar -zxvf protobuf-java-3.5.0.tar.gz
    ->% cd protobuf-3.5.0
    ->% ./configure
    ->% make
    ->% sudo make install
    ->% protoc —version // -> libprotoc 3.5.0 :)
    //protoc

    View Slide

  21. ->% git clone [email protected]:grpc/grpc-java.git
    ->% cd grpc-java
    ->% git checkout -b v1.7.0
    ->% cd compiler
    ->% make
    ->% ../gradlew java_pluginExecutable
    ->% cp build/exe/java_plugin/protoc-gen-grpc-java /usr/local/bin
    //protoc-gen-grpc-java

    View Slide

  22. ->% protoc coffee.proto --grpc-java_out=lite:. --java_out=. --plugin=protoc-gen-
    grpc-java=/usr/local/bin/protoc-gen-grpc-java
    //generate proto files for client
    ->% protoc --go_out=plugins=grpc:. coffee.proto
    //generate proto files for server
    Generate Proto Files

    View Slide

  23. Generate Proto Files

    View Slide

  24. gRPC on Android
    classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.2'
    implementation "io.grpc:grpc-okhttp:1.7.0"
    implementation "io.grpc:grpc-protobuf:1.7.0"
    implementation "io.grpc:grpc-stub:1.7.0"
    implementation "javax.annotation:javax.annotation-api:1.2"
    //build.gradle
    //app/build.gradle

    View Slide

  25. gRPC on Android
    val channel = ManagedChannelBuilder.forAddress("10.0.2.2", 8080)
    .usePlaintext(true)
    .build()
    val stub = CoffeeGrpc.newBlockingStub(channel)
    val request = CoffeeOuterClass.CoffeeRequest.newBuilder()
    .setName(“hot coffee")
    .build()
    Single
    .create {
    it.onSuccess(stub.order(request))
    }.subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(
    { /** do something */ },
    { /** error handling */ }
    )

    View Slide

  26. gRPC on Android
    val channel = ManagedChannelBuilder.forAddress("10.0.2.2", 8080)
    .usePlaintext(true)
    .build()
    val stub = CoffeeGrpc.newBlockingStub(channel)
    val request = CoffeeOuterClass.CoffeeRequest.newBuilder()
    .setName(“hot coffee")
    .build()
    Single
    .create {
    it.onSuccess(stub.order(request))
    }.subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(
    { /** do something */ },
    { /** error handling */ }
    )

    View Slide

  27. gRPC on Android
    val channel = ManagedChannelBuilder.forAddress("10.0.2.2", 8080)
    .usePlaintext(true)
    .build()
    val stub = CoffeeGrpc.newBlockingStub(channel)
    val request = CoffeeOuterClass.CoffeeRequest.newBuilder()
    .setName(“hot coffee")
    .build()
    Single
    .create {
    it.onSuccess(stub.order(request))
    }.subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(
    { /** do something */ },
    { /** error handling */ }
    )

    View Slide

  28. gRPC on Android
    val channel = ManagedChannelBuilder.forAddress("10.0.2.2", 8080)
    .usePlaintext(true)
    .build()
    val stub = CoffeeGrpc.newBlockingStub(channel)
    val request = CoffeeOuterClass.CoffeeRequest.newBuilder()
    .setName(“hot coffee")
    .build()
    Single
    .create {
    it.onSuccess(stub.order(request))
    }.subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(
    { /** do something */ },
    { /** error handling */ }
    )

    View Slide

  29. Demo

    View Slide

  30. gRPC on Android
    https://github.com/takusemba
    https://twitter.com/takusemba

    View Slide