远程调用基本实现
1.配置文件
RestTemplate:是 Spring Framework 提供的一个用于同步调用 HTTP 接口的客户端工具类,主要用于在 Java 应用中发起 HTTP 请求(如 GET、POST 等)并处理响应。
package com.cx.order.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;/*** @author Jiang* @date 2025/11/7*/
@Configuration
public class OrderConfig {@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}
2.OrderServiceImpl
package com.cx.order.service.impl;import com.cx.Order;
import com.cx.Product;
import com.cx.order.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;/*** @author Jiang* @date 2025/11/7*/
@Service
public class OrderServiceImpl implements OrderService {@AutowiredDiscoveryClient discoveryClient;@AutowiredRestTemplate restTemplate;@Overridepublic Order createOrder(Long userId, Long productId) {Product product = getProductFromRemote(productId);Order order = new Order();order.setId(1L);// 总金额=价格*数量BigDecimal price = product.getPrice();//价格int num = product.getNum();//数量order.setTotalAmount(price.multiply(new BigDecimal(num)));//总价order.setUserId(userId);order.setNickName("张三");order.setAddress("火星");// 远程查询商品列表order.setProductList(Arrays.asList(product));return order;}//远程调用获取商品信息public Product getProductFromRemote(Long productId) {//1、获取到商品服务所在的所有机器IP+portList<ServiceInstance> instances = discoveryClient.getInstances("service-product");ServiceInstance instance = instances.get(0);//远程URLString url = "http://" + instance.getHost() + ":" + instance.getPort() + "/productId/" + productId;//2、给远程发送请求return restTemplate.getForObject(url, Product.class);}
}