作者:大三的土狗
专栏: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")publicclassOrderController{@AutowiredprivateOrderService orderService;@GetMapping("{orderId}")publicOrderqueryOrderByUserId(@PathVariable("orderId")Long orderId){// 根据id查询订单并返回return orderService.queryOrderById(orderId);}}
启动服务,根据id查询订单,返回值是Order对象,其中的user为null如图:
在user-service中有一个根据id查询用户的接口:
@Slf4j@RestController@RequestMapping("/user")publicclassUserController{@AutowiredprivateUserService userService;/**
* 路径: /user/110
*
* @param id 用户id
* @return 用户
*/@GetMapping("/{id}")publicUserqueryById(@PathVariable("id")Long id){return userService.queryById(id);}}
查询的结果如图:
3、小结
以上就是微服务的拆分,符合了微服务拆分的原则。
2、远程调用
order-service中的根据id查询订单业务,在查询订单的同时,根据订单中包含的userId查询出用户信息,一起返回,此时就需要远程调用user-service服务。
1、注册RestTemplate
我们在启动类上或者配置类中注册RestTemplate实例:
@BeanpublicRestTemplaterestTemplate(){returnnewRestTemplate();}
2、现远程调用
修改order-service服务中OrderService类中的queryOrderById方法:
@ServicepublicclassOrderService{@AutowiredprivateOrderMapper orderMapper;@AutowiredprivateRestTemplate restTemplate;publicOrderqueryOrderById(Long orderId){// 1.查询订单Order order = orderMapper.findById(orderId);//urlString 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
及其返回值类型即可,较为简单,不过也存在弊端。
版权归原作者 大三的土狗 所有, 如有侵权,请联系我们删除。