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