IDEA 创建 Java 项目 负载均衡 获取 Nacos 服务地址
IDEA 创建 Java 项目 负载均衡 获取 Nacos 服务地址
一、创建 SpringCloud 工程
创建 SpringCloud 工程 教程
二、引入 Nacos 注册中心配置中心
引入 Nacos 注册中心配置中心教程
三、开发下单功能之创建实体类
四、开发下单功能之查询商品信息接口
五、开发下单功能之测试负载均衡
六、开发下单功能之订单服务调用商品服务
七、源码
Order.java
packageyang.junbo.bean.order;importlombok.Data;importyang.junbo.bean.product.Product;importjava.math.BigDecimal;importjava.util.List;@DatapublicclassOrder{privateLongid;privateBigDecimaltotalAmount;privateLonguserId;privateStringnickName;privateStringaddress;privateList<Product>productList;}Product.java
packageyang.junbo.bean.product;importlombok.Data;importjava.math.BigDecimal;/** * ClassName: Product * Package: yang.junbo.product.bean * Description: * * @Author 杨钧博 * @Create 2026/6/17 8:52 * @Version 1.0 */@DatapublicclassProduct{privateLongid;privateBigDecimalprice;privateStringproductName;privateintnum;}OrderController.java
packageyang.junbo.order.controller;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;importyang.junbo.bean.order.Order;importyang.junbo.order.service.OrderService;/** * ClassName: OrderController * Package: yang.junbo.order.controller * Description: * * @Author 杨钧博 * @Create 2026/6/17 9:13 * @Version 1.0 */@RestControllerpublicclassOrderController{@AutowiredprivateOrderServiceorderService;/** * 创建订单 * @param userId * @param productId * @return */@GetMapping("/create")publicOrdercreate(@RequestParam("userId")LonguserId,@RequestParam("productId")LongproductId){Orderorder=orderService.createOrder(productId,userId);returnorder;}}OrderServiceImpl.java
packageyang.junbo.order.service.impl;importlombok.extern.slf4j.Slf4j;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.cloud.client.ServiceInstance;importorg.springframework.cloud.client.discovery.DiscoveryClient;importorg.springframework.cloud.client.loadbalancer.LoadBalancerClient;importorg.springframework.stereotype.Service;importorg.springframework.web.client.RestTemplate;importyang.junbo.bean.order.Order;importyang.junbo.order.service.OrderService;importyang.junbo.bean.product.Product;importjava.math.BigDecimal;importjava.util.Arrays;importjava.util.List;/** * ClassName: OrderSerciveImpl * Package: yang.junbo.order.service.impl * Description: * * @Author 杨钧博 * @Create 2026/6/17 9:14 * @Version 1.0 */@Slf4j@ServicepublicclassOrderSerciveImplimplementsOrderService{@AutowiredprivateDiscoveryClientdiscoveryClient;@AutowiredprivateRestTemplaterestTemplate;@AutowiredprivateLoadBalancerClientloadBalancerClient;/** * 创建订单 * @param productId * @param userId * @return */@OverridepublicOrdercreateOrder(LongproductId,LonguserId){Productproduct=getProductFromRemoteWithLoadBalanceAnnotation(productId);Orderorder=newOrder();order.setId(1L);order.setTotalAmount(product.getPrice().multiply(newBigDecimal(product.getNum())));order.setUserId(userId);order.setNickName("连杰李");order.setAddress("北京");order.setProductList(Arrays.asList(product));returnorder;}// 进阶3:基于注解的负载均衡privateProductgetProductFromRemoteWithLoadBalanceAnnotation(LongproductId){Stringurl="http://service-product/product/"+productId;//2、给远程发送请求; service-product 会被动态替换Productproduct=restTemplate.getForObject(url,Product.class);returnproduct;}privateProductgetProductFromRemote(LongproductId){//1、获取到商品服务所在的所有机器IP+portList<ServiceInstance>instances=discoveryClient.getInstances("service-product");ServiceInstanceinstance=instances.get(0);//远程URLStringurl="http://"+instance.getHost()+":"+instance.getPort()+"/product/"+productId;log.info("远程请求:{}",url);//2、给远程发送请求Productproduct=restTemplate.getForObject(url,Product.class);returnproduct;}// 进阶2:完成负载均衡发送请求privateProductgetProductFromRemoteWithLoadBalance(LongproductId){//1、获取到商品服务所在的所有机器IP+portServiceInstancechoose=loadBalancerClient.choose("service-product");//远程URLStringurl="http://"+choose.getHost()+":"+choose.getPort()+"/product/"+productId;log.info("远程请求:{}",url);//2、给远程发送请求Productproduct=restTemplate.getForObject(url,Product.class);returnproduct;}}OrderServiceConfig.java
packageyang.junbo.order.config;importorg.springframework.cloud.client.loadbalancer.LoadBalanced;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.web.client.RestTemplate;/** * ClassName: OrderServiceConfig * Package: yang.junbo.order.config * Description: * * @Author 杨钧博 * @Create 2026/6/17 9:48 * @Version 1.0 */@ConfigurationpublicclassOrderServiceConfig{@Bean@LoadBalancedpublicRestTemplaterestTemplate(){returnnewRestTemplate();}}ProductController.java
packageyang.junbo.product.controller;importlombok.extern.slf4j.Slf4j;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.PathVariable;importorg.springframework.web.bind.annotation.RestController;importyang.junbo.bean.product.Product;importyang.junbo.product.service.ProductService;/** * ClassName: ProductController * Package: yang.junbo.product.controller * Description: * * @Author 杨钧博 * @Create 2026/6/17 8:53 * @Version 1.0 */@Slf4j@RestControllerpublicclassProductController{@AutowiredprivateProductServiceproductService;/** * 获取商品信息 * @param productId * @return */@GetMapping("/product/{id}")publicProductgetProduct(@PathVariable("id")LongproductId){log.info("查询商品信息"+System.currentTimeMillis());Productproduct=productService.getProduct(productId);returnproduct;}}ProductServiceImpl.java
packageyang.junbo.product.service.impl;importorg.springframework.stereotype.Service;importyang.junbo.bean.product.Product;importyang.junbo.product.service.ProductService;importjava.math.BigDecimal;/** * ClassName: ProductServiceImpl * Package: yang.junbo.product.service.impl * Description: * * @Author 杨钧博 * @Create 2026/6/17 8:54 * @Version 1.0 */@ServicepublicclassProductServiceImplimplementsProductService{/** * 获取商品信息 * @param productId * @return */@OverridepublicProductgetProduct(LongproductId){Productproduct=newProduct();product.setId(Long.valueOf("1"));product.setPrice(newBigDecimal(8000));product.setProductName("iPhone 17");product.setNum(1);returnproduct;}}LoadBalancerTest.java
packageyang.junbo.order;importorg.junit.jupiter.api.Test;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.boot.test.context.SpringBootTest;importorg.springframework.cloud.client.ServiceInstance;importorg.springframework.cloud.client.loadbalancer.LoadBalancerClient;/** * ClassName: LoadBalancerTest * Package: yang.junbo.order * Description: * * @Author 杨钧博 * @Create 2026/6/17 10:47 * @Version 1.0 */@SpringBootTestpublicclassLoadBalancerTest{@AutowiredprivateLoadBalancerClientloadBalancerClient;@Testvoidtest(){ServiceInstancechoose=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());}}