gRPC Core Concepts
Share:
gRPC is a high-performance, open-source universal RPC framework developed by Google. One of its uniqueness is that it operates on the application layer of the networking stack in a language-agnostic way, which means you can create services in any language that gRPC supports, and generate client libraries for other languages. In this chapter, we will delve into the core concepts of gRPC: Protobuf, Services, Methods, Message Types, and Channels.
Protobuf
gRPC uses protobuf (protocol buffers) as its interface definition language (IDL). Protobufs are language-neutral, platform-neutral, extensible leveraging, and provide an efficient way to serialize structured data. Let's consider an example in the movie domain applying protobuf:
syntax = "proto3";
package movie;
// The request message containing movie's title
message MovieRequest {
string title = 1;
}
// The response message containing movie's detail
message MovieResponse {
string id = 1;
string title = 2;
string genre = 3;
string director = 4;
}
In this example, MovieRequest
and MovieResponse
are both messages, and each has a number of attributes (fields).
Services and Methods
Protobuf files can also define services. Services in gRPC have methods that define the API for your service. There are four types of methods in gRPC: Unary, Server streaming, Client streaming, and Bidirectional streaming.
Continuing with our movie example:
service MovieService {
rpc GetMovieDetail (MovieRequest) returns (MovieResponse);
}
The GetMovieDetail
method is an example of a unary method where the client sends a single request and gets a single response.
Message Types
As seen in the previous examples, gRPC uses Protobuf to define Message types. Messages are the input and output types that our service methods use. For example, MovieRequest
and MovieResponse
are message types in our MovieService
service.
Channels
Communication between clients and servers in gRPC ends up happening over a channel. A channel in gRPC is a logical connection to an endpoint (server). Multiple clients can share the same channel making it efficient and easy to manage connections.
Take a look at this Python client example:
import grpc
from generated_code import movie_pb2
from generated_code import movie_pb2_grpc
# Create a gRPC channel
channel = grpc.insecure_channel('localhost:50051')
# Create a stub (client)
stub = movie_pb2_grpc.MovieServiceStub(channel)
# Create a MovieRequest message
movie = movie_pb2.MovieRequest(title="The Matrix")
# Make a GetMovieDetail call
response = stub.GetMovieDetail(movie)
# Do something with the response
print(response)
In this example, a gRPC channel is created with the server address 'localhost:50051'. Then, a client stub is made from the MovieServiceStub
class which is part of the generated code from our protobuf. The stub has all of the methods from our service definition, in this case GetMovieDetail
. We create a MovieRequest
object and fill it with the necessary data, then we call GetMovieDetail
on our stub and pass in our MovieRequest
object. The call is made over the channel to our server, and we get a MovieResponse
object back.
Closing Thoughts
To summarize, gRPC is a powerful and flexible framework enabling efficient communication between services and supports a variety of languages. Its use of Protobuf as IDL promotes language agnostic development and provides capability to define both the data (message types) and the service. Understanding these core concepts of gRPC is fundamental to leveraging its power and streamlining distributed system development.
In the next sections, we would dive into implementing a gRPC service by taking advantage of all these concepts explained. We would create a movie service where clients can add a movie, get the movie details, delete a movie and even share movie recommendations. This will showcase the versatility and power of gRPC for creating efficient, robust, and high-performing APIs.
0 Comment
Sign up or Log in to leave a comment