IDEA 创建 Java 项目 负载均衡 从获取 Nacos 服务地址
一、创建 SpringCloud 工程
创建 SpringCloud 工程 教程
二、引入 Nacos 服务注册服务发现
引入 Nacos 服务注册服务发现教程
三、开发下单功能之创建实体类
四、开发下单功能之查询商品信息接口
五、开发下单功能之测试负载均衡
六、开发下单功能之订单服务调用商品服务
七、源码
Order.java
package yang.junbo.bean.order;
import lombok.Data;
import yang.junbo.bean.product.Product;
import java.math.BigDecimal;
import java.util.List;
@Data
public class Order {
private Long id;
private BigDecimal totalAmount;
private Long userId;
private String nickName;
private String address;
private List<Product> productList;
}
Product.java
package yang.junbo.bean.product;
import lombok.Data;
import java.math.BigDecimal;
/**
* ClassName: Product
* Package: yang.junbo.product.bean
* Description:
*
* @Author 杨钧博
* @Create 2026/6/17 8:52
* @Version 1.0
*/
@Data
public class Product {
private Long id;
private BigDecimal price;
private String productName;
private int num;
}
OrderController.java
package yang.junbo.order.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import yang.junbo.bean.order.Order;
import yang.junbo.order.service.OrderService;
/**
* ClassName: OrderController
* Package: yang.junbo.order.controller
* Description:
*
* @Author 杨钧博
* @Create 2026/6/17 9:13
* @Version 1.0
*/
@RestController
public class OrderController {
@Autowired
private OrderService orderService;
/**
* 创建订单
* @param userId
* @param productId
* @return
*/
@GetMapping("/create")
public Order create(@RequestParam("userId") Long userId,
@RequestParam("productId") Long productId)
{
Order order = orderService.createOrder(productId,userId);
return order;
}
}
OrderServiceImpl.java
package yang.junbo.order.service.impl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import yang.junbo.bean.order.Order;
import yang.junbo.order.service.OrderService;
import yang.junbo.bean.product.Product;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
/**
* ClassName: OrderSerciveImpl
* Package: yang.junbo.order.service.impl
* Description:
*
* @Author 杨钧博
* @Create 2026/6/17 9:14
* @Version 1.0
*/
@Slf4j
@Service
public class OrderSerciveImpl implements OrderService {
@Autowired
private DiscoveryClient discoveryClient;
@Autowired
private RestTemplate restTemplate;
@Autowired
private LoadBalancerClient loadBalancerClient;
/**
* 创建订单
* @param productId
* @param userId
* @return
*/
@Override
public Order createOrder(Long productId, Long userId) {
Product product = getProductFromRemoteWithLoadBalanceAnnotation(productId);
Order order = new Order();
order.setId(1L);
order.setTotalAmount(product.getPrice().multiply(new BigDecimal(product.getNum())));
order.setUserId(userId);
order.setNickName("连杰李");
order.setAddress("北京");
order.setProductList(Arrays.asList(product));
return order;
}
// 进阶3:基于注解的负载均衡
private Product getProductFromRemoteWithLoadBalanceAnnotation(Long productId){
String url = "http://service-product/product/"+productId;
//2、给远程发送请求; service-product 会被动态替换
Product product = restTemplate.getForObject(url, Product.class);
return product;
}
private Product getProductFromRemote(Long productId){
//1、获取到商品服务所在的所有机器IP+port
List<ServiceInstance> instances = discoveryClient.getInstances("service-product");
ServiceInstance instance = instances.get(0);
//远程URL
String url = "http://"+instance.getHost() +":" +instance.getPort() +"/product/"+productId;
log.info("远程请求:{}",url);
//2、给远程发送请求
Product product = restTemplate.getForObject(url, Product.class);
return product;
}
// 进阶2:完成负载均衡发送请求
private Product getProductFromRemoteWithLoadBalance(Long productId){
//1、获取到商品服务所在的所有机器IP+port
ServiceInstance choose = loadBalancerClient.choose("service-product");
//远程URL
String url = "http://"+choose.getHost() +":" +choose.getPort() +"/product/"+productId;
log.info("远程请求:{}",url);
//2、给远程发送请求
Product product = restTemplate.getForObject(url, Product.class);
return product;
}
}
OrderServiceConfig.java
package yang.junbo.order.config;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
/**
* ClassName: OrderServiceConfig
* Package: yang.junbo.order.config
* Description:
*
* @Author 杨钧博
* @Create 2026/6/17 9:48
* @Version 1.0
*/
@Configuration
public class OrderServiceConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
ProductController.java
package yang.junbo.product.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import yang.junbo.bean.product.Product;
import yang.junbo.product.service.ProductService;
/**
* ClassName: ProductController
* Package: yang.junbo.product.controller
* Description:
*
* @Author 杨钧博
* @Create 2026/6/17 8:53
* @Version 1.0
*/
@Slf4j
@RestController
public class ProductController {
@Autowired
private ProductService productService;
/**
* 获取商品信息
* @param productId
* @return
*/
@GetMapping("/product/{id}")
public Product getProduct(@PathVariable("id") Long productId){
log.info("查询商品信息"+System.currentTimeMillis());
Product product = productService.getProduct(productId);
return product;
}
}
ProductServiceImpl.java
package yang.junbo.product.service.impl;
import org.springframework.stereotype.Service;
import yang.junbo.bean.product.Product;
import yang.junbo.product.service.ProductService;
import java.math.BigDecimal;
/**
* ClassName: ProductServiceImpl
* Package: yang.junbo.product.service.impl
* Description:
*
* @Author 杨钧博
* @Create 2026/6/17 8:54
* @Version 1.0
*/
@Service
public class ProductServiceImpl implements ProductService {
/**
* 获取商品信息
* @param productId
* @return
*/
@Override
public Product getProduct(Long productId) {
Product product = new Product();
product.setId(Long.valueOf("1"));
product.setPrice(new BigDecimal(8000));
product.setProductName("iPhone 17");
product.setNum(1);
return product;
}
}
LoadBalancerTest.java
package yang.junbo.order;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
/**
* ClassName: LoadBalancerTest
* Package: yang.junbo.order
* Description:
*
* @Author 杨钧博
* @Create 2026/6/17 10:47
* @Version 1.0
*/
@SpringBootTest
public class LoadBalancerTest {
@Autowired
private LoadBalancerClient loadBalancerClient;
@Test
void test(){
ServiceInstance choose = loadBalancerClient.choose("service-product");
System.out.println("choose = " + choose.getHost() +":"+choose.getPort());
choose = loadBalancerClient.choose("service-product");
System.out.println("choose = " + choose.getHost() +":"+choose.getPort());
choose = loadBalancerClient.choose("service-product");
System.out.println("choose = " + choose.getHost() +":"+choose.getPort());
choose = loadBalancerClient.choose("service-product");
System.out.println("choose = " + choose.getHost() +":"+choose.getPort());
choose = loadBalancerClient.choose("service-product");
System.out.println("choose = " + choose.getHost() +":"+choose.getPort());
}
}