$30 off During Our Annual Pro Sale. View Details »

Introdução a gRPC: um framework moderno e performático para comunicação entre microsserviços

Introdução a gRPC: um framework moderno e performático para comunicação entre microsserviços

Com a grande adoção no uso de microsserviços e implantação de sistemas nas nuvens ficou evidente que muitas das tecnologias e protocolos de comunicação utilizados não tiram o real proveito da infraestrutura existente nos grandes provedores de cloud. Não só isso, algumas vezes esta comunicação se torna o gargalo quando temos centenas ou milhares de serviços em momentos de pico.

Não à toa, em 2015, a Google publicou de forma open-source seu projeto interno de  framework RPC como solução alternativa na integração de microsserviços, aplicações mobile e real-time, conhecido como gRPC. Um framework que se apoia no ombro de gigantes como HTTP/2 e Protobuf v3 para prover alta-performance, baixa latência, uso eficiente de CPU e interoperabilidade entre plataformas. Não bastasse ser mais rápido e eficiente do que APIs REST, com gRPC abraçamos uma forma mais idiomática e expressiva de descrever APIs fortemente tipadas na linguagem de sua escolha.

Se você nunca ouviu falar ou entende pouco sobre gRPC, então essa palestra é para você!

(GRAVAÇÃO: https://youtu.be/r8gOKuWgNvw?list=PLHMMERsvy9EyWQPru4SrJAYHEGKfkjRgP&t=456)

Rafael Ponte

March 04, 2021
Tweet

More Decks by Rafael Ponte

Other Decks in Technology

Transcript

  1. um framework moderno e performático para
    comunicação entre microsserviços

    View Slide

  2. servidor

    View Slide

  3. servidor

    View Slide

  4. navegador
    servidor

    View Slide

  5. navegador
    servidor
    requisição

    View Slide

  6. navegador
    servidor db
    requisição

    View Slide

  7. navegador
    servidor db
    requisição
    resposta

    View Slide

  8. navegador
    requisição
    resposta
    db

    View Slide

  9. navegador
    requisição
    resposta

    View Slide

  10. navegador
    requisição
    resposta

    View Slide

  11. navegador
    requisição
    resposta

    View Slide

  12. navegador
    requisição
    resposta

    View Slide

  13. navegador
    requisição
    resposta

    View Slide

  14. navegador
    requisição
    resposta

    View Slide

  15. navegador
    requisição
    resposta

    View Slide

  16. navegador
    requisição
    resposta

    View Slide

  17. View Slide

  18. Pode piorar…

    View Slide

  19. View Slide

  20. Mas tudo pode
    piorar…

    View Slide

  21. Data Center #1

    View Slide

  22. Data Center #1 Data Center #2

    View Slide

  23. View Slide

  24. View Slide

  25. View Slide

  26. X

    View Slide

  27. View Slide

  28. View Slide

  29. View Slide

  30. View Slide

  31. View Slide

  32. Rafael Ponte


    @rponte

    View Slide

  33. View Slide

  34. Fortaleza - Terra do Sol

    View Slide

  35. View Slide

  36. gRPC Remote Procedure Call framework

    View Slide

  37. gRPC Remote Procedure Call framework

    View Slide

  38. Loja Virtual

    View Slide

  39. Online Shop Payment Service
    Pagamento Online

    View Slide

  40. Online Shop Payment Service
    Pagamento Online
    cobre R$120.20 do cartão de crédito 1234…

    View Slide

  41. Online Shop Payment Service
    Pagamento Online
    cobre R$120.20 do cartão de crédito 1234…
    SUCCESS

    View Slide

  42. Online Shop Payment Service
    Pagamento Online
    cobre R$120.20 do cartão de crédito 1234…
    SUCCESS
    cobre R$16.99 do cartão de crédito 9876…

    View Slide

  43. Online Shop Payment Service
    Pagamento Online
    cobre R$120.20 do cartão de crédito 1234…
    SUCCESS
    cobre R$16.99 do cartão de crédito 9876…
    ERROR

    View Slide

  44. Como
    implementamos
    essa lógica?

    View Slide

  45. View Slide

  46. View Slide

  47. View Slide

  48. View Slide

  49. Spring Boot App

    View Slide

  50. Spring Boot App

    View Slide

  51. Spring Boot App
    Client

    (Online Shop)
    Service


    (Payment Service)

    View Slide

  52. Spring Boot App
    Client

    (Online Shop)
    Service


    (Payment Service)

    View Slide

  53. Spring Boot App
    Client

    (Online Shop)
    Service


    (Payment Service)
    Local Calls

    View Slide

  54. Spring Boot App
    Client

    (Online Shop)
    Service


    (Payment Service)
    Local Calls

    View Slide

  55. PaymentRequest request = new PaymentRequest()
    ;

    request.setCardNumber("1234 5678 8765 4321");
    request.setExpiryDate("03/2028");
    request.setCvc("123")
    ;

    request.setAmount(120.2)
    ;

    request.setCurrency(Currency.BRL)
    ;

    Result result = paymentService.processPayment(request)
    ;

    if (result.isSuccess())
    {

    // processa fluxo do pedido...
    }

    View Slide

  56. PaymentRequest request = new PaymentRequest()
    ;

    request.setCardNumber("1234 5678 8765 4321");
    request.setExpiryDate("03/2028");
    request.setCvc("123")
    ;

    request.setAmount(120.2)
    ;

    request.setCurrency(Currency.BRL)
    ;

    Result result = paymentService.processPayment(request)
    ;

    if (result.isSuccess())
    {

    // processa fluxo do pedido...
    }

    View Slide

  57. PaymentRequest request = new PaymentRequest()
    ;

    request.setCardNumber("1234 5678 8765 4321");
    request.setExpiryDate("03/2028");
    request.setCvc("123")
    ;

    request.setAmount(120.2)
    ;

    request.setCurrency(Currency.BRL)
    ;

    Result result = paymentService.processPayment(request)
    ;

    if (result.isSuccess())
    {

    // processa fluxo do pedido...
    }

    View Slide

  58. PaymentRequest request = new PaymentRequest()
    ;

    request.setCardNumber("1234 5678 8765 4321");
    request.setExpiryDate("03/2028");
    request.setCvc("123")
    ;

    request.setAmount(120.2)
    ;

    request.setCurrency(Currency.BRL)
    ;

    Result result = paymentService.processPayment(request)
    ;

    if (result.isSuccess())
    {

    // processa fluxo do pedido...
    }

    View Slide

  59. PaymentRequest request = new PaymentRequest()
    ;

    request.setCardNumber("1234 5678 8765 4321");
    request.setExpiryDate("03/2028");
    request.setCvc("123")
    ;

    request.setAmount(120.2)
    ;

    request.setCurrency(Currency.BRL)
    ;

    Result result = paymentService.processPayment(request)
    ;

    if (result.isSuccess())
    {

    // processa fluxo do pedido...
    }

    View Slide

  60. PaymentRequest request = new PaymentRequest()
    ;

    request.setCardNumber("1234 5678 8765 4321");
    request.setExpiryDate("03/2028");
    request.setCvc("123")
    ;

    request.setAmount(120.2)
    ;

    request.setCurrency(Currency.BRL)
    ;

    Result result = paymentService.processPayment(request)
    ;

    if (result.isSuccess())
    {

    // processa fluxo do pedido...
    }

    View Slide

  61. Mas quando
    trabalhamos com
    sistemas distribuídos…

    View Slide

  62. Online Shop Payment Service
    Pagamento Online
    cobre R$120.20 do cartão de crédito 1234…
    SUCCESS

    View Slide

  63. Online Shop Payment Service
    Pagamento Online
    cobre R$120.20 do cartão de crédito 1234…
    SUCCESS

    View Slide

  64. Online Shop Payment Service
    Pagamento Online
    cobre R$120.20 do cartão de crédito 1234…
    SUCCESS

    View Slide

  65. Spring Boot App Spring Boot App

    View Slide

  66. Spring Boot App Spring Boot App

    View Slide

  67. Spring Boot App Spring Boot App
    Client

    (Online Shop)

    View Slide

  68. Spring Boot App Spring Boot App
    Service


    (Payment Service)
    Client

    (Online Shop)

    View Slide

  69. Spring Boot App Spring Boot App

    Internet
    Client

    (Online Shop)
    Service


    (Payment Service)

    View Slide

  70. Spring Boot App Spring Boot App

    Internet
    Client

    (Online Shop)
    Service


    (Payment Service)

    View Slide

  71. Spring Boot App Spring Boot App

    Internet
    Remote Calls
    Client

    (Online Shop)
    Service


    (Payment Service)

    View Slide

  72. Spring Boot App Spring Boot App

    Internet
    Remote Calls
    Client

    (Online Shop)
    Service


    (Payment Service)

    View Slide

  73. PaymentRequest request = new PaymentRequest()
    ;

    request.setCardNumber("1234 5678 8765 4321");
    request.setExpiryDate("03/2028");
    request.setCvc("123")
    ;

    request.setAmount(120.2)
    ;

    request.setCurrency(Currency.BRL)
    ;

    Result result = paymentService.processPayment(request)
    ;

    if (result.isSuccess())
    {

    // processa fluxo do pedido...
    }

    View Slide

  74. PaymentRequest request = new PaymentRequest()
    ;

    request.setCardNumber("1234 5678 8765 4321");
    request.setExpiryDate("03/2028");
    request.setCvc("123")
    ;

    request.setAmount(120.2)
    ;

    request.setCurrency(Currency.BRL)
    ;

    Result result = paymentService.processPayment(request)
    ;

    if (result.isSuccess())
    {

    // processa fluxo do pedido...
    }

    View Slide

  75. framework
    RPC

    View Slide

  76. Online Shop Payment Service
    RPC Framework

    View Slide

  77. Online Shop Payment Service
    RPC Framework
    RPC client RPC server

    View Slide

  78. Online Shop Payment Service
    RPC Framework
    RPC client RPC server
    processPayment() stub

    View Slide

  79. Online Shop Payment Service
    RPC Framework
    RPC client RPC server
    processPayment() stub
    waiting

    View Slide

  80. Online Shop Payment Service
    RPC Framework
    RPC client RPC server
    processPayment() stub
    {


    View Slide

  81. Online Shop Payment Service
    RPC Framework
    RPC client RPC server
    processPayment() stub
    {


    View Slide

  82. Online Shop Payment Service
    RPC Framework
    RPC client RPC server
    processPayment() stub
    processPayment(
    )

    implementation
    {


    View Slide

  83. Online Shop Payment Service
    RPC Framework
    RPC client RPC server
    processPayment() stub
    processPayment(
    )

    implementation
    {


    View Slide

  84. Online Shop Payment Service
    RPC Framework
    RPC client RPC server
    processPayment() stub
    processPayment(
    )

    implementation
    {


    View Slide

  85. Online Shop Payment Service
    RPC Framework
    RPC client RPC server
    processPayment() stub
    processPayment(
    )

    implementation
    {


    View Slide

  86. PaymentRequest request = new PaymentRequest()
    ;

    request.setCardNumber("1234 5678 8765 4321");
    request.setExpiryDate("03/2028");
    request.setCvc("123")
    ;

    request.setAmount(120.2)
    ;

    request.setCurrency(Currency.BRL)
    ;

    Result result = paymentService.processPayment(request)
    ;

    if (result.isSuccess())
    {

    // processa fluxo do pedido...
    }

    View Slide

  87. PaymentRequest request = new PaymentRequest()
    ;

    request.setCardNumber("1234 5678 8765 4321");
    request.setExpiryDate("03/2028");
    request.setCvc("123")
    ;

    request.setAmount(120.2)
    ;

    request.setCurrency(Currency.BRL)
    ;

    Result result = paymentService.processPayment(request)
    ;

    if (result.isSuccess())
    {

    // processa fluxo do pedido...
    }
    Location
    Transparency

    View Slide

  88. Mas na
    prática…

    View Slide

  89. Spring Boot App Spring Boot App

    Internet
    Remote Calls
    Client

    (Online Shop)
    Service


    (Payment Service)

    View Slide

  90. Spring Boot App Spring Boot App
    Client

    (Online Shop)
    Service


    (Payment Service)

    Internet
    Remote Calls

    View Slide

  91. Spring Boot App
    Client

    (Online Shop)
    Spring Boot App
    Service


    (Payment Service)

    Internet
    Remote Calls

    View Slide

  92. Spring Boot App
    Client

    (Online Shop)
    Spring Boot App
    Service


    (Payment Service)

    Internet
    Remote Calls

    View Slide

  93. Spring Boot App
    Client

    (Online Shop)
    Spring Boot App
    Service


    (Payment Service)

    Internet
    Remote Calls

    View Slide

  94. Spring Boot App
    Client

    (Online Shop)
    Spring Boot App
    Service


    (Payment Service)

    Internet
    Remote Calls

    View Slide

  95. Spring Boot App
    Client

    (Online Shop)
    Spring Boot App
    Service


    (Payment Service)

    Internet
    Remote Calls

    View Slide

  96. Spring Boot App Spring Boot App

    Internet
    Client

    (Online Shop)
    Service


    (Payment Service)
    Remote Calls

    View Slide

  97. https://deniseyu.io/art/

    View Slide

  98. Falando em
    frameworks…

    View Slide

  99. 1990

    View Slide

  100. CORBA
    1990

    View Slide

  101. CORBA
    1990
    DCOM

    e Java RMI
    199x

    View Slide

  102. CORBA
    1990
    DCOM

    e Java RMI
    SOAP
    1998
    199x

    View Slide

  103. CORBA
    1990
    DCOM

    e Java RMI
    SOAP
    Thrift
    2007
    1998
    199x

    View Slide

  104. CORBA
    1990
    DCOM

    e Java RMI
    SOAP
    Thrift
    gRPC
    2015
    2007
    1998
    199x

    View Slide

  105. https://tools.ietf.org/html/rfc707

    View Slide

  106. https://tools.ietf.org/html/rfc707

    View Slide

  107. https://tools.ietf.org/html/rfc707

    View Slide

  108. gRPC Remote Procedure Call framework

    View Slide

  109. gRPC Remote Procedure Call framework

    View Slide

  110. gRPC Remote Procedure Call framework
    simple & idiomatic

    View Slide

  111. gRPC Remote Procedure Call framework
    simple & idiomatic
    performant & scalable

    View Slide

  112. gRPC Remote Procedure Call framework
    simple & idiomatic
    performant & scalable
    interoperable & extensible

    View Slide

  113. View Slide

  114. gRPC vs REST API with JSON
    https://docs.microsoft.com/en-us/aspnet/core/grpc/comparison?view=aspnetcore-5.0

    View Slide

  115. gRPC Remote Procedure Call framework
    simple & idiomatic
    performant & scalable
    interoperable & extensible

    View Slide

  116. gRPC Remote Procedure Call framework
    IDL
    performant & scalable
    interoperable & extensible

    View Slide

  117. gRPC Remote Procedure Call framework
    IDL
    HTTP/2
    interoperable & extensible

    View Slide

  118. gRPC Remote Procedure Call framework
    IDL
    HTTP/2
    Protobuf v3

    View Slide

  119. View Slide

  120. View Slide

  121. View Slide

  122. Public REST API

    View Slide

  123. API Gateway
    Public REST API

    View Slide

  124. API Gateway
    http http http http http
    Public REST API

    View Slide

  125. API Gateway
    Public REST API
    http http http http http

    View Slide

  126. API Gateway
    http http http http http
    Public REST API
    gRPC gRPC gRPC gRPC
    gRPC
    gRPC
    gRPC
    gRPC
    gRPC gRPC

    View Slide

  127. API Gateway
    http http http http http
    Public REST API
    gRPC gRPC gRPC gRPC
    gRPC
    gRPC
    gRPC
    gRPC
    gRPC gRPC

    View Slide

  128. View Slide

  129. View Slide

  130. View Slide

  131. Performance

    View Slide

  132. 3x increase in throughput
    Performance

    View Slide

  133. 3x increase in throughput 11x di
    ff
    erence per CPU
    Performance
    https://cloud.google.com/blog/products/gcp/announcing-grpc-alpha-for-google-cloud-pubsub

    View Slide

  134. Seu smartphone agradece!

    View Slide

  135. IDL


    (Interface De
    fi
    nition Language)

    View Slide

  136. syntax = "proto3"
    ;

    service PaymentService
    {

    rpc processPayment(PaymentRequest) returns (PaymentResponse) {
    }

    }

    message PaymentRequest
    {

    enum Currency
    {

    BRL = 0
    ;

    USD = 1
    ;

    }



    string cardNumber = 1
    ;

    string expiryDate = 2
    ;

    string cvc = 3
    ;

    double amount = 4
    ;

    Currency currency = 5
    ;

    }

    message PaymentResponse
    {

    bool success = 1
    ;

    string txId = 2
    ;

    }
    paymentService.proto

    View Slide

  137. syntax = "proto3"
    ;

    service PaymentService
    {

    rpc processPayment(PaymentRequest) returns (PaymentResponse) {
    }

    }

    message PaymentRequest
    {

    enum Currency
    {

    BRL = 0
    ;

    USD = 1
    ;

    }



    string cardNumber = 1
    ;

    string expiryDate = 2
    ;

    string cvc = 3
    ;

    double amount = 4
    ;

    Currency currency = 5
    ;

    }

    message PaymentResponse
    {

    bool success = 1
    ;

    string txId = 2
    ;

    }
    paymentService.proto

    View Slide

  138. syntax = "proto3"
    ;

    service PaymentService
    {

    rpc processPayment(PaymentRequest) returns (PaymentResponse) {
    }

    }

    message PaymentRequest
    {

    enum Currency
    {

    BRL = 0
    ;

    USD = 1
    ;

    }



    string cardNumber = 1
    ;

    string expiryDate = 2
    ;

    string cvc = 3
    ;

    double amount = 4
    ;

    Currency currency = 5
    ;

    }

    message PaymentResponse
    {

    bool success = 1
    ;

    string txId = 2
    ;

    }
    paymentService.proto

    View Slide

  139. syntax = "proto3"
    ;

    service PaymentService
    {

    rpc processPayment(PaymentRequest) returns (PaymentResponse) {
    }

    }

    message PaymentRequest
    {

    enum Currency
    {

    BRL = 0
    ;

    USD = 1
    ;

    }



    string cardNumber = 1
    ;

    string expiryDate = 2
    ;

    string cvc = 3
    ;

    double amount = 4
    ;

    Currency currency = 5
    ;

    }

    message PaymentResponse
    {

    bool success = 1
    ;

    string txId = 2
    ;

    }
    paymentService.proto

    View Slide

  140. syntax = "proto3"
    ;

    service PaymentService
    {

    rpc processPayment(PaymentRequest) returns (PaymentResponse) {
    }

    }

    message PaymentRequest
    {

    enum Currency
    {

    BRL = 0
    ;

    USD = 1
    ;

    }



    string cardNumber = 1
    ;

    string expiryDate = 2
    ;

    string cvc = 3
    ;

    double amount = 4
    ;

    Currency currency = 5
    ;

    }

    message PaymentResponse
    {

    bool success = 1
    ;

    string txId = 2
    ;

    }
    paymentService.proto

    View Slide

  141. syntax = "proto3"
    ;

    service PaymentService
    {

    rpc processPayment(PaymentRequest) returns (PaymentResponse) {
    }

    }

    message PaymentRequest
    {

    enum Currency
    {

    BRL = 0
    ;

    USD = 1
    ;

    }



    string cardNumber = 1
    ;

    string expiryDate = 2
    ;

    string cvc = 3
    ;

    double amount = 4
    ;

    Currency currency = 5
    ;

    }

    message PaymentResponse
    {

    bool success = 1
    ;

    string txId = 2
    ;

    }
    paymentService.proto

    View Slide

  142. syntax = "proto3"
    ;

    service PaymentService
    {

    rpc processPayment(PaymentRequest) returns (PaymentResponse) {
    }

    }

    message PaymentRequest
    {

    enum Currency
    {

    BRL = 0
    ;

    USD = 1
    ;

    }



    string cardNumber = 1
    ;

    string expiryDate = 2
    ;

    string cvc = 3
    ;

    double amount = 4
    ;

    Currency currency = 5
    ;

    }

    message PaymentResponse
    {

    bool success = 1
    ;

    string txId = 2
    ;

    }
    paymentService.proto

    View Slide

  143. syntax = "proto3"
    ;

    service PaymentService
    {

    rpc processPayment(PaymentRequest) returns (PaymentResponse) {
    }

    }

    message PaymentRequest
    {

    enum Currency
    {

    BRL = 0
    ;

    USD = 1
    ;

    }



    string cardNumber = 1
    ;

    string expiryDate = 2
    ;

    string cvc = 3
    ;

    double amount = 4
    ;

    Currency currency = 5
    ;

    }

    message PaymentResponse
    {

    bool success = 1
    ;

    string txId = 2
    ;

    }
    paymentService.proto

    View Slide

  144. syntax = "proto3"
    ;

    service PaymentService
    {

    rpc processPayment(PaymentRequest) returns (PaymentResponse) {
    }

    }

    message PaymentRequest
    {

    enum Currency
    {

    BRL = 0
    ;

    USD = 1
    ;

    }



    string cardNumber = 1
    ;

    string expiryDate = 2
    ;

    string cvc = 3
    ;

    double amount = 4
    ;

    Currency currency = 5
    ;

    }

    message PaymentResponse
    {

    bool success = 1
    ;

    string txId = 2
    ;

    }
    paymentService.proto

    View Slide

  145. syntax = "proto3"
    ;

    service PaymentService
    {

    rpc processPayment(PaymentRequest) returns (PaymentResponse) {
    }

    }

    message PaymentRequest
    {

    enum Currency
    {

    BRL = 0
    ;

    USD = 1
    ;

    }



    string cardNumber = 1
    ;

    string expiryDate = 2
    ;

    string cvc = 3
    ;

    double amount = 4
    ;

    Currency currency = 5
    ;

    }

    message PaymentResponse
    {

    bool success = 1
    ;

    string txId = 2
    ;

    }
    paymentService.proto

    View Slide

  146. syntax = "proto3"
    ;

    service PaymentService
    {

    rpc processPayment(PaymentRequest) returns (PaymentResponse) {
    }

    }

    message PaymentRequest
    {

    enum Currency
    {

    BRL = 0
    ;

    USD = 1
    ;

    }



    string cardNumber = 1
    ;

    string expiryDate = 2
    ;

    string cvc = 3
    ;

    double amount = 4
    ;

    Currency currency = 5
    ;

    }

    message PaymentResponse
    {

    bool success = 1
    ;

    string txId = 2
    ;

    }
    paymentService.proto

    View Slide

  147. syntax = "proto3"
    ;

    service PaymentService
    {

    rpc processPayment(PaymentRequest) returns (PaymentResponse) {
    }

    }

    message PaymentRequest
    {

    enum Currency
    {

    BRL = 0
    ;

    USD = 1
    ;

    }



    string cardNumber = 1
    ;

    string expiryDate = 2
    ;

    string cvc = 3
    ;

    double amount = 4
    ;

    Currency currency = 5
    ;

    }

    message PaymentResponse
    {

    bool success = 1
    ;

    string txId = 2
    ;

    }
    paymentService.proto

    View Slide

  148. syntax = "proto3"
    ;

    service PaymentService
    {

    rpc processPayment(PaymentRequest) returns (PaymentResponse) {
    }

    }

    message PaymentRequest
    {

    enum Currency
    {

    BRL = 0
    ;

    USD = 1
    ;

    }



    string cardNumber = 1
    ;

    string expiryDate = 2
    ;

    string cvc = 3
    ;

    double amount = 4
    ;

    Currency currency = 5
    ;

    }

    message PaymentResponse
    {

    bool success = 1
    ;

    string txId = 2
    ;

    }
    paymentService.proto

    View Slide

  149. Compilando o arquivo .proto

    View Slide

  150. Channel channel = ManagedChannelBuilde
    r

    .forAddress("paymentservice.com", 50051
    )

    .build()
    ;

    PaymentServiceBlockingStub paymentService = PaymentServiceGrpc.newBlockingStub(channel)
    ;

    PaymentRequest request = newBuilder(
    )

    .setCardNumber("1234 5678 8765 4321"
    )

    .setExpiryDate("03/2028"
    )

    .setCvc("123"
    )

    .setAmount(120.2
    )

    .setCurrency(Currency.BRL
    )

    .build()
    ;

    PaymentResponse result = paymentService.processPayment(request)
    ;

    if (result.getSuccess())
    {

    // processa fluxo do pedido..
    .

    }

    gRPC Client | Consumindo endpoint de pagamento

    View Slide

  151. Channel channel = ManagedChannelBuilde
    r

    .forAddress("paymentservice.com", 50051
    )

    .build()
    ;

    PaymentServiceBlockingStub paymentService = PaymentServiceGrpc.newBlockingStub(channel)
    ;

    PaymentRequest request = newBuilder(
    )

    .setCardNumber("1234 5678 8765 4321"
    )

    .setExpiryDate("03/2028"
    )

    .setCvc("123"
    )

    .setAmount(120.2
    )

    .setCurrency(Currency.BRL
    )

    .build()
    ;

    PaymentResponse result = paymentService.processPayment(request)
    ;

    if (result.getSuccess())
    {

    // processa fluxo do pedido..
    .

    }

    gRPC Client | Consumindo endpoint de pagamento

    View Slide

  152. Channel channel = ManagedChannelBuilde
    r

    .forAddress("paymentservice.com", 50051
    )

    .build()
    ;

    PaymentServiceBlockingStub paymentService = PaymentServiceGrpc.newBlockingStub(channel)
    ;

    PaymentRequest request = newBuilder(
    )

    .setCardNumber("1234 5678 8765 4321"
    )

    .setExpiryDate("03/2028"
    )

    .setCvc("123"
    )

    .setAmount(120.2
    )

    .setCurrency(Currency.BRL
    )

    .build()
    ;

    PaymentResponse result = paymentService.processPayment(request)
    ;

    if (result.getSuccess())
    {

    // processa fluxo do pedido..
    .

    }

    gRPC Client | Consumindo endpoint de pagamento

    View Slide

  153. Channel channel = ManagedChannelBuilde
    r

    .forAddress("paymentservice.com", 50051
    )

    .build()
    ;

    PaymentServiceBlockingStub paymentService = PaymentServiceGrpc.newBlockingStub(channel)
    ;

    PaymentRequest request = newBuilder(
    )

    .setCardNumber("1234 5678 8765 4321"
    )

    .setExpiryDate("03/2028"
    )

    .setCvc("123"
    )

    .setAmount(120.2
    )

    .setCurrency(Currency.BRL
    )

    .build()
    ;

    PaymentResponse result = paymentService.processPayment(request)
    ;

    if (result.getSuccess())
    {

    // processa fluxo do pedido..
    .

    }

    gRPC Client | Consumindo endpoint de pagamento

    View Slide

  154. Channel channel = ManagedChannelBuilde
    r

    .forAddress("paymentservice.com", 50051
    )

    .build()
    ;

    PaymentServiceBlockingStub paymentService = PaymentServiceGrpc.newBlockingStub(channel)
    ;

    PaymentRequest request = newBuilder(
    )

    .setCardNumber("1234 5678 8765 4321"
    )

    .setExpiryDate("03/2028"
    )

    .setCvc("123"
    )

    .setAmount(120.2
    )

    .setCurrency(Currency.BRL
    )

    .build()
    ;

    PaymentResponse result = paymentService.processPayment(request)
    ;

    if (result.getSuccess())
    {

    // processa fluxo do pedido..
    .

    }

    gRPC Client | Consumindo endpoint de pagamento

    View Slide

  155. Channel channel = ManagedChannelBuilde
    r

    .forAddress("paymentservice.com", 50051
    )

    .build()
    ;

    PaymentServiceBlockingStub paymentService = PaymentServiceGrpc.newBlockingStub(channel)
    ;

    PaymentRequest request = newBuilder(
    )

    .setCardNumber("1234 5678 8765 4321"
    )

    .setExpiryDate("03/2028"
    )

    .setCvc("123"
    )

    .setAmount(120.2
    )

    .setCurrency(Currency.BRL
    )

    .build()
    ;

    PaymentResponse result = paymentService.processPayment(request)
    ;

    if (result.getSuccess())
    {

    // processa fluxo do pedido..
    .

    }

    gRPC Client | Consumindo endpoint de pagamento

    View Slide

  156. Channel channel = ManagedChannelBuilde
    r

    .forAddress("paymentservice.com", 50051
    )

    .build()
    ;

    PaymentServiceBlockingStub paymentService = PaymentServiceGrpc.newBlockingStub(channel)
    ;

    PaymentRequest request = newBuilder(
    )

    .setCardNumber("1234 5678 8765 4321"
    )

    .setExpiryDate("03/2028"
    )

    .setCvc("123"
    )

    .setAmount(120.2
    )

    .setCurrency(Currency.BRL
    )

    .build()
    ;

    PaymentResponse result = paymentService.processPayment(request)
    ;

    if (result.getSuccess())
    {

    // processa fluxo do pedido..
    .

    }

    gRPC Client | Consumindo endpoint de pagamento

    View Slide

  157. No
    fi
    nal das
    contas…

    View Slide

  158. Protobuf Work
    fl
    ow

    View Slide

  159. .proto
    1 Define
    Protobuf Work
    fl
    ow

    View Slide

  160. .proto protoc
    1 Define 2 Compile
    Protobuf Work
    fl
    ow

    View Slide

  161. .proto protoc
    go
    java
    python
    1 Define 2 Compile
    Protobuf Work
    fl
    ow

    View Slide

  162. .proto protoc
    go
    java
    python
    1 Define 2 Compile
    0101010

    1010101

    0101010

    3 Serialize
    Protobuf Work
    fl
    ow

    View Slide

  163. gRPC Work
    fl
    ow

    View Slide

  164. .proto
    1 Define
    gRPC Work
    fl
    ow

    View Slide

  165. .proto protoc
    1 Define 2 Compile
    gRPC Work
    fl
    ow

    View Slide

  166. .proto protoc
    go
    java
    python
    1 Define 2 Compile
    gRPC Work
    fl
    ow

    View Slide

  167. .proto protoc
    go
    java
    python
    1 Define 2 Compile
    server
    3 Implement
    gRPC Work
    fl
    ow
    client

    View Slide

  168. .proto protoc
    go
    java
    python
    1 Define 2 Compile
    server
    3 Implement
    gRPC Work
    fl
    ow
    client

    View Slide

  169. syntax = "proto3"
    ;

    service PaymentService
    {

    rpc processPayment(PaymentRequest) returns (PaymentResponse) {
    }

    }

    message PaymentRequest
    {

    enum Currency
    {

    BRL = 0
    ;

    USD = 1
    ;

    }



    string cardNumber = 1
    ;

    string expiryDate = 2
    ;

    string cvc = 3
    ;

    double amount = 4
    ;

    Currency currency = 5
    ;

    }

    message PaymentResponse
    {

    bool success = 1
    ;

    string txId = 2
    ;

    }
    paymentService.proto

    View Slide

  170. syntax = "proto3"
    ;

    service PaymentService
    {

    rpc processPayment(PaymentRequest) returns (PaymentResponse) {
    }

    }

    message PaymentRequest
    {

    enum Currency
    {

    BRL = 0
    ;

    USD = 1
    ;

    }



    string cardNumber = 1
    ;

    string expiryDate = 2
    ;

    string cvc = 3
    ;

    double amount = 4
    ;

    Currency currency = 5
    ;

    }

    message PaymentResponse
    {

    bool success = 1
    ;

    string txId = 2
    ;

    }
    paymentService.proto

    View Slide

  171. public class PaymentEndpoint extends PaymentServiceGrpc.PaymentServiceImplBase
    {

    @Override
    public void processPayment(PaymentRequest request
    ,

    StreamObserver responseObserver)
    {

    // lógica de negóci
    o

    Payment payment = toPayment(request); // converte para modelo de domíni
    o

    UUID transactionId = new PaymentService().process(payment)
    ;

    // envia resposta para o clien
    t

    responseObserver.onNext(PaymentResponse.newBuilder(
    )

    .setTxId(transactionId.toString()
    )

    .setSuccess(true
    )

    .build())
    ;

    responseObserver.onCompleted()
    ;

    }
    }
    gRPC Server | Expondo endpoint de pagamento

    View Slide

  172. public class PaymentEndpoint extends PaymentServiceGrpc.PaymentServiceImplBase
    {

    @Override
    public void processPayment(PaymentRequest request
    ,

    StreamObserver responseObserver)
    {

    // lógica de negóci
    o

    Payment payment = toPayment(request); // converte para modelo de domíni
    o

    UUID transactionId = new PaymentService().process(payment)
    ;

    // envia resposta para o clien
    t

    responseObserver.onNext(PaymentResponse.newBuilder(
    )

    .setTxId(transactionId.toString()
    )

    .setSuccess(true
    )

    .build())
    ;

    responseObserver.onCompleted()
    ;

    }
    }
    gRPC Server | Expondo endpoint de pagamento

    View Slide

  173. public class PaymentEndpoint extends PaymentServiceGrpc.PaymentServiceImplBase
    {

    @Override
    public void processPayment(PaymentRequest request
    ,

    StreamObserver responseObserver)
    {

    // lógica de negóci
    o

    Payment payment = toPayment(request); // converte para modelo de domíni
    o

    UUID transactionId = new PaymentService().process(payment)
    ;

    // envia resposta para o clien
    t

    responseObserver.onNext(PaymentResponse.newBuilder(
    )

    .setTxId(transactionId.toString()
    )

    .setSuccess(true
    )

    .build())
    ;

    responseObserver.onCompleted()
    ;

    }
    }
    gRPC Server | Expondo endpoint de pagamento

    View Slide

  174. public class PaymentEndpoint extends PaymentServiceGrpc.PaymentServiceImplBase
    {

    @Overrid
    e

    public void processPayment(PaymentRequest request
    ,

    StreamObserver responseObserver)
    {

    // lógica de negóci
    o

    Payment payment = toPayment(request); // converte para modelo de domíni
    o

    UUID transactionId = new PaymentService().process(payment)
    ;

    // envia resposta para o clien
    t

    responseObserver.onNext(PaymentResponse.newBuilder(
    )

    .setTxId(transactionId.toString()
    )

    .setSuccess(true
    )

    .build())
    ;

    responseObserver.onCompleted()
    ;

    }

    }
    gRPC Server | Expondo endpoint de pagamento

    View Slide

  175. public class PaymentEndpoint extends PaymentServiceGrpc.PaymentServiceImplBase
    {

    @Overrid
    e

    public void processPayment(PaymentRequest request
    ,

    StreamObserver responseObserver)
    {

    // lógica de negóci
    o

    Payment payment = toPayment(request); // converte para modelo de domíni
    o

    UUID transactionId = new PaymentService().process(payment)
    ;

    // envia resposta para o clien
    t

    responseObserver.onNext(PaymentResponse.newBuilder(
    )

    .setTxId(transactionId.toString()
    )

    .setSuccess(true
    )

    .build())
    ;

    responseObserver.onCompleted()
    ;

    }

    }
    gRPC Server | Expondo endpoint de pagamento

    View Slide

  176. public class PaymentEndpoint extends PaymentServiceGrpc.PaymentServiceImplBase
    {

    @Overrid
    e

    public void processPayment(PaymentRequest request
    ,

    StreamObserver responseObserver)
    {

    // lógica de negóci
    o

    Payment payment = toPayment(request); // converte para modelo de domíni
    o

    UUID transactionId = new PaymentService().process(payment)
    ;

    // envia resposta para o clien
    t

    responseObserver.onNext(PaymentResponse.newBuilder(
    )

    .setTxId(transactionId.toString()
    )

    .setSuccess(true
    )

    .build())
    ;

    responseObserver.onCompleted()
    ;

    }

    }
    gRPC Server | Expondo endpoint de pagamento

    View Slide

  177. public class PaymentEndpoint extends PaymentServiceGrpc.PaymentServiceImplBase
    {

    @Overrid
    e

    public void processPayment(PaymentRequest request
    ,

    StreamObserver responseObserver)
    {

    // lógica de negóci
    o

    Payment payment = toPayment(request); // converte para modelo de domíni
    o

    UUID transactionId = new PaymentService().process(payment)
    ;

    // envia resposta para o clien
    t

    responseObserver.onNext(PaymentResponse.newBuilder(
    )

    .setTxId(transactionId.toString()
    )

    .setSuccess(true
    )

    .build())
    ;

    responseObserver.onCompleted()
    ;

    }

    }
    gRPC Server | Expondo endpoint de pagamento

    View Slide

  178. public class PaymentEndpoint extends PaymentServiceGrpc.PaymentServiceImplBase
    {

    @Overrid
    e

    public void processPayment(PaymentRequest request
    ,

    StreamObserver responseObserver)
    {

    // lógica de negóci
    o

    Payment payment = toPayment(request); // converte para modelo de domíni
    o

    UUID transactionId = new PaymentService().process(payment)
    ;

    // envia resposta para o clien
    t

    responseObserver.onNext(PaymentResponse.newBuilder(
    )

    .setTxId(transactionId.toString()
    )

    .setSuccess(true
    )

    .build())
    ;

    responseObserver.onCompleted()
    ;

    }

    }
    gRPC Server | Expondo endpoint de pagamento

    View Slide

  179. public class PaymentEndpoint extends PaymentServiceGrpc.PaymentServiceImplBase
    {

    @Overrid
    e

    public void processPayment(PaymentRequest request
    ,

    StreamObserver responseObserver)
    {

    // lógica de negóci
    o

    Payment payment = toPayment(request); // converte para modelo de domíni
    o

    UUID transactionId = new PaymentService().process(payment)
    ;

    // envia resposta para o clien
    t

    responseObserver.onNext(PaymentResponse.newBuilder(
    )

    .setTxId(transactionId.toString()
    )

    .setSuccess(true
    )

    .build())
    ;

    responseObserver.onCompleted()
    ;

    }

    }
    gRPC Server | Expondo endpoint de pagamento

    View Slide

  180. public class PaymentEndpoint extends PaymentServiceGrpc.PaymentServiceImplBase
    {

    @Overrid
    e

    public void processPayment(PaymentRequest request
    ,

    StreamObserver responseObserver)
    {

    // lógica de negóci
    o

    Payment payment = toPayment(request); // converte para modelo de domíni
    o

    UUID transactionId = new PaymentService().process(payment)
    ;

    // envia resposta para o clien
    t

    responseObserver.onNext(PaymentResponse.newBuilder(
    )

    .setTxId(transactionId.toString()
    )

    .setSuccess(true
    )

    .build())
    ;

    responseObserver.onCompleted()
    ;

    }

    }
    gRPC Server | Expondo endpoint de pagamento

    View Slide

  181. public class PaymentEndpoint extends PaymentServiceGrpc.PaymentServiceImplBase
    {

    @Overrid
    e

    public void processPayment(PaymentRequest request
    ,

    StreamObserver responseObserver)
    {

    // lógica de negóci
    o

    Payment payment = toPayment(request); // converte para modelo de domíni
    o

    UUID transactionId = new PaymentService().process(payment)
    ;

    // envia resposta para o clien
    t

    responseObserver.onNext(PaymentResponse.newBuilder(
    )

    .setTxId(transactionId.toString()
    )

    .setSuccess(true
    )

    .build())
    ;

    responseObserver.onCompleted()
    ;

    }

    }
    gRPC Server | Expondo endpoint de pagamento

    View Slide

  182. Padrões de
    comunicação

    View Slide

  183. View Slide

  184. 1 2
    3 4

    View Slide

  185. server
    client
    Simple RPC (Unary RPC)
    2
    3 4

    View Slide

  186. server
    client server
    client
    Simple RPC (Unary RPC) Server-side Streaming RPC
    3 4

    View Slide

  187. server
    client server
    client
    server
    client
    Simple RPC (Unary RPC) Server-side Streaming RPC
    Client-side Streaming RPC
    4

    View Slide

  188. server
    client server
    client
    server
    client server
    client
    Simple RPC (Unary RPC) Server-side Streaming RPC
    Client-side Streaming RPC Bidirectional Streaming RPC

    View Slide

  189. syntax = "proto3";
    service PaymentService
    {

    rpc processPayment(PaymentRequest) returns (PaymentResponse) {
    }

    rpc listenToTransactions(TransactionRequest) returns (stream TransactionResponse) {
    }

    rpc processPaymentInBatch(stream PaymentInBatchRequest) returns (PaymentInBatchResponse) {
    }

    rpc validateCreditCard(stream CreditCardRequest) returns (stream ValidateCCResponse) {
    }

    }
    paymentService.proto

    View Slide

  190. syntax = "proto3";
    service PaymentService
    {

    rpc processPayment(PaymentRequest) returns (PaymentResponse) {
    }

    rpc listenToTransactions(TransactionRequest) returns (stream TransactionResponse) {
    }

    rpc processPaymentInBatch(stream PaymentInBatchRequest) returns (PaymentInBatchResponse) {
    }

    rpc validateCreditCard(stream CreditCardRequest) returns (stream ValidateCCResponse) {
    }

    }
    paymentService.proto
    Simple RPC (Unary RPC)

    View Slide

  191. syntax = "proto3";
    service PaymentService
    {

    rpc processPayment(PaymentRequest) returns (PaymentResponse) {
    }

    rpc listenToTransactions(TransactionRequest) returns (stream TransactionResponse) {
    }

    rpc processPaymentInBatch(stream PaymentInBatchRequest) returns (PaymentInBatchResponse) {
    }

    rpc validateCreditCard(stream CreditCardRequest) returns (stream ValidateCCResponse) {
    }

    }
    paymentService.proto

    View Slide

  192. syntax = "proto3";
    service PaymentService
    {

    rpc processPayment(PaymentRequest) returns (PaymentResponse) {
    }

    rpc listenToTransactions(TransactionRequest) returns (stream TransactionResponse) {
    }

    rpc processPaymentInBatch(stream PaymentInBatchRequest) returns (PaymentInBatchResponse) {
    }

    rpc validateCreditCard(stream CreditCardRequest) returns (stream ValidateCCResponse) {
    }

    }
    paymentService.proto
    Server-side Streaming RPC

    View Slide

  193. syntax = "proto3";
    service PaymentService
    {

    rpc processPayment(PaymentRequest) returns (PaymentResponse) {}
    rpc listenToTransactions(TransactionRequest) returns (stream TransactionResponse) {}
    rpc processPaymentInBatch(stream PaymentInBatchRequest) returns (PaymentInBatchResponse) {
    }

    rpc validateCreditCard(stream CreditCardRequest) returns (stream ValidateCCResponse) {
    }

    }
    paymentService.proto

    View Slide

  194. syntax = "proto3";
    service PaymentService
    {

    rpc processPayment(PaymentRequest) returns (PaymentResponse) {
    }

    rpc listenToTransactions(TransactionRequest) returns (stream TransactionResponse) {}
    rpc processPaymentInBatch(stream PaymentInBatchRequest) returns (PaymentInBatchResponse) {
    }

    rpc validateCreditCard(stream CreditCardRequest) returns (stream ValidateCCResponse) {
    }

    }
    paymentService.proto
    Client-side Streaming RPC

    View Slide

  195. syntax = "proto3";
    service PaymentService
    {

    rpc processPayment(PaymentRequest) returns (PaymentResponse) {
    }

    rpc listenToTransactions(TransactionRequest) returns (stream TransactionResponse) {
    }

    rpc processPaymentInBatch(stream PaymentInBatchRequest) returns (PaymentInBatchResponse) {}
    rpc validateCreditCard(stream CreditCardRequest) returns (stream ValidateCCResponse) {
    }

    }
    paymentService.proto

    View Slide

  196. syntax = "proto3";
    service PaymentService
    {

    rpc processPayment(PaymentRequest) returns (PaymentResponse) {
    }

    rpc listenToTransactions(TransactionRequest) returns (stream TransactionResponse) {}
    rpc processPaymentInBatch(stream PaymentInBatchRequest) returns (PaymentInBatchResponse) {
    }

    rpc validateCreditCard(stream CreditCardRequest) returns (stream ValidateCCResponse) {
    }

    }
    paymentService.proto
    Bidirectional Streaming RPC

    View Slide

  197. paymentService.proto
    syntax = "proto3";
    service PaymentService
    {

    rpc processPayment(PaymentRequest) returns (PaymentResponse) {
    }

    rpc listenToTransactions(TransactionRequest) returns (stream TransactionResponse) {
    }

    rpc processPaymentInBatch(stream PaymentInBatchRequest) returns (PaymentInBatchResponse) {
    }

    rpc validateCreditCard(stream CreditCardRequest) returns (stream CreditCardResponse) {
    }

    }

    View Slide

  198. .proto protoc
    go
    java
    python
    1 Define 2 Compile
    server
    3 Implement
    gRPC Work
    fl
    ow
    client

    View Slide

  199. CONCLUINDO

    View Slide

  200. Microservices

    View Slide

  201. Microservices Mobile

    View Slide

  202. Microservices Mobile Realtime

    View Slide

  203. https://grpc.io/

    View Slide

  204. View Slide

  205. https://www.zup.com.br/orange-talents

    View Slide

  206. @rponte
    Rafael Ponte

    View Slide