Building microservices with Kotlin and gRPC Marharyta Nedzelska - - PowerPoint PPT Presentation

building microservices with kotlin and grpc marharyta
SMART_READER_LITE
LIVE PREVIEW

Building microservices with Kotlin and gRPC Marharyta Nedzelska - - PowerPoint PPT Presentation

Building microservices with Kotlin and gRPC Marharyta Nedzelska @jMargaritaN Copenhagen Denmark Building microservices with Kotlin and gRPC Who am I? Marharyta Nedzelska Software Engineer @ Wix KKUG & KNight Kyiv, Devoxx


slide-1
SLIDE 1

Copenhagen Denmark

Building microservices with Kotlin and gRPC Marharyta Nedzelska

@jMargaritaN

slide-2
SLIDE 2

Who am I?

Building microservices with Kotlin and gRPC

Marharyta Nedzelska

  • Software Engineer @ Wix
  • KKUG & KNight Kyiv, Devoxx UA
  • https://medium.com/@margoqueen95
  • @jMargaritaN twitter

2

slide-3
SLIDE 3

One more thing you should know

Building microservices with Kotlin and gRPC

3

I like boxing! So think twice before asking tricky questions!

slide-4
SLIDE 4

AGENDA

Let’s talk about gRPC Implement Service gRPC and coroutines gRPC Kotlin libs

4

slide-5
SLIDE 5

The very beginning...

00

5

slide-6
SLIDE 6

Who writes microservices today, please, raise your hands?

6

slide-7
SLIDE 7

Microservices Rock!

▪ Independent ▪ Scalable ▪ Best suitable tool ▪ Parallel development ▪ etc...

Building microservices with Kotlin and gRPC

7

slide-8
SLIDE 8

8

slide-9
SLIDE 9

The biggest issue in changing a monolith into microservices lies in changing the communication pattern.

Btw, who said this?

9

slide-10
SLIDE 10

The biggest issue in changing a monolith into microservices lies in changing the communication pattern.

Btw, who said this?

Martin Fowler

10

slide-11
SLIDE 11

Who uses HTTP 1.1 and REST today, please, raise your hands?

11

slide-12
SLIDE 12

Clients Servers

12

slide-13
SLIDE 13

Let’s discover gRPC

01

13

slide-14
SLIDE 14

What does ‘gRPC’ stand for?

Riddle

14

Building microservices with Kotlin and gRPC

slide-15
SLIDE 15

“gRPC” means gRPC Remote Procedure Call

15

Building microservices with Kotlin and gRPC

slide-16
SLIDE 16

16

Building microservices with Kotlin and gRPC

slide-17
SLIDE 17

That’s ‘g’. What the hell is ‘RPC’?

17

Building microservices with Kotlin and gRPC

slide-18
SLIDE 18

In distributed computing, a remote procedure call (RPC) is when a computer program causes a procedure to execute in a different address space, which is coded as if it was a normal (local) procedure call.

https://en.wikipedia.org/wiki/Remote_procedure_call

18

Building microservices with Kotlin and gRPC

slide-19
SLIDE 19

gRPC Features

19

Building microservices with Kotlin and gRPC

slide-20
SLIDE 20

gRPC Features

▪ Use HTTP/2 20

Building microservices with Kotlin and gRPC

slide-21
SLIDE 21

1991

HTTP 0.9

HTTP protocol evolution

1996

HTTP 1.0

1997

HTTP 1.1

21

Building microservices with Kotlin and gRPC

slide-22
SLIDE 22

HTTP protocol evolution

Building microservices with Kotlin and gRPC

No progress here

2000 1999 1998 22

slide-23
SLIDE 23

HTTP protocol evolution

And here

2003 2002 2001 23

Building microservices with Kotlin and gRPC

slide-24
SLIDE 24

HTTP protocol evolution

And still no progress...

2006 2005 2004 24

Building microservices with Kotlin and gRPC

slide-25
SLIDE 25

HTTP protocol evolution

Are they alive?

2009 2008 2007 25

Building microservices with Kotlin and gRPC

slide-26
SLIDE 26

HTTP protocol evolution

I guess no...

2012 2011 2010 26

Building microservices with Kotlin and gRPC

slide-27
SLIDE 27

HTTP protocol evolution

And suddenly!

2015 2014 2013 27

Building microservices with Kotlin and gRPC

slide-28
SLIDE 28

HTTP protocol evolution

2015

HTTP/2

28

Building microservices with Kotlin and gRPC

I am alive!

slide-29
SLIDE 29

gRPC Features

▪ Use HTTP/2

Single TCP connection

29

Building microservices with Kotlin and gRPC

slide-30
SLIDE 30

gRPC Features

▪ Use HTTP/2

Single TCP connection

Bidirectional streaming

30

Building microservices with Kotlin and gRPC

slide-31
SLIDE 31

gRPC Features

▪ Use HTTP/2

Single TCP connection

Bidirectional streaming

Flow control

31

Building microservices with Kotlin and gRPC

slide-32
SLIDE 32

gRPC Features

▪ Use HTTP/2

Single TCP connection

Bidirectional streaming

Flow control

▪ Supports multiple languages

Building microservices with Kotlin and gRPC

32

slide-33
SLIDE 33

gRPC Features

▪ Use HTTP/2

Single TCP connection

Bidirectional streaming

Flow control

▪ Supports multiple languages ▪ Binary, uses protobuf

Building microservices with Kotlin and gRPC

33

slide-34
SLIDE 34

34

slide-35
SLIDE 35

35

Building microservices with Kotlin and gRPC

slide-36
SLIDE 36

+ ScalaPB

36

Building microservices with Kotlin and gRPC

slide-37
SLIDE 37

?

37

Building microservices with Kotlin and gRPC

slide-38
SLIDE 38

gRPC Discovered!

▪ Use HTTP/2

Single TCP connection

Bidirectional streaming

Flow control

▪ Supports multiple languages ▪ Binary, uses protobuf

Building microservices with Kotlin and gRPC

38

slide-39
SLIDE 39

Protocol Buffers

02

39

slide-40
SLIDE 40

Protocol buffers are Google’s language-neutral, platform-neutral, extensible mechanism for serializing structured data — think XML, but smaller, faster, and simpler.

https://developers.google.com/protocol-buffers/

40

Building microservices with Kotlin and gRPC

slide-41
SLIDE 41

Sample .proto file

Building microservices with Kotlin and gRPC

syntax = "proto3"; package helloworld; service Greeter { rpc SayHello (HelloRequest) returns (HelloReply) {} } message HelloRequest { string name = 1; } message HelloReply { string message = 1; }

41

slide-42
SLIDE 42

Building microservices with Kotlin and gRPC

42

compiling...

slide-43
SLIDE 43

Protobuf summary

▪ Type Safety

Building microservices with Kotlin and gRPC

43

slide-44
SLIDE 44

Protobuf summary

▪ Type Safety ▪ No schema violations

Building microservices with Kotlin and gRPC

44

slide-45
SLIDE 45

Protobuf summary

▪ Type Safety ▪ No schema violations

▪ Fast serialization/deserialization

Building microservices with Kotlin and gRPC

45

slide-46
SLIDE 46

Protobuf summary

▪ Type Safety ▪ No schema violations

▪ Fast serialization/deserialization ▪ Backward compatibility

Building microservices with Kotlin and gRPC

46

slide-47
SLIDE 47

Protobuf summary

▪ Type Safety ▪ No schema violations

▪ Fast serialization/deserialization ▪ Backward compatibility ▪ Human readability

Building microservices with Kotlin and gRPC

47

slide-48
SLIDE 48

Implement Service

03

48

slide-49
SLIDE 49

We’re building a Death Star!

49

slide-50
SLIDE 50

50

Building microservices with Kotlin and gRPC

slide-51
SLIDE 51

Task for this session

▪ Write a “Death Star” ▪ Destroy as much planets as you can ▪ Tweet with #kotlinconf #gRPC and #Kotlin tags ▪ Greet winners at the end of our session! ▪ Enjoy!

Building microservices with Kotlin and gRPC

51

slide-52
SLIDE 52

Application is here!

52

http://104.198.212.208:8080

slide-53
SLIDE 53

Building microservices with Kotlin and gRPC

When user joins ...

53

l

  • g

s

slide-54
SLIDE 54

Building microservices with Kotlin and gRPC

When user destroys planet ...

54

l

  • g

s

slide-55
SLIDE 55

Let’s implement!

55

slide-56
SLIDE 56

First look at proto

syntax = "proto3";

  • ption java_package = "ua.nedz.grpc";
  • ption java_outer_classname = "DeathStarProto";
  • ption objc_class_prefix = "DSP";

package deathstar; import "planet.proto"; service DeathStarService { rpc Destroy (stream DestroyPlanetRequest) returns (stream Planets) {} }

Building microservices with Kotlin and gRPC

56

slide-57
SLIDE 57

First look at proto

message Planet { int64 planetId = 1; string name = 2; int64 weight = 3; int32 img = 4; } message Planets { repeated Planet planets = 1; } message DestroyPlanetRequest { string userName = 1; int64 planetId = 2; int64 weight = 3; }

Building microservices with Kotlin and gRPC

57

slide-58
SLIDE 58

Building microservices with Kotlin and gRPC

58

slide-59
SLIDE 59

And we have generated

@javax.annotation.Generated( value = "by gRPC proto compiler (version 1.16.1)", comments = "Source: death-star.proto") public final class DeathStarServiceGrpc {...} public final class DeathStarProto {...} public final class PlanetProto {...} ...

Building microservices with Kotlin and gRPC

59

slide-60
SLIDE 60

Building microservices with Kotlin and gRPC

60

slide-61
SLIDE 61

Server is

class DeathStarServer (private val port: Int = 50051, private val serverBuilder: ServerBuilder<*> = ServerBuilder.forPort(port)) { private lateinit var server: Server fun start() { server = serverBuilder .addService(DeathStarServiceImpl()) .build() .start() println("Server started!") } }

Building microservices with Kotlin and gRPC

61

slide-62
SLIDE 62

Building microservices with Kotlin and gRPC

62

slide-63
SLIDE 63

Building microservices with Kotlin and gRPC

63

slide-64
SLIDE 64

gRPC and coroutines

04

64

slide-65
SLIDE 65

The whole destroy method...

  • verride fun destroy(responseObserver: StreamObserver<Planets>): StreamObserver<DestroyPlanetRequest> {
listeners.add(responseObserver) planetStub.getAllPlanets(Empty.getDefaultInstance(),
  • bject : StreamObserver<Planets> by DefaultStreamObserver() {
  • verride fun onNext(planets: Planets) {
responseObserver.onNext(populateWithCoordinnates(planets)) } }) return object : StreamObserver<DestroyPlanetRequest> by DefaultStreamObserver() {
  • verride fun onNext(destroyPlanetRequest: DestroyPlanetRequest) {
planetStub.removePlanet(RemovePlanetRequest { planetId = destroyPlanetRequest.planetId },
  • bject : StreamObserver<PlanetServiceProto.RemovePlanetResponse> by DefaultStreamObserver() {
  • verride fun onNext(removePlanetResponse: PlanetServiceProto.RemovePlanetResponse) {
if (removePlanetResponse.result) { scoreStub.addScore(AddScoreRequest { userName = destroyPlanetRequest.userName toAdd = destroyPlanetRequest.weight }, object : StreamObserver<Empty> by DefaultStreamObserver() {}) logStub.destroyedPlanet(destroyPlanetRequest, object : StreamObserver<Empty> by DefaultStreamObserver() {}) planetStub.generateNewPlanet(Empty.getDefaultInstance(),
  • bject : StreamObserver<PlanetProto.Planet> by DefaultStreamObserver() {
  • verride fun onNext(planet: PlanetProto.Planet) {
logStub.newPlanet(planet, object : StreamObserver<Empty> by DefaultStreamObserver() {}) listeners.forEach { it.onNext(Planets { addPlanets(populateWithCoordinates(planet, destroyPlanetRequest.coordinates.x, destroyPlanetRequest.coordinates.y)) }) } } }) } } }) } } }

Building microservices with Kotlin and gRPC

65

slide-66
SLIDE 66

The whole destroy method...

  • verride fun destroy(responseObserver: StreamObserver<Planets>): StreamObserver<DestroyPlanetRequest> {
listeners.add(responseObserver) planetStub.getAllPlanets(Empty.getDefaultInstance(),
  • bject : StreamObserver<Planets> by DefaultStreamObserver() {
  • verride fun onNext(planets: Planets) {
responseObserver.onNext(populateWithCoordinnates(planets)) } }) return object : StreamObserver<DestroyPlanetRequest> by DefaultStreamObserver() {
  • verride fun onNext(destroyPlanetRequest: DestroyPlanetRequest) {
planetStub.removePlanet(RemovePlanetRequest { planetId = destroyPlanetRequest.planetId },
  • bject : StreamObserver<PlanetServiceProto.RemovePlanetResponse> by DefaultStreamObserver() {
  • verride fun onNext(removePlanetResponse: PlanetServiceProto.RemovePlanetResponse) {
if (removePlanetResponse.result) { scoreStub.addScore(AddScoreRequest { userName = destroyPlanetRequest.userName toAdd = destroyPlanetRequest.weight }, object : StreamObserver<Empty> by DefaultStreamObserver() {}) logStub.destroyedPlanet(destroyPlanetRequest, object : StreamObserver<Empty> by DefaultStreamObserver() {}) planetStub.generateNewPlanet(Empty.getDefaultInstance(),
  • bject : StreamObserver<PlanetProto.Planet> by DefaultStreamObserver() {
  • verride fun onNext(planet: PlanetProto.Planet) {
logStub.newPlanet(planet, object : StreamObserver<Empty> by DefaultStreamObserver() {}) listeners.forEach { it.onNext(Planets { addPlanets(populateWithCoordinates(planet, destroyPlanetRequest.coordinates.x, destroyPlanetRequest.coordinates.y)) }) } } }) } } }) } } }

Building microservices with Kotlin and gRPC

66

slide-67
SLIDE 67

The whole destroy method...

  • verride fun destroy(responseObserver: StreamObserver<Planets>): StreamObserver<DestroyPlanetRequest> {
listeners.add(responseObserver) planetStub.getAllPlanets(Empty.getDefaultInstance(),
  • bject : StreamObserver<Planets> by DefaultStreamObserver() {
  • verride fun onNext(planets: Planets) {
responseObserver.onNext(populateWithCoordinnates(planets)) } }) return object : StreamObserver<DestroyPlanetRequest> by DefaultStreamObserver() {
  • verride fun onNext(destroyPlanetRequest: DestroyPlanetRequest) {
planetStub.removePlanet(RemovePlanetRequest { planetId = destroyPlanetRequest.planetId },
  • bject : StreamObserver<PlanetServiceProto.RemovePlanetResponse> by DefaultStreamObserver() {
  • verride fun onNext(removePlanetResponse: PlanetServiceProto.RemovePlanetResponse) {
if (removePlanetResponse.result) { scoreStub.addScore(AddScoreRequest { userName = destroyPlanetRequest.userName toAdd = destroyPlanetRequest.weight }, object : StreamObserver<Empty> by DefaultStreamObserver() {}) logStub.destroyedPlanet(destroyPlanetRequest, object : StreamObserver<Empty> by DefaultStreamObserver() {}) planetStub.generateNewPlanet(Empty.getDefaultInstance(),
  • bject : StreamObserver<PlanetProto.Planet> by DefaultStreamObserver() {
  • verride fun onNext(planet: PlanetProto.Planet) {
logStub.newPlanet(planet, object : StreamObserver<Empty> by DefaultStreamObserver() {}) listeners.forEach { it.onNext(Planets { addPlanets(populateWithCoordinates(planet, destroyPlanetRequest.coordinates.x, destroyPlanetRequest.coordinates.y)) }) } } }) } } }) } } }

Building microservices with Kotlin and gRPC

67

callback hell

slide-68
SLIDE 68

Why don’t you use futures?

68

slide-69
SLIDE 69

Building microservices with Kotlin and gRPC

69

slide-70
SLIDE 70

Destroy method is

  • verride fun destroy(responseObserver: StreamObserver<PlanetProto.Planets>): StreamObserver<DestroyPlanetRequest> {
listeners.add(responseObserver) GlobalScope.launch { val allPlanets = planetStub.getAllPlanets(Empty.getDefaultInstance()).await() responseObserver.onNext(populateWithCoordinnates(allPlanets)) } return object : StreamObserver<DestroyPlanetRequest> by DefaultStreamObserver() {
  • verride fun onNext(destroyPlanetRequest: DestroyPlanetRequest) {
GlobalScope.launch { val removePlanet = planetStub.removePlanet( RemovePlanetRequest { planetId = destroyPlanetRequest.planetId }).await() if (removePlanet.result) { scoreStub.addScore(AddScoreRequest { userName = destroyPlanetRequest.userName toAdd = destroyPlanetRequest.weight }) logStub.destroyedPlanet(destroyPlanetRequest) val newPlanet = planetStub.generateNewPlanet(Empty.getDefaultInstance()).await() logStub.newPlanet(newPlanet) listeners.forEach { it.onNext(Planets { addPlanets(populateWithCoordinates(newPlanet, destroyPlanetRequest.coordinates.x, destroyPlanetRequest.coordinates.y)) }) } } } } } }

Building microservices with Kotlin and gRPC

70

slide-71
SLIDE 71

Destroy method is

  • verride fun destroy(responseObserver: StreamObserver<PlanetProto.Planets>): StreamObserver<DestroyPlanetRequest> {
listeners.add(responseObserver) GlobalScope.launch { val allPlanets = planetStub.getAllPlanets(Empty.getDefaultInstance()).await() responseObserver.onNext(populateWithCoordinnates(allPlanets)) } return object : StreamObserver<DestroyPlanetRequest> by DefaultStreamObserver() {
  • verride fun onNext(destroyPlanetRequest: DestroyPlanetRequest) {
GlobalScope.launch { val removePlanet = planetStub.removePlanet( RemovePlanetRequest { planetId = destroyPlanetRequest.planetId }).await() if (removePlanet.result) { scoreStub.addScore(AddScoreRequest { userName = destroyPlanetRequest.userName toAdd = destroyPlanetRequest.weight }) logStub.destroyedPlanet(destroyPlanetRequest) val newPlanet = planetStub.generateNewPlanet(Empty.getDefaultInstance()).await() logStub.newPlanet(newPlanet) listeners.forEach { it.onNext(Planets { addPlanets(populateWithCoordinates(newPlanet, destroyPlanetRequest.coordinates.x, destroyPlanetRequest.coordinates.y)) }) } } } } } }

Building microservices with Kotlin and gRPC

71

slide-72
SLIDE 72

gRPC and coroutines II

05

72

slide-73
SLIDE 73

Building microservices with Kotlin and gRPC

73

slide-74
SLIDE 74

We need a new hero!

74

Building microservices with Kotlin and gRPC

grpc-kotlin

slide-75
SLIDE 75

Building microservices with Kotlin and gRPC

75

slide-76
SLIDE 76

Destroy method is

  • verride suspend fun destroy(requests: ReceiveChannel<DestroyPlanetRequest>): ReceiveChannel<Planets> {

val channel = Channel<Planets>() listeners.add(channel) channel.send(populateWithCoordinnates(planetStub.getAllPlanets())) for (request in requests) { val wasRemoved = planetStub.removePlanet(RemovePlanetRequest { planetId = request.planetId }) if (wasRemoved.result) { scoreStub.addScore(AddScoreRequest { userName = request.userName toAdd = request.weight }) logStub.destroyedPlanet(request) val newPlanet = planetStub.generateNewPlanet() logStub.newPlanet(newPlanet) listeners.forEach { it.send(Planets { addPlanets(populateWithCoordinates(newPlanet, request.coordinates.x, request.coordinates.y)) }) } } } return channel } Building microservices with Kotlin and gRPC

76

slide-77
SLIDE 77

Destroy method is

  • verride fun destroy(requests: ReceiveChannel<DestroyPlanetRequest>): ReceiveChannel<Planets> {

val channel = Channel<Planets>() listeners.add(channel) channel.send(populateWithCoordinnates(planetStub.getAllPlanets())) for (request in requests) { val wasRemoved = planetStub.removePlanet(RemovePlanetRequest { planetId = request.planetId }) if (wasRemoved.result) { scoreStub.addScore(AddScoreRequest { userName = request.userName toAdd = request.weight }) logStub.destroyedPlanet(request) val newPlanet = planetStub.generateNewPlanet() logStub.newPlanet(newPlanet) listeners.forEach { it.send(Planets { addPlanets(populateWithCoordinates(newPlanet, request.coordinates.x, request.coordinates.y)) }) } } } return channel } Building microservices with Kotlin and gRPC

77

slide-78
SLIDE 78

78

Building microservices with Kotlin and gRPC

slide-79
SLIDE 79

We have another hero!

79

Building microservices with Kotlin and gRPC

kroto+

slide-80
SLIDE 80

Building microservices with Kotlin and gRPC

80

slide-81
SLIDE 81

Destroy method is

  • verride suspend fun destroy(requestChannel: ReceiveChannel<PlanetProto.DestroyPlanetRequest>,

responseChannel: SendChannel<PlanetProto.Planets>) { listeners.add(responseChannel) responseChannel.send(populateWithCoordinnates(planetStub.getAllPlanets())) for (request in requestChannel) { val wasRemoved = planetStub.removePlanet(RemovePlanetRequest { planetId = request.planetId }) if (wasRemoved.result) { scoreStub.addScore(AddScoreRequest { userName = request.userName toAdd = request.weight }) logStub.destroyedPlanet(request) val newPlanet = planetStub.generateNewPlanet() logStub.newPlanet(newPlanet) listeners.forEach { it.send(Planets { addPlanets(populateWithCoordinates(newPlanet, request.coordinates.x, request.coordinates.y)) }) } } } } Building microservices with Kotlin and gRPC

81

slide-82
SLIDE 82

Destroy method is

  • verride suspend fun destroy(requestChannel: ReceiveChannel<PlanetProto.DestroyPlanetRequest>,

responseChannel: SendChannel<PlanetProto.Planets>) { listeners.add(responseChannel) responseChannel.send(populateWithCoordinnates(planetStub.getAllPlanets())) for (request in requestChannel) { val wasRemoved = planetStub.removePlanet(RemovePlanetRequest { planetId = request.planetId }) if (wasRemoved.result) { scoreStub.addScore(AddScoreRequest { userName = request.userName toAdd = request.weight }) logStub.destroyedPlanet(request) val newPlanet = planetStub.generateNewPlanet() logStub.newPlanet(newPlanet) listeners.forEach { it.send(Planets { addPlanets(populateWithCoordinates(newPlanet, request.coordinates.x, request.coordinates.y)) }) } } } } Building microservices with Kotlin and gRPC

82

slide-83
SLIDE 83

More libs for Kotlin

06

83

slide-84
SLIDE 84

Expectation

Building microservices with Kotlin and gRPC

84

slide-85
SLIDE 85

Reality

Building microservices with Kotlin and gRPC

85

slide-86
SLIDE 86

86

https://github.com/rouzwawi/grpc-kotlin.git

Building microservices with Kotlin and gRPC

slide-87
SLIDE 87

87

https://github.com/rouzwawi/grpc-kotlin.git

Building microservices with Kotlin and gRPC

slide-88
SLIDE 88

88

https://github.com/rouzwawi/grpc-kotlin.git

Building microservices with Kotlin and gRPC

slide-89
SLIDE 89

89

https://github.com/rouzwawi/grpc-kotlin.git

Building microservices with Kotlin and gRPC

slide-90
SLIDE 90

90

https://github.com/rouzwawi/grpc-kotlin.git

Building microservices with Kotlin and gRPC

slide-91
SLIDE 91

91

https://github.com/rouzwawi/grpc-kotlin.git

Building microservices with Kotlin and gRPC

slide-92
SLIDE 92

92

Building microservices with Kotlin and gRPC

https://github.com/marcoferrer/kroto-plus.git

A year ago

slide-93
SLIDE 93

93

Building microservices with Kotlin and gRPC

https://github.com/marcoferrer/kroto-plus.git

slide-94
SLIDE 94

94

Building microservices with Kotlin and gRPC

https://github.com/marcoferrer/kroto-plus.git

slide-95
SLIDE 95

Useful links

https://github.com/salesforce/grpc-java-contrib/ https://github.com/salesforce/reactive-grpc https://github.com/cretz/pb-and-k https://github.com/leveretka/grpc-death-star https://medium.com/@bimeshde/grpc-vs-rest-performance-simplified-fd35d01bbd4

95

Building microservices with Kotlin and gRPC

slide-96
SLIDE 96

One day we’ll have a stable kotlin support

96

slide-97
SLIDE 97

We have a stable kotlin support!

97

slide-98
SLIDE 98

Time to summarize

98

slide-99
SLIDE 99

Takeaways

▪ Use gRPC for effective communications 99

Building microservices with Kotlin and gRPC

slide-100
SLIDE 100

Takeaways

▪ Use gRPC for effective communications ▪ gRPC + Kotlin can be used today 100

Building microservices with Kotlin and gRPC

slide-101
SLIDE 101

Takeaways

▪ Use gRPC for effective communications ▪ gRPC + Kotlin can be used today ▪ gRPC + Kotlin make things easier 101

Building microservices with Kotlin and gRPC

slide-102
SLIDE 102

Takeaways

▪ Use gRPC for effective communications ▪ gRPC + Kotlin can be used today ▪ gRPC + Kotlin make things easier ▪ Waiting for 1.0 release, flows... 102

Building microservices with Kotlin and gRPC

slide-103
SLIDE 103

Takeaways

▪ Use gRPC for effective communications ▪ gRPC + Kotlin can be used today ▪ gRPC + Kotlin make things easier ▪ Waiting for 1.0 release, flows...

▪ Feel free to contribute :)

103

Building microservices with Kotlin and gRPC

slide-104
SLIDE 104

Takeaways

▪ Use gRPC for effective communications ▪ gRPC + Kotlin can be used today ▪ gRPC + Kotlin make things easier ▪ Waiting for 1.0 release, flows...

▪ Feel free to contribute :) ▪ Don’t use grpc!

104

Building microservices with Kotlin and gRPC

slide-105
SLIDE 105

Takeaways

▪ Use gRPC for effective communications ▪ gRPC + Kotlin can be used today ▪ gRPC + Kotlin make things easier ▪ Waiting for 1.0 release, flows...

▪ Feel free to contribute :) ▪ Don’t use grpc! (when don’t need it)

105

Building microservices with Kotlin and gRPC

slide-106
SLIDE 106

Time to define the Death Star master

106

slide-107
SLIDE 107

Let’s say “Thank you”

107

slide-108
SLIDE 108

108

Without them I wouldn’t have done it!

Building microservices with Kotlin and gRPC

Ray Tsang Rouzbeh Delavari Marco Ferrer

slide-109
SLIDE 109

109

Without them I wouldn’t have done it!

Building microservices with Kotlin and gRPC

Alex Borysov Andrii Petryk George Lucas

slide-110
SLIDE 110

#KotlinConf

THANK YOU AND REMEMBER TO VOTE

Marharyta Nedzelska @jMargaritaN