REST API vs gRPC
Vladimir DejanovićJavaLand
13 March 2018
@VladimirD_42@JavaLandConf
Let’s Meet
@VladimirD_42
Vladimir Dejanović
@JavaLandConf
Let’s Meet
@VladimirD_42
Vladimir Dejanović
@JavaLandConf
Let’s Meet
@VladimirD_42
Vladimir Dejanović
@JavaLandConf
Let’s Meet
@VladimirD_42
Vladimir Dejanović and Others...
@JavaLandConf
Agenda
@VladimirD_42@JavaLandConf
Agenda
@VladimirD_42
REST
@JavaLandConf
Agenda
@VladimirD_42
REST
gRPC
@JavaLandConf
Agenda
@VladimirD_42
REST
gRPC vs REST
gRPC
@JavaLandConf
Agenda
@VladimirD_42
REST
gRPC vs REST
Questions
gRPC
@JavaLandConf
@VladimirD_42
What is REST?
@JavaLandConf
REST
@VladimirD_42@JavaLandConf
REST
@VladimirD_42
http://www.ics.uci.edu/~fielding/pubs
/dissertation/rest_arch_style.htm
@JavaLandConf
REST
@VladimirD_42
Client-Server Architecture
@JavaLandConf
REST
@VladimirD_42
Client-Server Architecture
Statelessness
@JavaLandConf
REST
@VladimirD_42
Client-Server Architecture
Cacheability
Statelessness
@JavaLandConf
REST
@VladimirD_42
Client-Server Architecture
Cacheability
Layered System
Statelessness
@JavaLandConf
REST
@VladimirD_42
Client-Server Architecture
Cacheability
Layered System
Statelessness
Code on Demand (Optional)
@JavaLandConf
REST
@VladimirD_42
Client-Server Architecture
Cacheability
Layered System
Statelessness
Code on Demand (Optional)
Uniform Interface
@JavaLandConf
REST in real life
@VladimirD_42@JavaLandConf
REST in real life
@VladimirD_42@JavaLandConf
REST in real life
@VladimirD_42@JavaLandConf
REST in real life
@VladimirD_42@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
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);
}
REST in real life
@JavaLandConf
@VladimirD_42@JavaLandConf
@VladimirD_42
gRPC
@JavaLandConf
@VladimirD_42
What is gRPC?
@JavaLandConf
gRPC
@VladimirD_42
gRPC Remote Procedure Call
@JavaLandConf
Remote Procedure Call
@VladimirD_42@JavaLandConf
Remote Procedure Call
@VladimirD_42
RMI
@JavaLandConf
Remote Procedure Call
@VladimirD_42
RMI
@JavaLandConf
CORBA
@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
gRPC
@VladimirD_42
C++
@JavaLandConf
gRPC
@VladimirD_42
C++ Java
@JavaLandConf
gRPC
@VladimirD_42
C++ Java Python
@JavaLandConf
gRPC
@VladimirD_42
C++ Java Python
Go
@JavaLandConf
gRPC
@VladimirD_42
C++ Java Python
Go Ruby
@JavaLandConf
gRPC
@VladimirD_42
C++ Java Python
Go Ruby C#
@JavaLandConf
gRPC
@VladimirD_42
C++ Java Python
Go
Node.js
Ruby C#
@JavaLandConf
gRPC
@VladimirD_42
C++ Java Python
Go
Node.js
Ruby C#
Android Java
@JavaLandConf
gRPC
@VladimirD_42
C++ Java Python
Go
Node.js
Ruby C#
Objective-CAndroid Java
@JavaLandConf
gRPC
@VladimirD_42
C++ Java Python
Go
Node.js
Ruby C#
Objective-CAndroid Java
PHP
@JavaLandConf
gRPC
@VladimirD_42
C++ Java Python
Go
Node.js
Ruby C#
Objective-CAndroid Java
PHP
@JavaLandConf
@VladimirD_42@JavaLandConf
gRPC vs REST
@VladimirD_42@JavaLandConf
@VladimirD_42@JavaLandConf
gRPC vs REST
Both Language agnostic
@VladimirD_42@JavaLandConf
@VladimirD_42@JavaLandConf
gRPC vs REST
https://grpc.io/
@VladimirD_42@JavaLandConf
gRPC vs REST
https://grpc.io/
https://github.com/grpc/grpc-java
@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@JavaLandConf
gRPC vs REST
REST support more languages
@VladimirD_42@JavaLandConf
gRPC vs REST
REST support more languages
More than 4 types :-)
@VladimirD_42
gRPC
@JavaLandConf
@VladimirD_42
IDL
gRPC
@JavaLandConf
@VladimirD_42@JavaLandConf
gRPC vs REST
Schema is “optional” in REST
@VladimirD_42@JavaLandConf
gRPC vs REST
Schema is “optional” in REST
REST code or schema first
@VladimirD_42@JavaLandConf
gRPC vs REST
Schema is “optional” in REST
REST code or schema first
gRPC is schema first
@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
IDL
HTTP/2
gRPC
@JavaLandConf
@VladimirD_42@JavaLandConf
gRPC vs REST
HTTP2 backed into gRPC
@VladimirD_42@JavaLandConf
gRPC vs REST
HTTP2 backed into gRPC
Extra work “needed” for REST
@VladimirD_42
IDL
HTTP/2
Protobuf 3
gRPC
@JavaLandConf
@VladimirD_42@JavaLandConf
gRPC vs REST
REST is not JSON over HTTP
@VladimirD_42@JavaLandConf
gRPC vs REST
JSON Proto
@VladimirD_42@JavaLandConf
gRPC vs REST
JSON Proto ProtoJSON
@VladimirD_42@JavaLandConf
gRPC vs REST
JSON Proto
@VladimirD_42@JavaLandConf
gRPC vs REST
JSON Proto ProtoJSON
@VladimirD_42@JavaLandConf
gRPC vs REST
Protocol Buffer with REST
Big Difference
@VladimirD_42@JavaLandConf
Big Difference
@VladimirD_42@JavaLandConf
REST is about
Resources
Big Difference
@VladimirD_42@JavaLandConf
RPC is about
Remote Procedure Calls
Big Difference
@VladimirD_42@JavaLandConf
Big Difference
@VladimirD_42@JavaLandConf
Big Difference
@VladimirD_42@JavaLandConf
Big Difference
@VladimirD_42@JavaLandConf
Big Difference
@VladimirD_42@JavaLandConf
Big Difference
@VladimirD_42@JavaLandConf
Big Difference
@VladimirD_42@JavaLandConf
gRPC Code Example
@VladimirD_42
https://github.com/vladimir-dejanovic/
grpc-bank-example
@JavaLandConf
gRPC vs REST
@VladimirD_42@JavaLandConf
gRPC vs REST
@VladimirD_42@JavaLandConf
gRPC vs REST
@VladimirD_42
WildWest
@JavaLandConf
gRPC vs REST
@VladimirD_42
WildWest
Law&Order
@JavaLandConf
gRPC vs REST
@VladimirD_42
WildWest
Law&Order
REST
@JavaLandConf
gRPC vs REST
@VladimirD_42
WildWest
Law&Order
REST
@JavaLandConf
gRPC vs REST
@VladimirD_42
WildWest
Law&Order
gRPCREST
@JavaLandConf
gRPC vs REST
@VladimirD_42
Some questions to ask
@JavaLandConf
gRPC vs REST
@VladimirD_42
Who will be consumers?
@JavaLandConf
gRPC vs REST
@VladimirD_42
Who will be consumers?
Mobile / Web / Other?
@JavaLandConf
gRPC vs REST
@VladimirD_42
What is the use case?
@JavaLandConf
gRPC vs REST
@VladimirD_42
What is the use case?
CRUD or Other?
@JavaLandConf
gRPC vs REST
@VladimirD_42
What are internal policies and rules?
@JavaLandConf
gRPC vs REST
@VladimirD_42
What are internal policies and rules?
Toward frameworks, protocols and others
@JavaLandConf
gRPC vs REST
@VladimirD_42
What is the problem
that you are solving
@JavaLandConf
@VladimirD_42
Thank You
@JavaLandConf
Questions
@VladimirD_42
@VladimirD_42
vladimir@itshark.xyz
@JavaLandConf

JavaLand gRPC vs REST API