Skip to content

saadmdsabah/Spring-Boot-Microservices-with-gRPC

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 

Repository files navigation

gRPC Microservices Demo with Spring Boot

This project demonstrates the use of gRPC for communication between two Spring Boot microservices: a grpc-server and a grpc-client. It explores the four different types of gRPC communication patterns.

🚀 Motivation

The primary motivation for this project is to explore the potential of gRPC as a high-performance communication protocol for internal microservices. While REST is excellent for public-facing APIs, gRPC offers significant advantages for server-to-server communication within a distributed system.

🤔 What is gRPC and Why Use It Over REST?

gRPC (gRPC Remote Procedure Call) is a modern, open-source, high-performance RPC framework developed by Google. It allows a client application to directly call methods on a server application on a different machine as if it were a local object.

For internal microservice communication, gRPC is often a better choice than REST for several key reasons:

  • Performance: gRPC uses HTTP/2 as its transport protocol, which is much faster than HTTP/1.1 used by most REST APIs. HTTP/2 supports multiplexing (sending multiple requests over a single connection), server push, and header compression, leading to lower latency.
  • Efficient Data Serialization: gRPC uses Protocol Buffers (.proto files) to serialize structured data. This converts data into a compact binary format, which is much smaller and faster to parse than the text-based JSON used in REST.
  • Strictly-Typed Contracts: You define your service and message contracts in a .proto file. This file acts as a single source of truth. From this file, you can generate strongly-typed client and server code in many languages (like Java), which eliminates guesswork and reduces runtime errors.
  • Streaming Capabilities: gRPC has built-in support for streaming data. REST, by contrast, is typically limited to a standard request/response pattern. gRPC supports client-streaming, server-streaming, and bidirectional-streaming, which is perfect for real-time applications, large data transfers, or long-lived connections.

📡 gRPC Communication Types Explained

This project implements all four types of gRPC communication, as defined in our UserService. Protocol Buffers

1. Unary RPC
rpc getUser(UserId) returns (User);

2. Server Streaming RPC
rpc subscribeUser(UserId) returns (stream User);

3. Client Streaming RPC
rpc bulkUserSubmittion(stream UserDetails) returns (UserSummary);

4. Bidirectional Streaming RPC
rpc studentChat(stream User) returns (stream User);

1. Unary RPC (Simple Request/Response)

image

This is the classic request-response model, similar to a typical REST API call. The client sends a single request message, and the server sends back a single response.

Example: getUser(UserId)

    The client sends a UserId.

    The server finds the user and returns a single User message.

2. Server Streaming RPC

image

In this pattern, the client sends a single request, but the server responds with a stream of messages. The client can read from this stream until all messages have been sent.

Example: subscribeUser(UserId)

    The client sends a UserId to subscribe to updates.

    The server keeps the connection open and sends back a stream of User messages whenever there is an update for that user (e.g., name change, email update).

3. Client Streaming RPC

image

This is the opposite of server streaming. The client sends a stream of messages to the server. Once the client has finished sending all its messages, the server processes them and returns a single response.

Example: bulkUserSubmittion(stream UserDetails)

    The client sends a stream of UserDetails messages, perhaps from a large file or a batch process.

    After receiving all the user details, the server processes them and returns a single UserSummary message with a count of the total users submitted.

4. Bidirectional Streaming RPC

image

This is the most flexible pattern. The client and server can both send a stream of messages to each other independently over a single, long-lived connection. The order of messages is preserved within each stream.

Example: studentChat(stream User)

    The client initiates a chat by sending a stream of messages (each wrapped in a User object).

    The server can respond with its own stream of messages at any time. This allows for a real-time, two-way conversation, like a chat room.

✅ Project Outcome


By implementing a client and server with all four communication types, this project successfully demonstrates:
  • Practical application of gRPC in a Java and Spring Boot environment.
  • The clear performance benefits and efficiency of using Protocol Buffers and HTTP/2.
  • The power and flexibility of gRPC's streaming capabilities for complex, real-time use cases that are difficult to implement with traditional REST APIs.
  • A solid foundation and reference for building robust, high-performance microservice architectures.

About

Spring Boot project demonstrating the four types of gRPC communication (Unary, Server-streaming, Client-streaming, & Bidirectional) between microservices.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages