Skip to main content

Java gRPC Integration Tutorial

gRPC (Google Remote Procedure Call) is a high-performance RPC (Remote Procedure Call) framework that uses HTTP/2, Protocol Buffers, and provides support for multiple languages. This tutorial will guide you through integrating gRPC with Java, including setting up a basic gRPC server and client.


Prerequisites​

  1. Java: Ensure Java is installed on your system.

  2. Maven: This tutorial assumes the use of Maven as the build tool.

  3. Protobuf Compiler: Install protoc (Protocol Buffers compiler), which is needed to generate gRPC classes.

    # On Ubuntu, you can install it with:
    sudo apt install -y protobuf-compiler

    # Verify installation
    protoc --version

1. Setting Up a New Maven Project​

Create a new Maven project for the gRPC integration.

Step 1: Add gRPC and Protobuf Dependencies​

Add the following dependencies and plugins to your pom.xml file:

<dependencies>
<!-- gRPC Dependencies -->
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-netty-shaded</artifactId>
<version>1.40.1</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-protobuf</artifactId>
<version>1.40.1</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-stub</artifactId>
<version>1.40.1</version>
</dependency>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.17.3</version>
</dependency>
</dependencies>

<build>
<extensions>
<extension>
<groupId>kr.motd.maven</groupId>
<artifactId>os-maven-plugin</artifactId>
<version>1.6.2</version>
</extension>
</extensions>
<plugins>
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.6.1</version>
<configuration>
<protocArtifact>com.google.protobuf:protoc:3.17.3:exe:${os.detected.classifier}</protocArtifact>
<pluginId>grpc-java</pluginId>
<pluginArtifact>io.grpc:protoc-gen-grpc-java:1.40.1:exe:${os.detected.classifier}</pluginArtifact>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>compile-custom</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

2. Defining the gRPC Service in .proto​

Create a new directory src/main/proto/ and add a file named greeting.proto:

syntax = "proto3";

option java_multiple_files = true;
option java_package = "com.example.grpc";
option java_outer_classname = "GreetingProto";

service GreetService {
rpc Greet (GreetRequest) returns (GreetResponse);
}

message GreetRequest {
string name = 1;
}

message GreetResponse {
string message = 1;
}

This .proto file defines a GreetService with a Greet RPC method that takes a GreetRequest and returns a GreetResponse.


3. Generating Java Classes​

Compile the .proto file using Maven:

mvn clean compile

This will generate Java classes for the service and messages defined in greeting.proto. The generated files can be found in target/generated-sources/protobuf/java.


4. Implementing the gRPC Server​

Create a new class GreetServiceImpl to implement the GreetService defined in greeting.proto:

import com.example.grpc.GreetRequest;
import com.example.grpc.GreetResponse;
import com.example.grpc.GreetServiceGrpc;
import io.grpc.stub.StreamObserver;

public class GreetServiceImpl extends GreetServiceGrpc.GreetServiceImplBase {

@Override
public void greet(GreetRequest request, StreamObserver<GreetResponse> responseObserver) {
String greeting = "Hello, " + request.getName();
GreetResponse response = GreetResponse.newBuilder()
.setMessage(greeting)
.build();
responseObserver.onNext(response);
responseObserver.onCompleted();
}
}

Starting the gRPC Server​

Create a main class GrpcServer to start the gRPC server:

import io.grpc.Server;
import io.grpc.ServerBuilder;

import java.io.IOException;

public class GrpcServer {

public static void main(String[] args) throws IOException, InterruptedException {
Server server = ServerBuilder.forPort(8080)
.addService(new GreetServiceImpl())
.build();

System.out.println("Starting server...");
server.start();
System.out.println("Server started on port 8080");

server.awaitTermination();
}
}

Run this main class to start the gRPC server.


5. Implementing the gRPC Client​

Create a new class GrpcClient to act as a client that communicates with the gRPC server:

import com.example.grpc.GreetRequest;
import com.example.grpc.GreetResponse;
import com.example.grpc.GreetServiceGrpc;
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;

public class GrpcClient {

public static void main(String[] args) {
ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 8080)
.usePlaintext()
.build();

GreetServiceGrpc.GreetServiceBlockingStub stub = GreetServiceGrpc.newBlockingStub(channel);

GreetRequest request = GreetRequest.newBuilder()
.setName("World")
.build();

GreetResponse response = stub.greet(request);
System.out.println(response.getMessage());

channel.shutdown();
}
}

Run this client class to send a request to the gRPC server and receive a response.


Summary​

This tutorial covered the basics of setting up gRPC in a Java project, including:

  1. Defining a gRPC service in a .proto file.
  2. Generating Java classes from the .proto file.
  3. Implementing a gRPC server and client.

gRPC provides a fast and efficient way to communicate between microservices. Experiment with additional gRPC methods and client configurations to expand your setup.

Content Review​

The content in this repository has been reviewed by chevp. Chevp is dedicated to ensuring that the information provided is accurate, relevant, and up-to-date, helping users to learn and implement programming skills effectively.

About the Reviewer​

For more insights and contributions, visit chevp's GitHub profile: chevp's GitHub Profile.