说明:在微服务架构开发中,一个请求是通过模块之间的互相通信来完成的,如下面这个场景:
创建两个子模块:订单模块(端口8081)、用户模块(端口8082),两个模块之间没有联系,现在需要查询订单,根据订单中的用户ID,查询该订单对应的用户信息。
(两个模块是独立的)
用户实体类
import lombok.Data;import java.io.Serializable;/*** 用户*/
@Data
public class User implements Serializable {/*** ID*/private Long id;/*** 用户名*/private String username;/*** 地址*/private String address;
}
订单实体类,查询订单需要补充用户信息
import lombok.Data;import java.io.Serializable;/*** 订单*/
@Data
public class Order implements Serializable {/*** ID*/private Long id;/*** 价格*/private Double price;/*** 用户ID*/private Long userId;/*** 商品名*/private String name;/*** 商品数量*/private Integer num;/*** 用户信息*/private User user;
}
此时,因为订单模块中没有用户业务,是没有对应的UserMapper类操作数据库的。这就需要向用户模块发送请求,并传递用户ID,由用户模块里对应的方法去操作数据库,返回用户信息。可以用以下两种方式实现。
方式一:Hutool工具包
可使用Hutool工具包中的get(),向用户模块发送查询用户信息请求;
@Overridepublic Order getOrder(Long id) {Order order = orderMapper.getOrder(id);// 向用户模块发送请求String s = HttpUtil.get("http://localhost:8082/user?id=" + order.getUserId());// 解析相应结果User user = JSONUtil.toBean(s, User.class);order.setUser(user);return order;}
方式二:RestTemplate
使用RestTemplate中的getForEntity()方法,也可以达到同样的效果,使用前,需要手动添加该类到IOC容器中;
(手动添加Bean到IOC容器中)
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;@Configuration
public class AddBean {@Beanpublic RestTemplate getRestTemplate() {return new RestTemplate();}
}
(使用RestTemplate的getForEntity方法,向用户模块发送请求)
@Autowiredprivate RestTemplate restTemplate;@Overridepublic Order getOrder(Long id) {Order order = orderMapper.getOrder(id);// 使用restTemplate的getForEntity()方法向用户模块发送请求ResponseEntity<User> entity = restTemplate.getForEntity("http://localhost:8082/user?id=" + order.getUserId(), User.class);// 响应结果是一个response实例,先判断响应状态码是不是成功if (entity.getStatusCode().is2xxSuccessful()) {// 取出响应数据使用User user = entity.getBody();order.setUser(user);}return order;}
restTemplate.getForEntity()方法返回值类型
测试
postman测试,两者都可以达到相同的效果