SlideShare uma empresa Scribd logo
1 de 187
gRPC vs REST: let the battle begin!
JavaDay, November 4, 2017
Alex Borysov, Software Engineer @ Google
Mykyta Protsenko, Software Engineer @ Roku
Who are we?
Mykyta Protsenko
Software Engineer @ Roku
• passionate about all things scalable
• 18+ years in software engineering
• Author of Henka
REST vs gRPC
Alex Borysov
Software Engineer @ Google
• large scale systems developer
• 11+ years in software engineering
• Active gRPC user
REST vs gRPC
@aiborisov
@mykyta_p
@aiborisov
@mykyta_p
@aiborisov
@mykyta_p
JSON over HTTP
@aiborisov
@mykyta_p
I am getting frustrated by the number of people calling any
HTTP-based interface a REST API.
Roy Fielding
http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven
@aiborisov
@mykyta_p
@aiborisov
@mykyta_p
@aiborisov
@mykyta_p
RESTful API
GET /user/15
{
“name”: “John Doe”,
“email”:“john.doe@gmail.com”,
...
}
non-RESTful API
GET /last_search?page=2
{
“products”: [...]
...
}
@aiborisov
@mykyta_p
What is gRPC?
gRPC stands for gRPC Remote Procedure Calls.
A high performance, general purpose, feature-rich
RPC framework.
Part of Cloud Native Computing Foundation cncf.io
HTTP/2 and mobile first.
Open sourced version of Stubby RPC used in Google.
@aiborisov
@mykyta_p
RPC?! But...
AMF?
RMI?
CORBA?
@aiborisov
@mykyta_p
gRPC is not RMI
Maitainability
Ease of use
Performance
Scalability
L
e
s
s
o
n
s
Years of using Stubby
@aiborisov
@mykyta_p
What is gRPC?
Abstractions and best practices on how to design
RPCs.
Default implementation(s) from Google.
Extension points to plug custom implementations and
modifications.
Supports 10+ programming languages.
@aiborisov
@mykyta_p
gRPC Interoperability
Java
Service
Python
Service
GoLang
Service
C++
Service
gRPC
Service
gRPC
Stub
gRPC
Stub
gRPC
Stub
gRPC
Stub
gRPC
Service
gRPC
Service
gRPC
Service
gRPC
Stub
@aiborisov
@mykyta_p
Apples to Oranges?
@aiborisov
@mykyta_p
Microservices?
@aiborisov
@mykyta_p
Microservices?
How to draw an owl?
@aiborisov
@mykyta_p
Microservices?
How to draw an owl?
How to build microservices?
@aiborisov
@mykyta_p
Microservices?
How to draw an owl?
How to build microservices?
Draw some circles.
@aiborisov
@mykyta_p
Microservices?
How to draw an owl?
How to build microservices?
Draw some circles.
Take XYZ framework.
@aiborisov
@mykyta_p
Microservices?
How to draw an owl?
How to build microservices?
Draw the REST of the owlDraw some circles.
Take XYZ framework.
@aiborisov
@mykyta_p
Microservices?
How to draw an owl?
How to build microservices?
Draw the REST of the owl
Write your microservices!
Draw some circles.
Take XYZ framework.
@aiborisov
@mykyta_p
Microservices
@aiborisov
@mykyta_p
Microservices
@aiborisov
@mykyta_p
Microservices
@aiborisov
@mykyta_p
Microservices
@aiborisov
@mykyta_p
Remote Calls
@aiborisov
@mykyta_p
Call Flow
@aiborisov
@mykyta_p
Service Discovery?
?
?
?
?
?
?
@aiborisov
@mykyta_p
Multiple Instances
#1
#N
#2
. . .
@aiborisov
@mykyta_p
Multiple Instances
#1
#N
#2
?
?
?
. . .
@aiborisov
@mykyta_p
Call Flow
@aiborisov
@mykyta_p
Call Flow
@aiborisov
@mykyta_p
Call Flow
@aiborisov
@mykyta_p
Call Flow
@aiborisov
@mykyta_p
Call Flow
@aiborisov
@mykyta_p
Slow Services?
@aiborisov
@mykyta_p
Failure Scenarios
@aiborisov
@mykyta_p
A distributed system is one in which the failure of a
computer you didn't even know existed can render your own
computer unusable.
Leslie Lamport, 1987
https://www.microsoft.com/en-us/research/wp-content/uploads/2016/12/Distribution.pdf
@aiborisov
@mykyta_p
Fault Tolerance
@aiborisov
@mykyta_p
Microservices?! But...
Performance Hit?
Service Discovery?
Load Balancing?
Fault Tolerance?
Monitoring?
Testing?
@aiborisov
@mykyta_p
Microservices?! But...
Performance Hit?
Service Discovery?
Load Balancing?
Fault Tolerance?
Monitoring?
Testing?
@aiborisov
@mykyta_p
Sample Problem
Client
@aiborisov
@mykyta_p
Sample Problem: Aggregator
Src
#2
Src
#1
Aggr
...
Src
#X
Client
@aiborisov
@mykyta_p
Heterogeneous Data Format
Src
#2
Src
#1
Aggr
...
Src
#X
<XML>...<XML>
{JSON}
Binary 110011
[ Unified Format ]
Client
@aiborisov
@mykyta_p
REST: It’s All About Resources
@aiborisov
@mykyta_p
REST: Call Hierarchy
Controller
Service
Data Source A
. . .
Data Source N
RestTemplate
RestTemplate
RestTemplate
@aiborisov
@mykyta_p
REST: Data Source
JSON
URL: http://zrada.com/content/11
{
"id": 11,
"content": "EJB 2.1",
"next_uri": "/content/12"
}
XML
URL: http://peremoga.com/content/22
<ContentResponse>
<id>22</id>
<content>JavaDay is live!</content>
</ContentResponse>
@aiborisov
@mykyta_p
REST: Data Source
...
ResponseEntity<Content> contentEntity = restTemplate.getForEntity(
url + "{content_id}"
Content.class,
ImmutableMap.of("content_id", contentId));
...
@aiborisov
@mykyta_p
REST: Service
public class AggregatingService {
public AggregatedContent fetch(int id) {
...
return new AggregatedContent(...);
}
}
public class AggregatedContent {
private final Integer id; // 115
private final String type; // ZRADA
private final String content; // Политики украли у детей...
private final Integer nextId; // 116
@aiborisov
@mykyta_p
REST: Service
public class AggregatingService {
public AggregatedContent fetch(int id) {
...
return new AggregatedContent(...);
}
}
public class AggregatedContent {
private Integer id;
private String type;
private String content;
private Integer nextId;
@aiborisov
@mykyta_p
REST: Service
public class AggregatingService {
public AggregatedContent fetch(int id) {
...
return new AggregatedContent(...);
}
}
public class AggregatedContent {
private Integer id; // 115
private String type; // ZRADA
private String content; // EJB 2.1
private Integer nextId; // 116
@aiborisov
@mykyta_p
REST: Service
public class AggregatingService {
public AggregatedContent fetch(int id) {
...
return new AggregatedContent(...);
}
}
public class AggregatedContent {
private Integer id; // 115
private String type; // ZRADA
private String content; // EJB 2.1
private Integer nextId; // 116
@aiborisov
@mykyta_p
REST: Controller
@GetMapping(
value = "/content/{id}",
produces = "application/json")
public AggregatedContent aggregated(@PathVariable("id") int id) {
return aggregatingService.fetch(id);
}
@aiborisov
@mykyta_p
REST: It’s All About Resources
@GetMapping(
value = "/content/{id}",
produces = "application/json")
public AggregatedContent aggregated(@PathVariable("id") int id) {
return aggregatingService.fetch(id);
}
@aiborisov
@mykyta_p
REST: It’s simple
http://localhost:8080/content/115
{
"id": 115,
"content_type": "PEREMOGA",
"content": "JavaDay 2017 is live",
"next_uri": "/content/116"
}
@aiborisov
@mykyta_p
REST: Service Discovery
@aiborisov
@mykyta_p
k8s/zrada.yaml
...
kind: Service
metadata:
name: rest-zrada-content-service
k8s/aggregator.yaml
...
env:
- name: datasource_a_url
value: "http://rest-zrada-content-service:8080"
REST: Service Discovery
@aiborisov
@mykyta_p
k8s/zrada.yaml
...
kind: Service
metadata:
name: rest-zrada-content-service
k8s/aggregator.yaml
...
env:
- name: datasource_a_url
value: "http://rest-zrada-content-service:8080"
REST: Service Discovery
@aiborisov
@mykyta_p
Controllers and POJOs, oh my!
public class AggregatedContent {
@JsonProperty("id")
private Integer id;
@JsonProperty("type")
private String type;
@JsonProperty("content")
private String content;
@JsonProperty("next_uri")
private String nextUri;
...
}
{
"id": 115,
"content_type": "ZRADA",
"content": "EJB 2.1",
"next_uri": "/content/116"
}
@aiborisov
@mykyta_p
gRPC: It’s All About APIs
@aiborisov
@mykyta_p
Sample Problem: Aggregator
Src
#2
Src
#1
Aggr
...
Src
#X
Client
@aiborisov
@mykyta_p
Service Definition (aggregator.proto)
@aiborisov
@mykyta_p
Service Definition (aggregator.proto)
syntax = "proto3";
service AggregationService {
rpc Get(AggregationRequest)
returns (AggregationResponse);
}
@aiborisov
@mykyta_p
Service Definition (aggregator.proto)
syntax = "proto3";
service AggregationService {
rpc Get(AggregationRequest)
returns (AggregationResponse);
}
message AggregationRequest {
int32 item_id = 1;
}
message AggregationResponse {
int32 id = 1;
ResponseType type = 2;
string content = 3;
int32 next_item_id = 4;
}
enum ResponseType {
UNDEFINED = 0;
PEREMOGA = 1;
ZRADA = 2;
}
@aiborisov
@mykyta_p
Service Definition
aggregator.proto
@aiborisov
@mykyta_p
Service Definition
aggregator.proto
gRPC Runtime
@aiborisov
@mykyta_p
Service Definition
aggregator.proto
AggregationServiceImplBase.java AggregationRequest.java
AggregationResponse.java
AggregationServiceStub.java
AggregationServiceFutureStub.java
AggregationServiceBlockingStub.java
Service Implementation Request and response Client libraries
gRPC Java runtime
@aiborisov
@mykyta_p
Implement gRPC Service
public class AggregationService extends AggregationServiceImplBase {
@Override
public void get(AggregationRequest request,
StreamObserver<AggregationResponse> responseObserver) {
}
}
@aiborisov
@mykyta_p
Implement gRPC Service
public class AggregationService extends AggregationServiceImplBase {
@Override
public void get(AggregationRequest request,
StreamObserver<AggregationResponse> responseObserver) {
}
}
Implement gRPC Service
public class AggregationService extends AggregationServiceImplBase {
@Override
public void get(AggregationRequest request,
StreamObserver<AggregationResponse> responseObserver) {
}
}
@aiborisov
@mykyta_p
Thread #X
Thread ...
Thread #7
Thread #6
Thread #5
Thread #4
Blocking API (aka Thread-per-Request)?
Thread #3
Thread #2
Thread #1
Thread pool
of size X
@aiborisov
@mykyta_p
Thread #X
Thread ...
Thread #7
Thread #6
Thread #5
Thread #4
Blocking API (aka Thread-per-Request)?
Thread #3
Thread #2
Thread #1
Thread pool
of size X
1
@aiborisov
@mykyta_p
Thread #X
Thread ...
Thread #7
Thread #6
Thread #5
Thread #4
Blocking API (aka Thread-per-Request)?
Thread #3
Thread #2
Thread #1
Thread pool
of size X
1
2
@aiborisov
@mykyta_p
Thread #X
Thread ...
Thread #7
Thread #6
Thread #5
Thread #4
Blocking API (aka Thread-per-Request)?
Thread #3
Thread #2
Thread #1
Thread pool
of size X
1
2
3
@aiborisov
@mykyta_p
Thread #X
Thread ...
Thread #7
Thread #6
Thread #5
Thread #4
Thread #3
Thread #2
Blocking API (aka Thread-per-Request)?
Thread #1
Thread pool
of size X
1
2
3
X
. . .
@aiborisov
@mykyta_p
Thread #X
Thread ...
Thread #7
Thread #6
Thread #5
Thread #4
Thread #3
Thread #2
Blocking API (aka Thread-per-Request)?
Thread #1
Thread pool
of size X
1
2
3
X
. . .
X + 1
@aiborisov
@mykyta_p
Thread #X
Thread ...
Thread #7
Thread #6
Thread #5
Thread #4
Thread #3
Thread #2
Blocking API (aka Thread-per-Request)?
Thread #1
Thread pool
of size X
1
2
3
X
. . .
X + 1
@aiborisov
@mykyta_p
Implement gRPC Service
public class AggregationService extends AggregationServiceImplBase {
@Override
public void get(AggregationRequest request,
StreamObserver<AggregationResponse> responseObserver) {
}
}
@aiborisov
@mykyta_p
Implement gRPC Service
public class AggregationService extends AggregationServiceImplBase {
@Override
public void get(AggregationRequest request,
public interface StreamObserver<AggregationResponse> responseObserver){{
void onNext(AggregationResponse response);
void onCompleted();
void onError(Throwable error);
}
}
}
@aiborisov
@mykyta_p
Non-Blocking API
1
2
3
. . .
X + Y
X
. . .
@aiborisov
@mykyta_p
Non-Blocking API (aka Hollywood Principle)
1
2
3
. . .
X + Y
X
. . .
WillCallYouLater!
@aiborisov
@mykyta_p
Non-Blocking API (aka Hollywood Principle)
1
2
3
. . .
X + Y
X
. . .
WillCallYouLater!
onNext(1)
@aiborisov
@mykyta_p
Non-Blocking API (aka Hollywood Principle)
1
2
3
. . .
X + Y
X
. . .
WillCallYouLater!
onNext(3)
@aiborisov
@mykyta_p
Non-Blocking API (aka Hollywood Principle)
1
2
3
. . .
X + Y
X
. . .
WillCallYouLater!
onNext(X)
@aiborisov
@mykyta_p
Implement gRPC Service
public class AggregationService extends AggregationServiceImplBase {
@Override
public void get(AggregationRequest request,
StreamObserver<AggregationResponse> responseObserver) {
AggregationResponse response = AggregationResponse
.newBuilder()
.setId(request.getItemId())
.setContent("JavaDay 2017 is happening right now!")
.setType(ResponseType.PEREMOGA)
.build();
responseObserver.onNext(response);
responseObserver.onCompleted();
}
}
@aiborisov
@mykyta_p
Implement gRPC Service
public class AggregationService extends AggregationServiceImplBase {
@Override
public void get(AggregationRequest request,
StreamObserver<AggregationResponse> responseObserver) {
AggregationResponse response = AggregationResponse
.newBuilder()
.setId(request.getItemId())
.setContent("JavaDay 2017 is happening right now!")
.setType(ResponseType.PEREMOGA)
.build();
responseObserver.onNext(response);
responseObserver.onCompleted();
}
}
@aiborisov
@mykyta_p
Service Definition (aggregator.proto)
syntax = "proto3";
service AggregationService {
rpc Get(AggregationRequest)
returns (AggregationResponse);
}
message AggregationRequest {
int32 item_id = 1;
}
message AggregationResponse {
int32 id = 1;
ResponseType type = 2;
string content = 3;
int32 next_item_id = 4;
}
enum ResponseType {
UNDEFINED = 0;
PEREMOGA = 1;
ZRADA = 2;
}
@aiborisov
@mykyta_p
Service Definition (aggregator.proto)
syntax = "proto3";
service AggregationService {
rpc Get(AggregationRequest)
returns (AggregationResponse);
}
message AggregationRequest {
}
message AggregationResponse {
int32 id = 1;
ResponseType type = 2;
string content = 3;
}
enum ResponseType {
UNDEFINED = 0;
PEREMOGA = 1;
ZRADA = 2;
}
@aiborisov
@mykyta_p
Service Definition (aggregator.proto)
syntax = "proto3";
service AggregationService {
rpc Get(AggregationRequest)
returns (AggregationResponse);
}
message AggregationRequest {
}
message AggregationResponse {
int32 id = 1;
ResponseType type = 2;
string content = 3;
}
enum ResponseType {
UNDEFINED = 0;
PEREMOGA = 1;
ZRADA = 2;
}
@aiborisov
@mykyta_p
Service Definition (aggregator.proto)
syntax = "proto3";
service AggregationService {
rpc Get(AggregationRequest)
returns (stream AggregationResponse);
}
message AggregationRequest {
}
message AggregationResponse {
int32 id = 1;
ResponseType type = 2;
string content = 3;
}
enum ResponseType {
UNDEFINED = 0;
PEREMOGA = 1;
ZRADA = 2;
}
@aiborisov
@mykyta_p
Service Definition (aggregator.proto)
syntax = "proto3";
service AggregationService {
rpc Subscribe(AggregationRequest)
returns (stream AggregationResponse);
}
message AggregationRequest {
}
message AggregationResponse {
int32 id = 1;
ResponseType type = 2;
string content = 3;
}
enum ResponseType {
UNDEFINED = 0;
PEREMOGA = 1;
ZRADA = 2;
}
@aiborisov
@mykyta_p
Service Definition (aggregator.proto)
syntax = "proto3";
service AggregationService {
rpc Subscribe(AggregationRequest)
returns (stream AggregationResponse);
}
message AggregationRequest {
}
message AggregationResponse {
int32 id = 1;
ResponseType type = 2;
string content = 3;
}
enum ResponseType {
UNDEFINED = 0;
PEREMOGA = 1;
ZRADA = 2;
}
@aiborisov
@mykyta_p
Sample Problem: Aggregator
Src
#2
Src
#1
Aggr
...
Src
#X
Client
aggregator.proto
@aiborisov
@mykyta_p
Sample Problem: Content
Src
#2
Src
#1
Aggr
...
Src
#X
Client
aggregator.proto
content.proto
@aiborisov
@mykyta_p
content.proto
syntax = "proto3";
service ContentService {
rpc Subscribe(ContentRequest)
returns (stream ContentResponse);
}
message ContentRequest {
}
message ContentResponse {
int32 id = 1;
string content = 2;
}
@aiborisov
@mykyta_p
Streaming gRPC Service
public class AggregationService extends AggregationServiceImplBase {
private final Collection<ContentServiceStub> contentStubs;
public AggregationService(Collection<ContentServiceStub> contentStubs) {
this.contentStubs = contentStubs;
}
...
@aiborisov
@mykyta_p
Streaming gRPC Service
public class AggregationService extends AggregationServiceImplBase {
@Override
public void subscribe(AggregationRequest request,StreamObserver<AggregationResponse> responseObserver) {
contentStubs.forEach(stub -> { stub.subscribe(ContentRequest.getDefaultInstance(),
new StreamObserver<ContentResponse>() {
@Override
public void onNext(ContentResponse response) {
...
}
@Override
public void onError(Throwable error) {
responseObserver.onError(error);
}
@Override
public void onCompleted() {}
});
});
}
@aiborisov
@mykyta_p
Streaming gRPC Service
public class AggregationService extends AggregationServiceImplBase {
@Override
public void subscribe(AggregationRequest request,StreamObserver<AggregationResponse> responseObserver) {
contentStubs.forEach(stub -> { stub.subscribe(ContentRequest.getDefaultInstance(),
new StreamObserver<ContentResponse>() {
@Override
public void onNext(ContentResponse response) {
...
}
@Override
public void onError(Throwable error) {
responseObserver.onError(error);
}
@Override
public void onCompleted() {}
});
});
}
@aiborisov
@mykyta_p
Streaming gRPC Service
public class AggregationService extends AggregationServiceImplBase {
@Override
public void subscribe(AggregationRequest request,StreamObserver<AggregationResponse> responseObserver) {
contentStubs.forEach(stub -> { stub.subscribe(ContentRequest.getDefaultInstance(),
new StreamObserver<ContentResponse>() {
@Override
public void onNext(ContentResponse response) {
...
}
@Override
public void onError(Throwable error) {
responseObserver.onError(error);
}
@Override
public void onCompleted() {}
});
});
}
@aiborisov
@mykyta_p
Streaming gRPC Service
public class AggregationService extends AggregationServiceImplBase {
@Override
public void subscribe(AggregationRequest request,StreamObserver<AggregationResponse> responseObserver) {
contentStubs.forEach(stub -> { stub.subscribe(ContentRequest.getDefaultInstance(),
new StreamObserver<ContentResponse>() {
@Override
public void onNext(ContentResponse response) {
...
}
@Override
public void onError(Throwable error) {
responseObserver.onError(error);
}
@Override
public void onCompleted() {}
});
});
}
@aiborisov
@mykyta_p
Streaming gRPC Service
public class AggregationService extends AggregationServiceImplBase {
@Override
public void subscribe(AggregationRequest request,StreamObserver<AggregationResponse> responseObserver) {
contentStubs.forEach(stub -> { stub.subscribe(ContentRequest.getDefaultInstance(),
new StreamObserver<ContentResponse>() {
@Override
public void onNext(ContentResponse response) {
ResponseType type = typeForStub(stub);
int aggregationId = aggregationId(response.getId(), type);
AggregationResponse aggrResponse =
AggregationResponse.newBuilder()
.setContent(response.getContent()).setId(aggregationId).
.setType(type).build();
responseObserver.onNext(aggrResponse);
}
});
});
}
@aiborisov
@mykyta_p
Streaming gRPC Service
public class AggregationService extends AggregationServiceImplBase {
@Override
public void subscribe(AggregationRequest request,StreamObserver<AggregationResponse> responseObserver) {
contentStubs.forEach(stub -> { stub.subscribe(ContentRequest.getDefaultInstance(),
new StreamObserver<ContentResponse>() {
@Override
public void onNext(ContentResponse response) {
ResponseType type = typeForStub(stub);
int aggregationId = aggregationId(response.getId(), type);
AggregationResponse aggrResponse =
AggregationResponse.newBuilder()
.setContent(response.getContent()).setId(aggregationId).
.setType(type).build();
responseObserver.onNext(aggrResponse);
}
});
});
}
@aiborisov
@mykyta_p
Streaming gRPC Service
Src
#2
Src
#1
Aggr
...
Src
#X
Client
@aiborisov
@mykyta_p
Streaming gRPC Service
Src
#2
Src
#1
Aggr
...
Src
#X
Client Subscribe()
@aiborisov
@mykyta_p
Streaming gRPC Service
Src
#2
Src
#1
Aggr
...
Src
#X
Client Subscribe()
Subscribe()
Subscribe()
Subscribe()
@aiborisov
@mykyta_p
Streaming gRPC Service
Src
#2
Src
#1
Aggr
...
Src
#X
Client
onNext()
@aiborisov
@mykyta_p
Streaming gRPC Service
Src
#2
Src
#1
Aggr
...
Src
#X
Client
onNext()
onNext()
@aiborisov
@mykyta_p
Streaming gRPC Service
Src
#2
Src
#1
Aggr
...
Src
#X
Client
onNext()
@aiborisov
@mykyta_p
Streaming gRPC Service
Src
#2
Src
#1
Aggr
...
Src
#X
Client onNext()
onNext()
@aiborisov
@mykyta_p
Start gRPC Server
ContentServiceStub peremogaClient = ...
ContentServiceStub zradaClient = ...
Server grpcServer = NettyServerBuilder.forPort(8080)
.addService(new AggregationService(asList(peremogaClient, zradaClient)))
.build().start();
@aiborisov
@mykyta_p
Start gRPC Server
ContentServiceStub peremogaClient = ...
ContentServiceStub zradaClient = ...
Server grpcServer = NettyServerBuilder.forPort(8080)
.addService(new AggregationService(asList(peremogaClient, zradaClient)))
.build().start();
@aiborisov
@mykyta_p
Create gRPC Client
String host = System.getenv("peremoga_host");
int post = Integer.valueOf(System.getenv("peremoga_port"));
ManagedChannel peremogaChannel = NettyChannelBuilder.forAddress(host, port).build();
@aiborisov
@mykyta_p
Create gRPC Client
String host = System.getenv("peremoga_host");
int post = Integer.valueOf(System.getenv("peremoga_port"));
ManagedChannel peremogaChannel = NettyChannelBuilder.forAddress(host, port).build();
ContentServiceStub peremogaClient = ContentServiceGrpc.newStub(peremogaChannel);
@aiborisov
@mykyta_p
Create gRPC Client
String host = System.getenv("peremoga_host");
int port = Integer.valueOf(System.getenv("peremoga_port"));
ManagedChannel peremogaChannel = NettyChannelBuilder.forAddress(host, port).build();
ContentServiceStub peremogaClient = ContentServiceGrpc.newStub(peremogaChannel);
ContentServiceBlockingStub peremogaBlockingClient =
ContentServiceGrpc.newBlockingStub(peremogaChannel);
ContentServiceFutureStub peremogaFutureClient =
ContentServiceGrpc.newFutureStub(peremogaChannel);
@aiborisov
@mykyta_p
Service Discovery & Load Balancing
String host = System.getenv("peremoga_host");
int post = Integer.valueOf(System.getenv("peremoga_port"));
ManagedChannel peremogaChannel = NettyChannelBuilder.forAddress(host, port).build();
@aiborisov
@mykyta_p
Service Discovery & Load Balancing
ManagedChannel peremogaChannel = NettyChannelBuilder.forAddress(host, port).build();
@aiborisov
@mykyta_p
Service Discovery & Load Balancing
ManagedChannel peremogaChannel = NettyChannelBuilder.forTarget("peremoga")
.build();
@aiborisov
@mykyta_p
Service Discovery & Load Balancing
ManagedChannel peremogaChannel = NettyChannelBuilder.forTarget("peremoga")
.nameResolverFactory(new DnsNameResolverProvider())
.loadBalancerFactory(RoundRobinLoadBalancerFactory.getInstance())
.build();
@aiborisov
@mykyta_p
Service Discovery & Load Balancing
ManagedChannel peremogaChannel = NettyChannelBuilder.forTarget("peremoga")
.nameResolverFactory(new MyCustomNameResolverProviderFactory())
.loadBalancerFactory(new MyMoonPhaseLoadBalancerFactory())
.build();
@aiborisov
@mykyta_p
Netty
ManagedChannel peremogaChannel = NettyChannelBuilder.forTarget("peremoga")
.nameResolverFactory(new MyCustomNameResolverProvider())
.loadBalancerFactory(new MyMoonPhaseLoadBalancerFactory())
.build();
@aiborisov
@mykyta_p
Netty + HTTP/2 + Protobuf
@aiborisov
@mykyta_p
Netty + HTTP/2 + Protobuf = Performance
http://www.grpc.io/docs/guides/benchmarking.html
@aiborisov
@mykyta_p
8 core VMs, streaming throughput
Netty + HTTP/2 + Protobuf = Performance
http://www.grpc.io/docs/guides/benchmarking.html
@aiborisov
@mykyta_p
32 core VMs, streaming throughput
Client Latency
...
900 ms!
@aiborisov
@mykyta_p
Caching
CDN
9 ms
...
@aiborisov
@mykyta_p
pay 24/7
Classic Cloud
VM
VM
LB
...
VM
pay as you go
@aiborisov
@mykyta_p
Serverless
pay as you go
Func
Funcinput
...
Func
input
...
input
@aiborisov
@mykyta_p
All about resources
IDL optional
Synchronous by default
Unary
Perfect fit for serverless
All about APIs
IDL centric
Asynchronous by nature
Streaming or Unary
Performance first
REST gRPC
@aiborisov
@mykyta_p
Sample Problem
Src
#2
Src
#1
...
Src
#X
Client Aggr
@aiborisov
@mykyta_p
Sample Problem: Voting
Src
#2
Src
#1
...
Src
#X
Client
Voting
Aggr
@aiborisov
@mykyta_p
Sample Problem: Voting
Src
#2
Src
#1
...
Src
#X
Client
Voting
Aggr
@aiborisov
@mykyta_p
Sample Problem: Voting
Src
#2
Src
#1
...
Src
#X
Client
Voting
Aggr
@aiborisov
@mykyta_p
Sample Problem: Voting & Leaderboard
Src
#2
Src
#1
...
Src
#X
Client
Voting
Aggr
L-board
@aiborisov
@mykyta_p
Sample Problem: Voting & Leaderboard
Src
#2
Src
#1
...
Src
#X
Client
Voting
Aggr
L-board
@aiborisov
@mykyta_p
Sample Problem: Voting & Leaderboard
Src
#2
Src
#1
...
Src
#X
Gateway
Voting
Aggr
L-board
@aiborisov
@mykyta_p
Sample Problem
Src
#2
Src
#1
...
Src
#X
Gateway
VotingL-board
Aggr
@aiborisov
@mykyta_p
Failing Leaderboard
Src
#2
Src
#1
...
Src
#X
Gateway
Voting
Aggr
@aiborisov
@mykyta_p
Cascading Failure
Src
#2
Src
#1
...
Src
#X
Gateway
Voting
Aggr
@aiborisov
@mykyta_p
Cascading Failure
Src
#2
Src
#1
...
Src
#X
Gateway
Voting
Aggr
@aiborisov
@mykyta_p
Cascading Failure
Src
#2
Src
#1
...
Src
#X
Gateway
Voting
Aggr
@aiborisov
@mykyta_p
Circuit Breaker
Src
#2
Src
#1
...
Src
#X
Gateway
VotingL-board
Aggr
@aiborisov
@mykyta_p
Circuit Breaker
Src
#2
Src
#1
...
Src
#X
Gateway
VotingL-board
Aggr
@aiborisov
@mykyta_p
Circuit Breaker
Src
#2
Src
#1
...
Src
#X
Gateway
VotingL-board
Aggr
@aiborisov
@mykyta_p
Circuit Breaker
Src
#2
Src
#1
...
Src
#X
Gateway
VotingL-board
Aggr
@aiborisov
@mykyta_p
Circuit Breaker
Src
#2
Src
#1
...
Src
#X
Gateway
VotingL-board
Aggr
@aiborisov
@mykyta_p
Circuit Breaker
Src
#2
Src
#1
...
Src
#X
Gateway
VotingL-board
Aggr
@aiborisov
@mykyta_p
Slow Services
Src
#2
Src
#1
...
Src
#X
Gateway
VotingL-board
Aggr
@aiborisov
@mykyta_p
Timeouts?
Src
#2
Src
#1
...
Src
#X
Gateway
VotingL-board
Aggr
200 ms
2 sec
@aiborisov
@mykyta_p
Large Timeouts
Gateway Voting L-Board
1,000 ms
timeout
1,000 ms
timeout
200 ms
client timeout
@aiborisov
@mykyta_p
Large Timeouts
Gateway Voting L-Board
1,000 ms
timeout
1,000 ms
timeout
200 ms
client timeout
50 ms
@aiborisov
@mykyta_p
Large Timeouts
Gateway Voting L-Board
1,000 ms
timeout
1,000 ms
timeout
200 ms
client timeout
50 ms
400 ms
@aiborisov
@mykyta_p
Large Timeouts
Gateway Voting L-Board
1,000 ms
timeout
1,000 ms
timeout
200 ms
client timeout
50 ms
400 ms
@aiborisov
@mykyta_p
Large Timeouts
Gateway Voting L-Board
1,000 ms
timeout
1,000 ms
timeout
200 ms
client timeout
50 ms
400 ms
300 ms
@aiborisov
@mykyta_p
Short Timeouts
Gateway Voting L-Board
100 ms
timeout
100 ms
timeout
@aiborisov
@mykyta_p
Short Timeouts
Gateway Voting L-Board
100 ms
timeout
100 ms
timeout
2,000 ms
client timeout
@aiborisov
@mykyta_p
Short Timeouts
Gateway Voting L-Board
100 ms
timeout
100 ms
timeout
2,000 ms
client timeout
50 ms
@aiborisov
@mykyta_p
Short Timeouts
Gateway Voting L-Board
100 ms
timeout
100 ms
timeout
2,000 ms
client timeout
50 ms
400 ms
@aiborisov
@mykyta_p
Short Timeouts
Gateway Voting L-Board
100 ms
timeout
100 ms
timeout
2,000 ms
client timeout
50 ms
400 ms
@aiborisov
@mykyta_p
Short Timeouts
Gateway Voting L-Board
100 ms
timeout
100 ms
timeout
2,000 ms
client timeout
50 ms
400 ms
@aiborisov
@mykyta_p
gRPC Deadline Propagation
Gateway Voting L-Board
200 ms
client timeout
@aiborisov
@mykyta_p
gRPC Deadline Propagation
Gateway Voting L-Board
200 ms
client timeout
50 ms
@aiborisov
@mykyta_p
gRPC Deadline Propagation
Gateway Voting L-Board
200 - 50 ms
timeout
200 ms
client timeout
50 ms
@aiborisov
@mykyta_p
gRPC Deadline Propagation
Gateway Voting L-Board
200 - 50 ms
timeout
200 ms
client timeout
50 ms
400 ms
@aiborisov
@mykyta_p
gRPC Deadline Propagation
Gateway Voting L-Board
200 - 50 - 400 ms
timeout
200 - 50 ms
timeout
200 ms
client timeout
50 ms
400 ms
@aiborisov
@mykyta_p
gRPC Deadline Propagation (Short)
Gateway Voting L-Board
200 - 50 - 400 ms
timeout
200 - 50 ms
timeout
200 ms
client timeout
50 ms
400 ms
@aiborisov
@mykyta_p
gRPC Deadline Propagation (Large)
Gateway Voting L-Board
2,000 - 50 - 400 ms
timeout
2,000 - 50 ms
timeout
2,000 ms
client timeout
50 ms
400 ms
300 ms
@aiborisov
@mykyta_p
Investigation
Src
#2
Src
#1
...
Src
#X
Gateway
VotingL-board
Aggr
@aiborisov
@mykyta_p
Gateway
VotingL-board
Aggr
Investigation
Src
#2
Src
#1
...
Src
#X
@aiborisov
@mykyta_p
VotingL-board
Aggr
Investigation
Src
#2
Src
#1
...
Src
#X
Gateway
@aiborisov
@mykyta_p
L-board
Aggr
Investigation
Src
#2
Src
#1
...
Src
#X
Gateway
Voting
@aiborisov
@mykyta_p
L-board
Aggr
Investigation
Src
#2
Src
#1
...
Src
#X
Gateway
Voting
@aiborisov
@mykyta_p
Aggr
L-board
Investigation
Src
#2
Src
#1
...
Src
#X
Gateway
Voting
@aiborisov
@mykyta_p
Aggr
L-board
Investigation
Src
#2
Src
#1
...
Src
#X
Gateway
Voting
@aiborisov
@mykyta_p
Zipkin: Traces and Latency
@aiborisov
@mykyta_p
Zipkin and gRPC
https://github.com/openzipkin/brave/tree/master/instrumentation/grpc
URLConnectionSender sender = ...
GrpcTracing grpcTracing = GrpcTracing.create(Tracing.newBuilder()
.sampler(ALWAYS_SAMPLE).spanReporter(AsyncReporter.create(sender)).build());
@aiborisov
@mykyta_p
Zipkin and gRPC
https://github.com/openzipkin/brave/tree/master/instrumentation/grpc
URLConnectionSender sender = ...
GrpcTracing grpcTracing = GrpcTracing.create(Tracing.newBuilder()
.sampler(ALWAYS_SAMPLE).spanReporter(AsyncReporter.create(sender)).build());
ManagedChannel peremogaChannel = NettyChannelBuilder.forAddress(peremogaHost, peremogaPort)
.intercept(grpcTracing.newClientInterceptor())
.build();
Server grpcServer = NettyServerBuilder.forPort(8080)
.addService(new AggregationService(asList(peremogaClient, zradaClient)))
.intercept(grpcTracing.newServerInterceptor())
.build().start();
@aiborisov
@mykyta_p
Zipkin and gRPC
https://github.com/openzipkin/brave/tree/master/instrumentation/grpc
URLConnectionSender sender = ...
GrpcTracing grpcTracing = GrpcTracing.create(Tracing.newBuilder()
.sampler(ALWAYS_SAMPLE).spanReporter(AsyncReporter.create(sender)).build());
ManagedChannel peremogaChannel = NettyChannelBuilder.forAddress(peremogaHost, peremogaPort)
.intercept(grpcTracing.newClientInterceptor())
.build();
Server grpcServer = NettyServerBuilder.forPort(8080)
.addService(new AggregationService(asList(peremogaClient, zradaClient)))
.intercept(grpcTracing.newServerInterceptor())
.build().start();
@aiborisov
@mykyta_p
Zipkin and REST
build.gradle:
dependencies {
compile 'org.springframework.cloud:spring-cloud-sleuth-zipkin'
compile 'org.springframework.cloud:spring-cloud-starter-sleuth'
...
application.properties:
spring.zipkin.baseUrl=http://zipkin:9411/
# sample 100%
spring.sleuth.sampler.percentage=1.0
...
@aiborisov
@mykyta_p
Zipkin : REST and gRPC
@aiborisov
@mykyta_p
http://GrpcVsRest.com
#zrada
or
#peremoga
@aiborisov
@mykyta_p
Explore More?
Demo: https://github.com/grpcvsrest
@aiborisov
@mykyta_p
Explore More?
Demo: https://github.com/grpcvsrest
http://grpc.io
https://github.com/grpc
http://www.grpc.io/docs/quickstart/java.html
gRPC Google group: grpc-io@googlegroups.com
REST: http://google.com/search?q=rest
gRPC
or
REST?
@aiborisov
@mykyta_p
Demo UI is written by
Yevgen Golubenko
Software Engineer @ Anomali
• Twitter: @HalloGene_
• github.com/HalloGene
• linkedin.com/in/yevgen-golubenko
@aiborisov
@mykyta_p
REST gRPC
@aiborisov
@mykyta_p
All about resources
Synchronous and unary
Simplicity first
External fault-tolerance
Production ready
All about APIs
Async and streaming
Performance first
Built-in fault-tolerance
Production ready
REST gRPC
@aiborisov
@mykyta_p
All about resources
Synchronous and unary
Simplicity first
External fault-tolerance
Production ready
All about APIs
Async and streaming
Performance first
Built-in fault-tolerance
Production ready
REST gRPC
Be pragmatic,
start with your problem!
@aiborisov
@mykyta_p
Questions?
@aiborisov
@mykyta_p

Mais conteúdo relacionado

Mais procurados

"gRPC-Web: It’s All About Communication": Devoxx Ukraine 2019
"gRPC-Web: It’s All About Communication": Devoxx Ukraine 2019"gRPC-Web: It’s All About Communication": Devoxx Ukraine 2019
"gRPC-Web: It’s All About Communication": Devoxx Ukraine 2019Alex Borysov
 
"gRPC-Web: It’s All About Communication": Devoxx Ukraine 2019
"gRPC-Web:  It’s All About Communication": Devoxx Ukraine 2019"gRPC-Web:  It’s All About Communication": Devoxx Ukraine 2019
"gRPC-Web: It’s All About Communication": Devoxx Ukraine 2019Alex Borysov
 
DevNexus 2020 "Break me if you can: practical guide to building fault-toleran...
DevNexus 2020 "Break me if you can: practical guide to building fault-toleran...DevNexus 2020 "Break me if you can: practical guide to building fault-toleran...
DevNexus 2020 "Break me if you can: practical guide to building fault-toleran...Alex Borysov
 
Break me if you can: practical guide to building fault-tolerant systems (with...
Break me if you can: practical guide to building fault-tolerant systems (with...Break me if you can: practical guide to building fault-tolerant systems (with...
Break me if you can: practical guide to building fault-tolerant systems (with...Alex Borysov
 
"Enabling Googley microservices with gRPC" Riga DevDays 2018 edition
"Enabling Googley microservices with gRPC" Riga DevDays 2018 edition"Enabling Googley microservices with gRPC" Riga DevDays 2018 edition
"Enabling Googley microservices with gRPC" Riga DevDays 2018 editionAlex Borysov
 
Cloud Expo Europe 2022 "Break me if you can: practical guide to building faul...
Cloud Expo Europe 2022 "Break me if you can: practical guide to building faul...Cloud Expo Europe 2022 "Break me if you can: practical guide to building faul...
Cloud Expo Europe 2022 "Break me if you can: practical guide to building faul...Alex Borysov
 
REST API vs gRPC, which one should you use in breaking a monolith [Dev conf 2...
REST API vs gRPC, which one should you use in breaking a monolith [Dev conf 2...REST API vs gRPC, which one should you use in breaking a monolith [Dev conf 2...
REST API vs gRPC, which one should you use in breaking a monolith [Dev conf 2...Vladimir Dejanovic
 
common mistakes when using libcurl
common mistakes when using libcurlcommon mistakes when using libcurl
common mistakes when using libcurlDaniel Stenberg
 
HTTP/3 is next generation HTTP
HTTP/3 is next generation HTTPHTTP/3 is next generation HTTP
HTTP/3 is next generation HTTPDaniel Stenberg
 
REST API vs gRPC, which one should you use in breaking a monolith [Kdg.net 2018]
REST API vs gRPC, which one should you use in breaking a monolith [Kdg.net 2018]REST API vs gRPC, which one should you use in breaking a monolith [Kdg.net 2018]
REST API vs gRPC, which one should you use in breaking a monolith [Kdg.net 2018]Vladimir Dejanovic
 
A Modest Introduction to Swift
A Modest Introduction to SwiftA Modest Introduction to Swift
A Modest Introduction to SwiftJohn Anderson
 
Docker Docker - Docker Security - Docker
Docker Docker - Docker Security - DockerDocker Docker - Docker Security - Docker
Docker Docker - Docker Security - DockerBoyd Hemphill
 
Http3 fullstackfest-2019
Http3 fullstackfest-2019Http3 fullstackfest-2019
Http3 fullstackfest-2019Daniel Stenberg
 
WordPress RESTful API & Amazon API Gateway - WordCamp Kansai 2016
WordPress RESTful API & Amazon API Gateway - WordCamp Kansai 2016WordPress RESTful API & Amazon API Gateway - WordCamp Kansai 2016
WordPress RESTful API & Amazon API Gateway - WordCamp Kansai 2016崇之 清水
 

Mais procurados (20)

"gRPC-Web: It’s All About Communication": Devoxx Ukraine 2019
"gRPC-Web: It’s All About Communication": Devoxx Ukraine 2019"gRPC-Web: It’s All About Communication": Devoxx Ukraine 2019
"gRPC-Web: It’s All About Communication": Devoxx Ukraine 2019
 
"gRPC-Web: It’s All About Communication": Devoxx Ukraine 2019
"gRPC-Web:  It’s All About Communication": Devoxx Ukraine 2019"gRPC-Web:  It’s All About Communication": Devoxx Ukraine 2019
"gRPC-Web: It’s All About Communication": Devoxx Ukraine 2019
 
DevNexus 2020 "Break me if you can: practical guide to building fault-toleran...
DevNexus 2020 "Break me if you can: practical guide to building fault-toleran...DevNexus 2020 "Break me if you can: practical guide to building fault-toleran...
DevNexus 2020 "Break me if you can: practical guide to building fault-toleran...
 
Break me if you can: practical guide to building fault-tolerant systems (with...
Break me if you can: practical guide to building fault-tolerant systems (with...Break me if you can: practical guide to building fault-tolerant systems (with...
Break me if you can: practical guide to building fault-tolerant systems (with...
 
"Enabling Googley microservices with gRPC" Riga DevDays 2018 edition
"Enabling Googley microservices with gRPC" Riga DevDays 2018 edition"Enabling Googley microservices with gRPC" Riga DevDays 2018 edition
"Enabling Googley microservices with gRPC" Riga DevDays 2018 edition
 
Cloud Expo Europe 2022 "Break me if you can: practical guide to building faul...
Cloud Expo Europe 2022 "Break me if you can: practical guide to building faul...Cloud Expo Europe 2022 "Break me if you can: practical guide to building faul...
Cloud Expo Europe 2022 "Break me if you can: practical guide to building faul...
 
REST API vs gRPC, which one should you use in breaking a monolith [Dev conf 2...
REST API vs gRPC, which one should you use in breaking a monolith [Dev conf 2...REST API vs gRPC, which one should you use in breaking a monolith [Dev conf 2...
REST API vs gRPC, which one should you use in breaking a monolith [Dev conf 2...
 
Curl with rust
Curl with rustCurl with rust
Curl with rust
 
common mistakes when using libcurl
common mistakes when using libcurlcommon mistakes when using libcurl
common mistakes when using libcurl
 
HTTP/3 is next generation HTTP
HTTP/3 is next generation HTTPHTTP/3 is next generation HTTP
HTTP/3 is next generation HTTP
 
JavaLand gRPC vs REST API
JavaLand gRPC vs REST APIJavaLand gRPC vs REST API
JavaLand gRPC vs REST API
 
REST API vs gRPC, which one should you use in breaking a monolith [Kdg.net 2018]
REST API vs gRPC, which one should you use in breaking a monolith [Kdg.net 2018]REST API vs gRPC, which one should you use in breaking a monolith [Kdg.net 2018]
REST API vs gRPC, which one should you use in breaking a monolith [Kdg.net 2018]
 
A Modest Introduction to Swift
A Modest Introduction to SwiftA Modest Introduction to Swift
A Modest Introduction to Swift
 
curl better
curl bettercurl better
curl better
 
HTTP/3 in curl
HTTP/3 in curlHTTP/3 in curl
HTTP/3 in curl
 
Docker Docker - Docker Security - Docker
Docker Docker - Docker Security - DockerDocker Docker - Docker Security - Docker
Docker Docker - Docker Security - Docker
 
HTTP/3 for everyone
HTTP/3 for everyoneHTTP/3 for everyone
HTTP/3 for everyone
 
Http3 fullstackfest-2019
Http3 fullstackfest-2019Http3 fullstackfest-2019
Http3 fullstackfest-2019
 
WordPress RESTful API & Amazon API Gateway - WordCamp Kansai 2016
WordPress RESTful API & Amazon API Gateway - WordCamp Kansai 2016WordPress RESTful API & Amazon API Gateway - WordCamp Kansai 2016
WordPress RESTful API & Amazon API Gateway - WordCamp Kansai 2016
 
HTTP/3 in curl 2020
HTTP/3 in curl 2020HTTP/3 in curl 2020
HTTP/3 in curl 2020
 

Semelhante a gRPC vs REST: let the battle begin!

Ibm_interconnect_restapi_workshop
Ibm_interconnect_restapi_workshopIbm_interconnect_restapi_workshop
Ibm_interconnect_restapi_workshopShubhra Kar
 
HowYourAPIBeMyAPI
HowYourAPIBeMyAPIHowYourAPIBeMyAPI
HowYourAPIBeMyAPIJie Liau
 
The liferay case: lessons learned evolving from RPC to Hypermedia REST APIs
The liferay case: lessons learned evolving from RPC to Hypermedia REST APIsThe liferay case: lessons learned evolving from RPC to Hypermedia REST APIs
The liferay case: lessons learned evolving from RPC to Hypermedia REST APIsJorge Ferrer
 
Guillotina: The Asyncio REST Resource API
Guillotina: The Asyncio REST Resource APIGuillotina: The Asyncio REST Resource API
Guillotina: The Asyncio REST Resource APINathan Van Gheem
 
DevSecCon Singapore 2018 - in graph we trust By Imran Mohammed
DevSecCon Singapore 2018 - in graph we trust By Imran MohammedDevSecCon Singapore 2018 - in graph we trust By Imran Mohammed
DevSecCon Singapore 2018 - in graph we trust By Imran MohammedDevSecCon
 
In graph we trust: Microservices, GraphQL and security challenges
In graph we trust: Microservices, GraphQL and security challengesIn graph we trust: Microservices, GraphQL and security challenges
In graph we trust: Microservices, GraphQL and security challengesMohammed A. Imran
 
Designing a beautiful REST json api
Designing a beautiful REST json apiDesigning a beautiful REST json api
Designing a beautiful REST json api0x07de
 
OWASPAPISecurity
OWASPAPISecurityOWASPAPISecurity
OWASPAPISecurityJie Liau
 
Building Serverless applications with Python
Building Serverless applications with PythonBuilding Serverless applications with Python
Building Serverless applications with PythonAndrii Soldatenko
 
Motion Django Meetup
Motion Django MeetupMotion Django Meetup
Motion Django MeetupMike Malone
 
Learning the basics of Apache NiFi for iot OSS Europe 2020
Learning the basics of Apache NiFi for iot OSS Europe 2020Learning the basics of Apache NiFi for iot OSS Europe 2020
Learning the basics of Apache NiFi for iot OSS Europe 2020Timothy Spann
 
How to Create the API Document from Real API and Localization
How to Create the API Document from Real API and Localization How to Create the API Document from Real API and Localization
How to Create the API Document from Real API and Localization Pronovix
 
Building APIs in an easy way using API Platform
Building APIs in an easy way using API PlatformBuilding APIs in an easy way using API Platform
Building APIs in an easy way using API PlatformAntonio Peric-Mazar
 
Lies you have been told about REST
Lies you have been told about RESTLies you have been told about REST
Lies you have been told about RESTdarrelmiller71
 
Architecting Multitenant SaaS Applications with Azure - Microsoft Ignite The ...
Architecting Multitenant SaaS Applications with Azure - Microsoft Ignite The ...Architecting Multitenant SaaS Applications with Azure - Microsoft Ignite The ...
Architecting Multitenant SaaS Applications with Azure - Microsoft Ignite The ...Eran Stiller
 
Testing API platform with Behat BDD tests
Testing API platform with Behat BDD testsTesting API platform with Behat BDD tests
Testing API platform with Behat BDD testsStefan Adolf
 
Free The Enterprise With Ruby & Master Your Own Domain
Free The Enterprise With Ruby & Master Your Own DomainFree The Enterprise With Ruby & Master Your Own Domain
Free The Enterprise With Ruby & Master Your Own DomainKen Collins
 
Web of things introduction
Web of things introductionWeb of things introduction
Web of things introduction承翰 蔡
 
really really really awesome php application with bdd behat and iterfaces
really really really awesome php application with bdd behat and iterfacesreally really really awesome php application with bdd behat and iterfaces
really really really awesome php application with bdd behat and iterfacesGiulio De Donato
 

Semelhante a gRPC vs REST: let the battle begin! (20)

Ibm_interconnect_restapi_workshop
Ibm_interconnect_restapi_workshopIbm_interconnect_restapi_workshop
Ibm_interconnect_restapi_workshop
 
Origins of Serverless
Origins of ServerlessOrigins of Serverless
Origins of Serverless
 
HowYourAPIBeMyAPI
HowYourAPIBeMyAPIHowYourAPIBeMyAPI
HowYourAPIBeMyAPI
 
The liferay case: lessons learned evolving from RPC to Hypermedia REST APIs
The liferay case: lessons learned evolving from RPC to Hypermedia REST APIsThe liferay case: lessons learned evolving from RPC to Hypermedia REST APIs
The liferay case: lessons learned evolving from RPC to Hypermedia REST APIs
 
Guillotina: The Asyncio REST Resource API
Guillotina: The Asyncio REST Resource APIGuillotina: The Asyncio REST Resource API
Guillotina: The Asyncio REST Resource API
 
DevSecCon Singapore 2018 - in graph we trust By Imran Mohammed
DevSecCon Singapore 2018 - in graph we trust By Imran MohammedDevSecCon Singapore 2018 - in graph we trust By Imran Mohammed
DevSecCon Singapore 2018 - in graph we trust By Imran Mohammed
 
In graph we trust: Microservices, GraphQL and security challenges
In graph we trust: Microservices, GraphQL and security challengesIn graph we trust: Microservices, GraphQL and security challenges
In graph we trust: Microservices, GraphQL and security challenges
 
Designing a beautiful REST json api
Designing a beautiful REST json apiDesigning a beautiful REST json api
Designing a beautiful REST json api
 
OWASPAPISecurity
OWASPAPISecurityOWASPAPISecurity
OWASPAPISecurity
 
Building Serverless applications with Python
Building Serverless applications with PythonBuilding Serverless applications with Python
Building Serverless applications with Python
 
Motion Django Meetup
Motion Django MeetupMotion Django Meetup
Motion Django Meetup
 
Learning the basics of Apache NiFi for iot OSS Europe 2020
Learning the basics of Apache NiFi for iot OSS Europe 2020Learning the basics of Apache NiFi for iot OSS Europe 2020
Learning the basics of Apache NiFi for iot OSS Europe 2020
 
How to Create the API Document from Real API and Localization
How to Create the API Document from Real API and Localization How to Create the API Document from Real API and Localization
How to Create the API Document from Real API and Localization
 
Building APIs in an easy way using API Platform
Building APIs in an easy way using API PlatformBuilding APIs in an easy way using API Platform
Building APIs in an easy way using API Platform
 
Lies you have been told about REST
Lies you have been told about RESTLies you have been told about REST
Lies you have been told about REST
 
Architecting Multitenant SaaS Applications with Azure - Microsoft Ignite The ...
Architecting Multitenant SaaS Applications with Azure - Microsoft Ignite The ...Architecting Multitenant SaaS Applications with Azure - Microsoft Ignite The ...
Architecting Multitenant SaaS Applications with Azure - Microsoft Ignite The ...
 
Testing API platform with Behat BDD tests
Testing API platform with Behat BDD testsTesting API platform with Behat BDD tests
Testing API platform with Behat BDD tests
 
Free The Enterprise With Ruby & Master Your Own Domain
Free The Enterprise With Ruby & Master Your Own DomainFree The Enterprise With Ruby & Master Your Own Domain
Free The Enterprise With Ruby & Master Your Own Domain
 
Web of things introduction
Web of things introductionWeb of things introduction
Web of things introduction
 
really really really awesome php application with bdd behat and iterfaces
really really really awesome php application with bdd behat and iterfacesreally really really awesome php application with bdd behat and iterfaces
really really really awesome php application with bdd behat and iterfaces
 

Mais de Alex Borysov

CloudExpo Frankfurt 2023 "Break me if you can: practical guide to building fa...
CloudExpo Frankfurt 2023 "Break me if you can: practical guide to building fa...CloudExpo Frankfurt 2023 "Break me if you can: practical guide to building fa...
CloudExpo Frankfurt 2023 "Break me if you can: practical guide to building fa...Alex Borysov
 
Devoxx Belgium 2022 gRPC Cornerstone: HTTP/2… or HTTP/3?
Devoxx Belgium 2022 gRPC Cornerstone: HTTP/2… or HTTP/3?Devoxx Belgium 2022 gRPC Cornerstone: HTTP/2… or HTTP/3?
Devoxx Belgium 2022 gRPC Cornerstone: HTTP/2… or HTTP/3?Alex Borysov
 
"Enabling Googley microservices with gRPC" at JDK.IO 2017
"Enabling Googley microservices with gRPC" at JDK.IO 2017"Enabling Googley microservices with gRPC" at JDK.IO 2017
"Enabling Googley microservices with gRPC" at JDK.IO 2017Alex Borysov
 
"Enabling Googley microservices with gRPC" at JEEConf 2017
"Enabling Googley microservices with gRPC" at JEEConf 2017"Enabling Googley microservices with gRPC" at JEEConf 2017
"Enabling Googley microservices with gRPC" at JEEConf 2017Alex Borysov
 
"Enabling Googley microservices with gRPC." at Devoxx France 2017
"Enabling Googley microservices with gRPC." at Devoxx France 2017"Enabling Googley microservices with gRPC." at Devoxx France 2017
"Enabling Googley microservices with gRPC." at Devoxx France 2017Alex Borysov
 
Enabling Googley microservices with HTTP/2 and gRPC.
Enabling Googley microservices with HTTP/2 and gRPC.Enabling Googley microservices with HTTP/2 and gRPC.
Enabling Googley microservices with HTTP/2 and gRPC.Alex Borysov
 

Mais de Alex Borysov (6)

CloudExpo Frankfurt 2023 "Break me if you can: practical guide to building fa...
CloudExpo Frankfurt 2023 "Break me if you can: practical guide to building fa...CloudExpo Frankfurt 2023 "Break me if you can: practical guide to building fa...
CloudExpo Frankfurt 2023 "Break me if you can: practical guide to building fa...
 
Devoxx Belgium 2022 gRPC Cornerstone: HTTP/2… or HTTP/3?
Devoxx Belgium 2022 gRPC Cornerstone: HTTP/2… or HTTP/3?Devoxx Belgium 2022 gRPC Cornerstone: HTTP/2… or HTTP/3?
Devoxx Belgium 2022 gRPC Cornerstone: HTTP/2… or HTTP/3?
 
"Enabling Googley microservices with gRPC" at JDK.IO 2017
"Enabling Googley microservices with gRPC" at JDK.IO 2017"Enabling Googley microservices with gRPC" at JDK.IO 2017
"Enabling Googley microservices with gRPC" at JDK.IO 2017
 
"Enabling Googley microservices with gRPC" at JEEConf 2017
"Enabling Googley microservices with gRPC" at JEEConf 2017"Enabling Googley microservices with gRPC" at JEEConf 2017
"Enabling Googley microservices with gRPC" at JEEConf 2017
 
"Enabling Googley microservices with gRPC." at Devoxx France 2017
"Enabling Googley microservices with gRPC." at Devoxx France 2017"Enabling Googley microservices with gRPC." at Devoxx France 2017
"Enabling Googley microservices with gRPC." at Devoxx France 2017
 
Enabling Googley microservices with HTTP/2 and gRPC.
Enabling Googley microservices with HTTP/2 and gRPC.Enabling Googley microservices with HTTP/2 and gRPC.
Enabling Googley microservices with HTTP/2 and gRPC.
 

Último

Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfOrbitshub
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...Zilliz
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWERMadyBayot
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoffsammart93
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDropbox
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsNanddeep Nachan
 
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelDeepika Singh
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Angeliki Cooney
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Jeffrey Haguewood
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherRemote DBA Services
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Victor Rentea
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century educationjfdjdjcjdnsjd
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...apidays
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024The Digital Insurer
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesrafiqahmad00786416
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamUiPathCommunity
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityWSO2
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businesspanagenda
 
Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Zilliz
 

Último (20)

Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering Developers
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital Adaptability
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)
 

gRPC vs REST: let the battle begin!