SpringCloud 服务的拆分及远程调用

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: SpringCloud 服务的拆分及远程调用

前言

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

1、服务拆分

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

1、微服务拆分的原则:

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

image-20220823114719139.png

2、服务拆分示例:

1、新建一个工程

父工程,管理依赖

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

image-20220823124853325.png

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

image-20220823125043932.png

  • cloud-order

image-20220823124740103.png

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

image-20220823130312038.png

3、项目模块目录

image-20220823132111588.png

首先我们在创建工程时已经导入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")
publicclassOrderController {
@AutowiredprivateOrderServiceorderService;
@GetMapping("{orderId}")
publicOrderqueryOrderByUserId(@PathVariable("orderId") LongorderId) {
// 根据id查询订单并返回returnorderService.queryOrderById(orderId);
    }
}

启动服务,根据id查询订单,返回值是Order对象,其中的user为null如图:

image-20220823133859224.png

在user-service中有一个根据id查询用户的接口:

@Slf4j@RestController@RequestMapping("/user")
publicclassUserController {
@AutowiredprivateUserServiceuserService;
/*** 路径: /user/110** @param id 用户id* @return 用户*/@GetMapping("/{id}")
publicUserqueryById(@PathVariable("id") Longid) {
returnuserService.queryById(id);
    }
}

查询的结果如图:

image-20220823134014560.png

3、小结

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

2、远程调用

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

1、注册RestTemplate

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

@BeanpublicRestTemplaterestTemplate() {
returnnewRestTemplate();
}

2、现远程调用

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

@ServicepublicclassOrderService {
@AutowiredprivateOrderMapperorderMapper;
@AutowiredprivateRestTemplaterestTemplate;
publicOrderqueryOrderById(LongorderId) {
// 1.查询订单Orderorder=orderMapper.findById(orderId);
//urlStringurl="http://localhost:8081/user/"+order.getUserId();
//发起调用Useruser=restTemplate.getForObject(url,User.class);
//3.存入orderorder.setUser(user);
// 4.返回returnorder;
    }
}

3、提供者与消费者

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

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

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


4、测试

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

image-20220823140414081.png


总结

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


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6天前
|
Java API 微服务
【Spring Boot系列】通过OpenAPI规范构建微服务服务接口
【4月更文挑战第5天】通过OpenAPI接口构建Spring Boot服务RestAPI接口
|
1月前
|
SpringCloudAlibaba Java 网络架构
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(二)Rest微服务工程搭建
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(二)Rest微服务工程搭建
52 0
|
1月前
|
SpringCloudAlibaba Java 持续交付
【构建一套Spring Cloud项目的大概步骤】&【Springcloud Alibaba微服务分布式架构学习资料】
【构建一套Spring Cloud项目的大概步骤】&【Springcloud Alibaba微服务分布式架构学习资料】
148 0
|
1月前
|
SpringCloudAlibaba Java 网络架构
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(七)Spring Cloud Gateway服务网关
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(七)Spring Cloud Gateway服务网关
98 0
|
1天前
|
Java Nacos 开发者
Java从入门到精通:4.2.1学习新技术与框架——以Spring Boot和Spring Cloud Alibaba为例
Java从入门到精通:4.2.1学习新技术与框架——以Spring Boot和Spring Cloud Alibaba为例
|
23天前
|
开发框架 负载均衡 Java
Spring boot与Spring cloud之间的关系
总之,Spring Boot和Spring Cloud之间的关系是一种构建和扩展的关系,Spring Boot提供了基础,而Spring Cloud在此基础上提供了分布式系统和微服务架构所需的扩展和工具。
18 4
Spring boot与Spring cloud之间的关系
|
1月前
|
SpringCloudAlibaba 负载均衡 Java
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(目录大纲)
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(目录大纲)
65 1
|
1月前
|
Java Nacos Sentinel
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(九)Nacos+Sentinel+Seata
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(九)Nacos+Sentinel+Seata
201 0
|
1月前
|
消息中间件 SpringCloudAlibaba Java
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(八)Config服务配置+bus消息总线+stream消息驱动+Sleuth链路追踪
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(八)Config服务配置+bus消息总线+stream消息驱动+Sleuth链路追踪
783 0
|
1月前
|
SpringCloudAlibaba Java 测试技术
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(六)Hystrix(豪猪哥)的使用
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(六)Hystrix(豪猪哥)的使用
39 1

热门文章

最新文章