未使用分布式前,大部分项目为单体架构,所有功能放在一个项目中,使各个模块关联比较高。
如果功能A需要集成B的功能,如果功能B 逻辑改变 ,A也需要改变
下面的案例,使用分布式架构,通过工具类发送http请求获取另一模块信息;代码如下
SpringClound依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
功能模块A
@Data
@Controller
public class Order {
private Long id;
private Long price;
private String name;
private Integer num;
private Long userId;
private User user;
}
@Data
@Controller
public class User {
private Long id;
private String username;
private String address;
}
//声明配置类
@Configuration
public class configuration {
//可以用RestTemplate对象发http请求
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
Mapper
@Mapper
public interface OrderMapper extends BaseMapper<Order> {
@Select("select * from tb_order where id = #{id}")
Order findById(Long id);
}
Service层
@Service
public class OrderService {
@Autowired
private OrderMapper orderMapper;
//注入RestTemplate
@Autowired
private RestTemplate RestTemplate;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
//2调用api,u的请求是功能B的请求路径
String u="http://localhost:8081/user/id?id="+ order.getUserId();
//3形参2 :JOSN序列化指定对象
User forObject = RestTemplate.getForObject(u, User.class);
order.setUser(forObject);
// 4.返回
return order;
}
}
@Controller
@RequestMapping("/order")
public class OrderController {
@Autowired
private OrderService orderService;
@GetMapping("/getId")
@ResponseBody
public Order queryOrderByUserId( int orderId) {
// 根据id查询订单并返回
return orderService.queryOrderById((long) orderId);
}
功能模块B
@Data
@Controller
public class User {
private Long id;
private String username;
private String address;
}
@Mapper
public interface UserMapper extends BaseMapper<User> {
@Select("select * from tb_user where id = #{id}")
User findById(@Param("id") Long id);
}
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public User queryById(Long id) {
return userMapper.findById(id);
}
}
@Slf4j
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
/**
* 路径: /user/110
*
* @param id 用户id
* @return 用户
*/
@GetMapping("/id")
@ResponseBody
public User queryById( int id) {
return userService.queryById((long) id);
}
}
测试
需要sql文件私信我