Rest Api Vs GRPC: Vladimir Dejanović Javaland

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 115

REST API vs gRPC

JavaLand Vladimir Dejanović


13 March 2018

@JavaLandConf @VladimirD_42
Let’s Meet

Vladimir Dejanović

@JavaLandConf @VladimirD_42
Let’s Meet

Vladimir Dejanović

@JavaLandConf @VladimirD_42
Let’s Meet

Vladimir Dejanović

@JavaLandConf @VladimirD_42
Let’s Meet

Vladimir Dejanović and Others...

@JavaLandConf @VladimirD_42
Agenda

@JavaLandConf @VladimirD_42
Agenda

REST

@JavaLandConf @VladimirD_42
Agenda

REST

gRPC

@JavaLandConf @VladimirD_42
Agenda

REST

gRPC
gRPC vs REST

@JavaLandConf @VladimirD_42
Agenda

REST

gRPC
gRPC vs REST

Questions

@JavaLandConf @VladimirD_42
What is REST?

@JavaLandConf @VladimirD_42
REST

@JavaLandConf @VladimirD_42
REST

http://www.ics.uci.edu/~fielding/pubs
/dissertation/rest_arch_style.htm

@JavaLandConf @VladimirD_42
REST
Client-Server Architecture

@JavaLandConf @VladimirD_42
REST
Client-Server Architecture
Statelessness

@JavaLandConf @VladimirD_42
REST
Client-Server Architecture
Statelessness
Cacheability

@JavaLandConf @VladimirD_42
REST
Client-Server Architecture
Statelessness
Cacheability
Layered System

@JavaLandConf @VladimirD_42
REST
Client-Server Architecture
Statelessness
Cacheability
Layered System
Code on Demand (Optional)

@JavaLandConf @VladimirD_42
REST
Client-Server Architecture
Statelessness
Cacheability
Layered System
Code on Demand (Optional)
Uniform Interface
@JavaLandConf @VladimirD_42
REST in real life

@JavaLandConf @VladimirD_42
REST in real life

@JavaLandConf @VladimirD_42
REST in real life

@JavaLandConf @VladimirD_42
REST in real life

@JavaLandConf @VladimirD_42
REST in real life
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.repository.query.Param;
import
org.springframework.data.rest.core.annotation.RepositoryRestResource;

@RepositoryRestResource(collectionResourceRel = "people",
path = "people")
public interface PersonRepository
extends MongoRepository<Person, String> {
List<Person> findByLastName(@Param("name") String name);
}

@JavaLandConf @VladimirD_42
REST in real life
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.repository.query.Param;
import
org.springframework.data.rest.core.annotation.RepositoryRestResource;

@RepositoryRestResource(collectionResourceRel = "people",
path = "people")
public interface PersonRepository
extends MongoRepository<Person, String> {
List<Person> findByLastName(@Param("name") String name);
}

@JavaLandConf @VladimirD_42
@JavaLandConf @VladimirD_42
gRPC

@JavaLandConf @VladimirD_42
What is gRPC?

@JavaLandConf @VladimirD_42
gRPC

gRPC Remote Procedure Call

@JavaLandConf @VladimirD_42
Remote Procedure Call

@JavaLandConf @VladimirD_42
Remote Procedure Call

RMI

@JavaLandConf @VladimirD_42
Remote Procedure Call

RMI

CORBA

@JavaLandConf @VladimirD_42
https://grpc.io/img/landing-2.svg

@JavaLandConf @VladimirD_42
https://grpc.io/img/landing-2.svg

@JavaLandConf @VladimirD_42
https://grpc.io/img/landing-2.svg

@JavaLandConf @VladimirD_42
https://grpc.io/img/landing-2.svg

@JavaLandConf @VladimirD_42
https://grpc.io/img/landing-2.svg

@JavaLandConf @VladimirD_42
gRPC
C++

@JavaLandConf @VladimirD_42
gRPC
C++ Java

@JavaLandConf @VladimirD_42
gRPC
C++ Java Python

@JavaLandConf @VladimirD_42
gRPC
C++ Java Python

Go

@JavaLandConf @VladimirD_42
gRPC
C++ Java Python

Go Ruby

@JavaLandConf @VladimirD_42
gRPC
C++ Java Python

Go Ruby C#

@JavaLandConf @VladimirD_42
gRPC
C++ Java Python

Go Ruby C#

Node.js

@JavaLandConf @VladimirD_42
gRPC
C++ Java Python

Go Ruby C#

Node.js Android Java

@JavaLandConf @VladimirD_42
gRPC
C++ Java Python

Go Ruby C#

Node.js Android Java Objective-C

@JavaLandConf @VladimirD_42
gRPC
C++ Java Python

Go Ruby C#

Node.js Android Java Objective-C

PHP

@JavaLandConf @VladimirD_42
gRPC
C++ Java Python

Go Ruby C#

Node.js Android Java Objective-C

PHP

@JavaLandConf @VladimirD_42
gRPC vs REST

@JavaLandConf @VladimirD_42
@JavaLandConf @VladimirD_42
gRPC vs REST

Both Language agnostic

@JavaLandConf @VladimirD_42
@JavaLandConf @VladimirD_42
gRPC vs REST

https://grpc.io/

@JavaLandConf @VladimirD_42
gRPC vs REST

https://grpc.io/

https://github.com/grpc/grpc-java

@JavaLandConf @VladimirD_42
gRPC

@JavaLandConf @VladimirD_42
gRPC

@JavaLandConf @VladimirD_42
gRPC

@JavaLandConf @VladimirD_42
gRPC

@JavaLandConf @VladimirD_42
gRPC

@JavaLandConf @VladimirD_42
gRPC

@JavaLandConf @VladimirD_42
gRPC

@JavaLandConf @VladimirD_42
gRPC

@JavaLandConf @VladimirD_42
gRPC

@JavaLandConf @VladimirD_42
gRPC vs REST

REST support more languages

@JavaLandConf @VladimirD_42
gRPC vs REST

REST support more languages

More than 4 types :-)

@JavaLandConf @VladimirD_42
gRPC

@JavaLandConf @VladimirD_42
gRPC
IDL

@JavaLandConf @VladimirD_42
gRPC vs REST

Schema is “optional” in REST

@JavaLandConf @VladimirD_42
gRPC vs REST

Schema is “optional” in REST

REST code or schema first

@JavaLandConf @VladimirD_42
gRPC vs REST

Schema is “optional” in REST

REST code or schema first

gRPC is schema first

@JavaLandConf @VladimirD_42
...
message TransferMoney {
int32 trans_id = 1;
int32 from_account_number = 2;
int32 to_account_number = 3;
double ammount = 4;
string message = 5;
}

service Bank {
rpc Transfer(TransferMoney) returns (TransferConfirmation);

rpc ListenToNotifications(Account) returns (stream AccountNotification);

rpc RequestTransfer(stream RequestMoney) returns (stream RequestStatus);


}

...

@JavaLandConf @VladimirD_42
...
message TransferMoney {
int32 trans_id = 1;
int32 from_account_number = 2;
int32 to_account_number = 3;
double ammount = 4;
string message = 5;
}

service Bank {
rpc Transfer(TransferMoney) returns (TransferConfirmation);

rpc ListenToNotifications(Account) returns (stream AccountNotification);

rpc RequestTransfer(stream RequestMoney) returns (stream RequestStatus);


}

...

@JavaLandConf @VladimirD_42
...
message TransferMoney {
int32 trans_id = 1;
int32 from_account_number = 2;
int32 to_account_number = 3;
double ammount = 4;
string message = 5;
}

service Bank {
rpc Transfer(TransferMoney) returns (TransferConfirmation);

rpc ListenToNotifications(Account) returns (stream AccountNotification);

rpc RequestTransfer(stream RequestMoney) returns (stream RequestStatus);


}

...

@JavaLandConf @VladimirD_42
...
message TransferMoney {
int32 trans_id = 1;
int32 from_account_number = 2;
int32 to_account_number = 3;
double ammount = 4;
string message = 5;
}

service Bank {
rpc Transfer(TransferMoney) returns (TransferConfirmation);

rpc ListenToNotifications(Account) returns (stream AccountNotification);

rpc RequestTransfer(stream RequestMoney) returns (stream RequestStatus);


}

...

@JavaLandConf @VladimirD_42
...
message TransferMoney {
int32 trans_id = 1;
int32 from_account_number = 2;
int32 to_account_number = 3;
double ammount = 4;
string message = 5;
}

service Bank {
rpc Transfer(TransferMoney) returns (TransferConfirmation);

rpc ListenToNotifications(Account) returns (stream AccountNotification);

rpc RequestTransfer(stream RequestMoney) returns (stream RequestStatus);


}

...

@JavaLandConf @VladimirD_42
...
message TransferMoney {
int32 trans_id = 1;
int32 from_account_number = 2;
int32 to_account_number = 3;
double ammount = 4;
string message = 5;
}

service Bank {
rpc Transfer(TransferMoney) returns (TransferConfirmation);

rpc ListenToNotifications(Account) returns (stream AccountNotification);

rpc RequestTransfer(stream RequestMoney) returns (stream RequestStatus);


}

...

@JavaLandConf @VladimirD_42
...
message TransferMoney {
int32 trans_id = 1;
int32 from_account_number = 2;
int32 to_account_number = 3;
double ammount = 4;
string message = 5;
}

service Bank {
rpc Transfer(TransferMoney) returns (TransferConfirmation);

rpc ListenToNotifications(Account) returns (stream AccountNotification);

rpc RequestTransfer(stream RequestMoney) returns (stream RequestStatus);


}

...

@JavaLandConf @VladimirD_42
gRPC
IDL

HTTP/2

@JavaLandConf @VladimirD_42
gRPC vs REST

HTTP2 backed into gRPC

@JavaLandConf @VladimirD_42
gRPC vs REST

HTTP2 backed into gRPC

Extra work “needed” for REST

@JavaLandConf @VladimirD_42
gRPC
IDL

HTTP/2

Protobuf 3

@JavaLandConf @VladimirD_42
gRPC vs REST

REST is not JSON over HTTP

@JavaLandConf @VladimirD_42
gRPC vs REST

JSON Proto

@JavaLandConf @VladimirD_42
gRPC vs REST

JSON Proto JSON Proto

@JavaLandConf @VladimirD_42
gRPC vs REST

JSON Proto

@JavaLandConf @VladimirD_42
gRPC vs REST

JSON Proto JSON Proto

@JavaLandConf @VladimirD_42
gRPC vs REST

Protocol Buffer with REST

@JavaLandConf @VladimirD_42
Big Difference

@JavaLandConf @VladimirD_42
Big Difference

REST is about
Resources

@JavaLandConf @VladimirD_42
Big Difference

RPC is about
Remote Procedure Calls

@JavaLandConf @VladimirD_42
Big Difference

@JavaLandConf @VladimirD_42
Big Difference

@JavaLandConf @VladimirD_42
Big Difference

@JavaLandConf @VladimirD_42
Big Difference

@JavaLandConf @VladimirD_42
Big Difference

@JavaLandConf @VladimirD_42
Big Difference

@JavaLandConf @VladimirD_42
Big Difference

@JavaLandConf @VladimirD_42
gRPC Code Example

https://github.com/vladimir-dejanovic/
grpc-bank-example

@JavaLandConf @VladimirD_42
gRPC vs REST

@JavaLandConf @VladimirD_42
gRPC vs REST

@JavaLandConf @VladimirD_42
Wild West
gRPC vs REST

@JavaLandConf @VladimirD_42
gRPC vs REST

Law & Order


Wild West

@JavaLandConf @VladimirD_42
gRPC vs REST

Law & Order


Wild West

REST

@JavaLandConf @VladimirD_42
gRPC vs REST

Law & Order


Wild West

REST

@JavaLandConf @VladimirD_42
gRPC vs REST

Law & Order


Wild West

REST gRPC

@JavaLandConf @VladimirD_42
gRPC vs REST

Some questions to ask

@JavaLandConf @VladimirD_42
gRPC vs REST

Who will be consumers?

@JavaLandConf @VladimirD_42
gRPC vs REST

Who will be consumers?

Mobile / Web / Other?

@JavaLandConf @VladimirD_42
gRPC vs REST

What is the use case?

@JavaLandConf @VladimirD_42
gRPC vs REST

What is the use case?

CRUD or Other?

@JavaLandConf @VladimirD_42
gRPC vs REST

What are internal policies and rules?

@JavaLandConf @VladimirD_42
gRPC vs REST

What are internal policies and rules?

Toward frameworks, protocols and others

@JavaLandConf @VladimirD_42
gRPC vs REST

What is the problem


that you are solving

@JavaLandConf @VladimirD_42
Thank You

@JavaLandConf @VladimirD_42
Questions

@VladimirD_42

vladimir@itshark.xyz

@JavaLandConf @VladimirD_42

You might also like