作者:大三的土狗
专栏:SpringCloud
任何分布式架构都离不开服务的拆分,微服务也是一样,所以我们要先在遵守微服务拆分的原则下拆分服务,然后实现远程调用。本教程是基于RestTemplate的远程调用。
拆分后服务的复杂性降低,所需要的维护资源显著减少,或者对人员能力的要求大大降低,拆分不仅仅是架构上的调整,也意味着要在组织结构上做出相应的适应性调整,确保拆分后的服务由相对独立的团队负责维护,尽量不要出现在不同服务之间的交叉调用。
任何分布式架构都离不开服务的拆分,微服务也是一样。

父工程,管理依赖

cloud-user数据库里有tb_user一张表


cloud-order数据库里有tb_order一张表


首先我们在创建工程时已经导入SpringCloud的坐标以及mysql、mybatis等等。
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import
mysql
mysql-connector-java
${mysql.version}
org.mybatis.spring.boot
mybatis-spring-boot-starter
${mybatis.version}
在 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查询用户的接口:
@Slf4j
@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查询出用户信息,一起返回,此时就需要远程调用user-service服务。
我们在启动类上或者配置类中注册RestTemplate实例:
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
修改order-service服务中OrderService类中的queryOrderById方法:
@Service
public class OrderService {
@Autowired
private OrderMapper orderMapper;
@Autowired
private RestTemplate restTemplate;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
//url
String url = "http://localhost:8081/user/" + order.getUserId();
//发起调用
User user = restTemplate.getForObject(url,User.class);
//3.存入order
order.setUser(user);
// 4.返回
return order;
}
}
在服务调用关系中,会有两个不同的角色:
服务提供者:一次业务中,被其它微服务调用的服务。(提供接口给其它微服务)
服务消费者:一次业务中,调用其它微服务的服务。(调用其它微服务提供的接口)

经过 ,注册RestTemplate和修改order-service服务中OrderService类中的queryOrderById方法现远程调用之后,重新启动两个服务,访问order-service,成功在order-service服务实现了远程调用user-service

RestTemplate是由Spring框架提供的一个可用于应用中调用rest服务的类它简化了与http服务的通信方式,统一了RESTFul的标准,封装了http连接,我们只需要传入url及其返回值类型即可,较为简单,不过也存在弊端。