微服务拆分原则以及服务间进行远程调用

将一个单体项目拆分成微服务项目, 如何实现?

拆分原则:

(1)微服务需要根据模块拆分, 做到单一职责, 不重复开发相同业务。

(2)微服务需要暴露业务接口, 供其他服务使用。

(3)不同微服务都应该有自己的数据库。

现将一个原本处于一个单体项目拆分成微服务项目

(1)进行了模块拆分,为订单和用户模块单独创建一个项目。

(2)订单模块为8080, 用户模块为8081。

(3)订单和用户模块都有自己单独的数据库。

微服务拆分原则以及服务间进行远程调用_第1张图片

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

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

订单模块配置文件:

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);
    }
}

订单中有个查询订单功能, 但是查出来的用户为null
微服务拆分原则以及服务间进行远程调用_第2张图片

需求是: 订单中需要查用户模块, 面对跨服务之间的调用, 又如何实现呢?

这就用到了远程调,因此,我们需要在order-service中 向user-service发起一个http的请求,调用http://localhost:8081/user/{userId}这个接口, 从而获取user对象。

大概的步骤是这样的:

  • 注册一个RestTemplate的实例到Spring容器
  • 修改order-service服务中的OrderService类中的queryOrderById方法,根据Order对象中的userId查询User,将查询的User填充到Order对象,一起返回

第一步,注册一个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作为服务提供者

服务提供者:一次业务中,被其它微服务调用的服务。(提供接口给其它微服务)

服务消费者:一次业务中,调用其它微服务的服务。(调用其它微服务提供的接口)

服务提供者与服务消费者的角色并不是绝对的,而是相对于业务而言。

【注】一个服务既可以是服务提供者,也可以是服务消费者。

你可能感兴趣的:(微服务)