Spring Boot Microservices OpenFeign 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 OpenFeign. We'll use the latest Spring Boot version 3.2+.
Learn Microservices development: Spring Boot Microservices Tutorial.
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 with simple REST API to return a Product:
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
- OpenFeign
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
3.3 Enable Feign Clients
Enable Feign clients by adding the @EnableFeignClients
annotation in the main application class.
package com.example.orderservice;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableFeignClients
public class OrderServiceApplication {
public static void main(String[] args) {
SpringApplication.run(OrderServiceApplication.class, args);
}
}
3.4 Create a Product Client
Create a Feign client interface to communicate with the product-service
.
package com.example.orderservice;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@FeignClient(name = "product-service", url = "${product.service.url}")
public interface ProductServiceClient {
@GetMapping("/products/{id}")
Product getProductById(@PathVariable String id);
}
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
- Start
product-service
by runningProductServiceApplication
. - Start
order-service
by runningOrderServiceApplication
.
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 OpenFeign. This example can be expanded to include more complex inter-service communication patterns and additional microservices.
Learn Microservices development: Spring Boot Microservices Tutorial.