IDEA 创建 Java 项目 负载均衡 从获取 Nacos 服务地址

IDEA 创建 Java 项目 负载均衡 从获取 Nacos 服务地址

一、创建 SpringCloud 工程

创建 SpringCloud 工程 教程

二、引入 Nacos 服务注册服务发现

引入 Nacos 服务注册服务发现教程

三、开发下单功能之创建实体类

四、开发下单功能之查询商品信息接口

五、开发下单功能之测试负载均衡

六、开发下单功能之订单服务调用商品服务

七、源码

Order.java

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

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

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

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

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

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

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

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());
    }
}