将一个单体项目拆分成微服务项目, 如何实现?
拆分原则:
(1)微服务需要根据模块拆分, 做到单一职责, 不重复开发相同业务。
(2)微服务需要暴露业务接口, 供其他服务使用。
(3)不同微服务都应该有自己的数据库。
现将一个原本处于一个单体项目拆分成微服务项目
(1)进行了模块拆分,为订单和用户模块单独创建一个项目。
(2)订单模块为8080, 用户模块为8081。
(3)订单和用户模块都有自己单独的数据库。
cloud-demo:父工程,管理依赖
订单模块配置文件:
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/cloud_order?useSSL=false
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
mybatis:
type-aliases-package: cn.itcast.user.pojo
configuration:
map-underscore-to-camel-case: true
用户模块配置文件:
server:
port: 8081
spring:
datasource:
url: jdbc:mysql://localhost:3306/cloud_user?useSSL=false
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
mybatis:
type-aliases-package: cn.itcast.user.pojo
configuration:
map-underscore-to-camel-case: true
OrderController.java
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private OrderService orderService;
@GetMapping("/{orderId}")
public Order queryOrderByUserId(@PathVariable("orderId") Long orderId) {
// 根据id查询订单并返回
return orderService.queryOrderById(orderId);
}
}
UserController.java
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public User queryById(@PathVariable("id") Long id) {
return userService.queryById(id);
}
}
需求是: 订单中需要查用户模块, 面对跨服务之间的调用, 又如何实现呢?
这就用到了远程调,因此,我们需要在order-service中 向user-service发起一个http的请求,调用http://localhost:8081/user/{userId}这个接口, 从而获取user对象。
大概的步骤是这样的:
第一步,注册一个RestTemplate的实例到Spring容器
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
第二步, 修改order-service服务中的OrderService类中的queryOrderById方法,根据Order对象中的userId查询User,将查询的User填充到Order对象,一起返回
@Autowired
private RestTemplate restTemplate;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
// 2. 发送请求, 获取user对象
String url = "http://localhost:8081/user/" + order.getUserId();
User user = restTemplate.getForObject(url, User.class);
// 3. 将获取到的user对象设置到订单中
order.setUser(user);
// 4.返回
return order;
}
在这次服务调用关系中, order-service作为服务消费者, 而user-service作为服务提供者
服务提供者:一次业务中,被其它微服务调用的服务。(提供接口给其它微服务)
服务消费者:一次业务中,调用其它微服务的服务。(调用其它微服务提供的接口)
服务提供者与服务消费者的角色并不是绝对的,而是相对于业务而言。
【注】一个服务既可以是服务提供者,也可以是服务消费者。