Spring Boot Microservices WebClient Example with E-commerce

Ramesh Fadatare
3 min readSep 19, 2024

--

In this tutorial, we’ll create two Spring Boot microservices for an e-commerce application: product-service and order-service. The order-service will communicate with the product-service to fetch product details using WebClient. We'll use the latest Spring Boot version 3.2+.

Learn Microservices development: Spring Boot Microservices Tutorial.

My Highest-rated Udemy Course

Learn to build microservices using Spring Boot, Spring Cloud, React, Kafka, RabbitMQ, and REST API (REST Web Services).

Course link: Building Microservices with Spring Boot and Spring Cloud

Step 1: Set up the environment

  • JDK 17 or later
  • Maven or Gradle
  • IDE (IntelliJ IDEA, Eclipse, etc.)

Step 2: Set Up product-service

2.1 Create the Project

Use Spring Initializr to create a new project product-service with the following dependencies:

  • Spring Web
  • Spring Boot Actuator

2.2 Configure application.properties

Set up the application properties to run on port 8081.

server.port=8081

2.3 Create a Product Model

Create a simple Product model to represent the product data.

package com.example.productservice;

public class Product {
private String id;
private String name;
private double price;

// Constructor, getters, and setters
public Product(String id, String name, double price) {
this.id = id;
this.name = name;
this.price = price;
}

public String getId() {
return id;
}

public String getName() {
return name;
}

public double getPrice() {
return price;
}
}

2.4 Create a Controller

Create a controller to handle product-related requests.

package com.example.productservice;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ProductController {

@GetMapping("/products/{id}")
public Product getProduct(@PathVariable String id) {
// In a real application, this data would come from a database
return new Product(id, "Sample Product", 99.99);
}
}

Step 3: Set Up order-service

3.1 Create the Project

Use Spring Initializr to create a new project order-service with the following dependencies:

  • Spring Web
  • Spring Boot Actuator
  • Spring Boot Starter WebFlux

3.2 Configure application.properties

Set up the application properties to run on port 8082 and configure the URL for the product-service.

server.port=8082
product.service.url=http://localhost:8081/products

3.3 Create a WebClient Bean

Create a configuration class to define a WebClient bean.

package com.example.orderservice;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.client.WebClient;

@Configuration
public class AppConfig {

@Bean
public WebClient.Builder webClientBuilder() {
return WebClient.builder();
}
}

3.4 Create a Product Client

Create a service class to communicate with the product-service.

package com.example.orderservice;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;

@Service
public class ProductServiceClient {

private final WebClient.Builder webClientBuilder;
private final String productServiceUrl;

public ProductServiceClient(WebClient.Builder webClientBuilder, @Value("${product.service.url}") String productServiceUrl) {
this.webClientBuilder = webClientBuilder;
this.productServiceUrl = productServiceUrl;
}

public Mono<Product> getProductById(String productId) {
return webClientBuilder.build()
.get()
.uri(productServiceUrl + "/" + productId)
.retrieve()
.bodyToMono(Product.class);
}
}

3.5 Create a Product Model

Create a Product model to match the one in product-service.

package com.example.orderservice;

public class Product {
private String id;
private String name;
private double price;

// Constructor, getters, and setters
public Product() {}

public Product(String id, String name, double price) {
this.id = id;
this.name = name;
this.price = price;
}

public String getId() {
return id;
}

public String getName() {
return name;
}

public double getPrice() {
return price;
}
}

3.6 Create a Controller

Create a controller to handle order-related requests and use the ProductServiceClient to fetch product details.

package com.example.orderservice;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;

@RestController
public class OrderController {

private final ProductServiceClient productServiceClient;

public OrderController(ProductServiceClient productServiceClient) {
this.productServiceClient = productServiceClient;
}

@GetMapping("/orders/{productId}")
public Mono<String> createOrder(@PathVariable String productId) {
return productServiceClient.getProductById(productId)
.map(product -> "Order created for product: " + product.getName() + " with price: $" + product.getPrice());
}
}

Step 4: Run the Microservices

  1. Start product-service by running ProductServiceApplication.
  2. Start order-service by running OrderServiceApplication.

Step 5: Test the Communication

Open your browser or use a tool like Postman to test the endpoints:

The response from order-service should include the product details fetched from product-service.

Conclusion

You have successfully set up two Spring Boot microservices and demonstrated communication between them using WebClient. This example can be expanded to include more complex inter-service communication patterns and additional microservices.

Credit:

Spring Boot Microservices WebClient Example with E-commerce

--

--

No responses yet