写点什么

SpringCloud 服务的拆分及远程调用

作者:
  • 2022 年 8 月 28 日
    河南
  • 本文字数:2091 字

    阅读完需:约 7 分钟

SpringCloud 服务的拆分及远程调用

前言

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

1、服务拆分

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

1、微服务拆分的原则:

  • 单一职责原、高内聚低耦合

  • 微服务数据独立,不要访问其它微服务的数据库

  • 微服务可以将自己的业务暴露为接口,供其它微服务调用



2、服务拆分示例:

1、新建一个工程


父工程,管理依赖


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

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

  • 订单微服务用户微服务 都必须有各自的数据库

  • 订单服务 如果需要查询 用户信息,只能调用用户服务的 Restful 接口


2、创建数据库


  • cloud-user



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



  • cloud-order



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



3、项目模块目录



 首先我们在创建工程时已经导入 SpringCloud 的坐标以及 mysql、mybatis 等等。


<dependencies>    <!-- springCloud -->    <dependency>        <groupId>org.springframework.cloud</groupId>        <artifactId>spring-cloud-dependencies</artifactId>        <version>${spring-cloud.version}</version>        <type>pom</type>        <scope>import</scope>    </dependency>
<!-- mysql驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency>
<!--mybatis--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>${mybatis.version}</version> </dependency>
</dependencies>
复制代码


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 如图:



在 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); }}
复制代码


查询的结果如图:



3、小结

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

2、远程调用

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

1、注册 RestTemplate

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


@Beanpublic RestTemplate restTemplate() {    return new RestTemplate();}
复制代码

2、现远程调用

修改 order-service 服务中 OrderService 类中的 queryOrderById 方法:


@Servicepublic 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、提供者与消费者

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


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


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



4、测试

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




总结

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

发布于: 刚刚阅读数: 8
用户头像

关注

在校大三学生一枚 2022.08.02 加入

喜欢学习编程,擅长技术栈JAVA

评论

发布
暂无评论
SpringCloud 服务的拆分及远程调用_微服务_斯_InfoQ写作社区