服务拆分和远程调用

服务拆分和远程调用

1.服务拆分原则

这里我总结了微服务拆分时的几个原则:

  • 不同微服务,不要重复开发相同业务
  • 微服务数据独立,不要访问其它微服务的数据库
  • 微服务可以将自己的业务暴露为接口,供其它微服务调用

2.服务拆分示例

cloud-demo:父工程,管理依赖

  • order-service:订单微服务,负责订单相关业务
  • user-service:用户微服务,负责用户相关业务

要求:

  • 订单微服务和用户微服务都必须有各自的数据库,相互独立
  • 订单服务和用户服务都对外暴露Restful的接口
  • 订单服务如果需要查询用户信息,只能调用用户服务的Restful接口,不能查询用户数据库

俩服务对应的数据库如下:

order-service

user-service

启动项目:

3.实现远程调用

在order-service服务中,有一个根据id查询订单的接口:

@RestController
@RequestMapping("order")
public class OrderController {

@Autowired private OrderService orderService;

@GetMapping("{orderId}")
public Order queryOrderByUserId(@PathVariable("orderId") Long orderId) {
    // 根据id查询订单并返回
    return orderService.queryOrderById(orderId);
}

}

根据id查询订单,返回值是Order对象,如图:

其中的user为null



在user-service中有一个根据id查询用户的接口:

@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;

/**
 * 路径: /user/110
 *
 * @param id 用户id
 * @return 用户
 */
@GetMapping("/{id}")
public User queryById(@PathVariable("id") Long id) {
    return userService.queryById(id);
}

}

查询的结果如图:

案例需求:

修改order-service中的根据id查询订单业务,要求在查询订单的同时,根据订单中包含的userId查询出用户信息,一起返回。

(1).注册RestTemplate

首先,我们在order-service服务中的OrderApplication启动类中,注册RestTemplate实例:

@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
    SpringApplication.run(OrderApplication.class, args);
}
//注册RestTemplate
@Bean
public RestTemplate restTemplate(){
    return new RestTemplate();
}

}

(2).实现远程调用

修改order-service服务中的cn.itcast.order.service包下的OrderService类中的queryOrderById方法

@Service
public class OrderService {
@Autowired
private OrderMapper orderMapper;
@Resource
private RestTemplate restTemplate; //注入RestTemplate

public Order queryOrderById(Long orderId) {
    // 1.查询订单
    Order order = orderMapper.findById(orderId);
    // 2.远程查询User
    // 2.1.url地址(根据order表中的userId查询)
    String url = "http://localhost:8081/user/" + order.getUserId();
    // 2.2.发起调用
    User user = restTemplate.getForObject(url, User.class);
    // 3.存入order
    order.setUser(user);
    // 4.返回
    return order;
}

}

这样就实现了远程调用,查询order时远程查询user:

end
SpringCloud
SpringBoot

评论区

暂无评论