说明:在微服务架构开发中,一个请求是通过模块之间的互相通信来完成的,如下面这个场景:
创建两个子模块:订单模块(端口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(),向用户模块发送查询用户信息请求;
@Override
public Order getOrder(Long id) {
Order order = orderMapper.getOrder(id);
// 向用户模块发送请求
String s = HttpUtil.get + 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 {
@Bean
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
(使用RestTemplate的getForEntity方法,向用户模块发送请求)
@Autowired
private RestTemplate restTemplate;
@Override
public Order getOrder(Long id) {
Order order = orderMapper.getOrder(id);
// 使用restTemplate的getForEntity()方法向用户模块发送请求
ResponseEntity<User> entity = restTemplate.getForEntity User.class);
// 响应结果是一个response实例,先判断响应状态码是不是成功
if (entity.getStatusCode().is2xxSuccessful()) {
// 取出响应数据使用
User user = entity.getBody();
order.setUser(user);
}
return order;
}
restTemplate.getForEntity()方法返回值类型
测试
postman测试,两者都可以达到相同的效果