SpringCloud 服务的拆分及远程调用

作者:大三的土狗
专栏:SpringCloud
在这里插入图片描述

快速导航

  • 前言
    • 1、服务拆分
        • 1、微服务拆分的原则:
        • 2、服务拆分示例:
            • 1、新建一个工程
            • 2、创建数据库
            • 3、项目模块目录
            • 4、核心功能描述
        • 3、小结
    • 2、远程调用
        • 1、注册RestTemplate
        • 2、现远程调用
        • 3、提供者与消费者
        • 4、测试
  • 总结

前言

  任何分布式架构都离不开服务的拆分,微服务也是一样,所以我们要先在遵守微服务拆分的原则下拆分服务,然后实现远程调用。本教程是基于RestTemplate的远程调用。


1、服务拆分

  拆分后服务的复杂性降低,所需要的维护资源显著减少,或者对人员能力的要求大大降低,拆分不仅仅是架构上的调整,也意味着要在组织结构上做出相应的适应性调整,确保拆分后的服务由相对独立的团队负责维护,尽量不要出现在不同服务之间的交叉调用。
  任何分布式架构都离不开服务的拆分,微服务也是一样。

1、微服务拆分的原则:
  • 单一职责原、高内聚低耦合
  • 微服务数据独立,不要访问其它微服务的数据库
  • 微服务可以将自己的业务暴露为接口,供其它微服务调用

SpringCloud 服务的拆分及远程调用_第1张图片

2、服务拆分示例:
1、新建一个工程

父工程,管理依赖

  • order-service:订单微服务,负责订单相关业务
  • user-service:用户微服务,负责用户相关业务
  • 订单微服务用户微服务 都必须有各自的数据库
  • 订单服务 如果需要查询 用户信息,只能调用用户服务的Restful接口
2、创建数据库
  • cloud-user

SpringCloud 服务的拆分及远程调用_第2张图片

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

SpringCloud 服务的拆分及远程调用_第3张图片

  • cloud-order

SpringCloud 服务的拆分及远程调用_第4张图片

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

SpringCloud 服务的拆分及远程调用_第5张图片

3、项目模块目录

SpringCloud 服务的拆分及远程调用_第6张图片

 首先我们在创建工程时已经导入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}
    


4、核心功能描述

在 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如图:
SpringCloud 服务的拆分及远程调用_第7张图片

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

查询的结果如图:

SpringCloud 服务的拆分及远程调用_第8张图片

3、小结

以上就是微服务的拆分,符合了微服务拆分的原则。

2、远程调用

  order-service中的根据id查询订单业务,在查询订单的同时,根据订单中包含的userId查询出用户信息,一起返回,此时就需要远程调用user-service服务。

1、注册RestTemplate

  我们在启动类上或者配置类中注册RestTemplate实例:

@Bean
public RestTemplate restTemplate() {
		return new RestTemplate();
}
2、现远程调用

修改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;
    }
}
3、提供者与消费者

  在服务调用关系中,会有两个不同的角色:

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

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

SpringCloud 服务的拆分及远程调用_第9张图片

4、测试

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

SpringCloud 服务的拆分及远程调用_第10张图片


总结

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

你可能感兴趣的:(SpringCloud,微服务,java,spring,cloud)