Spring Boot Microservices RestTemplate Example with E-commerce

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 RestTemplate. We'll use the latest Spring Boot version 3.2+.

Prerequisites

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

Step 1: Create the Projects

We'll create two Spring Boot projects: product-service and order-service.

Step 2: Set Up product-service

2.1 Create the Project

Use Spring Initializr to create a new project 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 with the following dependencies:

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

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 RestTemplate Bean

Create a configuration class to define a RestTemplate bean.

package com.example.orderservice; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; @Configuration public class AppConfig { @Bean public RestTemplate restTemplate() { return new RestTemplate(); } } 

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.client.RestTemplate; @Service public class ProductServiceClient { private final RestTemplate restTemplate; private final String productServiceUrl; public ProductServiceClient(RestTemplate restTemplate, @Value("${product.service.url}") String productServiceUrl) { this.restTemplate = restTemplate; this.productServiceUrl = productServiceUrl; } public Product getProductById(String productId) { return restTemplate.getForObject(productServiceUrl + "/" + productId, 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; @RestController public class OrderController { private final ProductServiceClient productServiceClient; public OrderController(ProductServiceClient productServiceClient) { this.productServiceClient = productServiceClient; } @GetMapping("/orders/{productId}") public String createOrder(@PathVariable String productId) { Product product = productServiceClient.getProductById(productId); return "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:

  • product-service: http://localhost:8081/products/1
  • order-service: http://localhost:8082/orders/1

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 RestTemplate. This example can be expanded to include more complex inter-service communication patterns and additional microservices.


Comments