微服务-服务拆分和远程调用

任何分布式架构都离不开服务的拆分,微服务也是一样。

一、服务拆分原则

微服务拆分时的几个原则:

  • 不同微服务,不要重复开发相同业务

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

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

二、服务拆分示例

以微服务cloud-demo为例,其结构如下:

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

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

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

要求:

  • 订单微服务和用户微服务都必须有各自的数据库,相互独立

  • 订单服务和用户服务都对外暴露Restful的接口

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

2.1 导入Sql语句

首先,将资料提供的cloud-order.sqlcloud-user.sql导入到mysql中:

cloud-user表中初始数据如下:

cloud-order表中初始数据如下:

cloud-order表中持有cloud-user表中的id字段。

2.2 导入demo工程

用IDEA导入资料提供的Demo:

项目结构如下:

导入后,会在IDEA右下角出现弹窗:

点击弹窗,然后按下图选择:

会出现这样的菜单:

配置下项目使用的JDK:

三、实现远程调用案例

在order-service服务中,有一个根据id查询订单的接口:

根据id查询订单,返回值是Order对象,如图:

其中的user为null

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

查询的结果如图:

3.1 案例需求:

修改order-service中的根据id查询订单业务,要求在查询订单的同时,根据订单中包含的userId查询出用户信息,一起返回。

因此,我们需要在order-service中 向user-service发起一个http的请求,调用http://localhost:8081/user/{userId}这个接口。

大概的步骤是这样的:

  • 注册一个RestTemplate的实例到Spring容器

  • 修改order-service服务中的OrderService类中的queryOrderById方法,根据Order对象中的userId查询User

  • 将查询的User填充到Order对象,一起返回

3.2 注册RestTemplate

首先,我们在order-service服务中的OrderApplication启动类中,注册RestTemplate实例:


在Spring Boot中,RestTemplate是一个常用的类,用于发送HTTP请求和接收响应。它是Spring框架的一部分,提供了简单而强大的RESTful Web服务客户端。

RestTemplate的主要功能包括:

  1. 发送HTTP请求:RestTemplate提供了多种HTTP方法,如GET、POST、PUT、DELETE等,可以轻松地发送请求到指定的URL。
  2. 解析响应:RestTemplate可以将HTTP响应中的数据解析为Java对象,使得数据交互更加方便。
  3. 设置请求参数:可以通过RestTemplate设置请求参数,如查询参数、请求头等,以定制化请求。
  4. 异常处理:当请求失败时,RestTemplate会抛出异常,可以通过捕获这些异常来进行异常处理。

在Spring Boot中,RestTemplate的使用通常通过注入的方式将其注入到需要使用它的类中,然后调用相应的方法发送HTTP请求。需要注意的是,随着Spring Framework的不断更新,RestTemplate可能会被其他更现代的类或库所取代。尽管如此,对于许多现有的Spring Boot项目来说,RestTemplate仍然是一个非常有用的工具。


复制代码
package cn.itcast.order;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

3.3 实现远程调用

修改order-service服务中的cn.itcast.order.service包下的OrderService类中的queryOrderById方法:

相关推荐
小安运维日记5 小时前
CKS认证 | Day4 最小化微服务漏洞
安全·docker·微服务·云原生·容器·kubernetes
Code季风7 小时前
将 gRPC 服务注册到 Consul:从配置到服务发现的完整实践(上)
数据库·微服务·go·json·服务发现·consul
Code季风11 小时前
微服务分布式配置中心:Gin Web 服务层与 gRPC 服务层集成 Nacos 实战
分布式·微服务·rpc·架构·go·gin·consul
步、步、为营13 小时前
.net微服务框架dapr保存和获取状态
微服务·架构·.net
guojl16 小时前
微服务OpenFeign源码分析
spring cloud·微服务
guojl16 小时前
微服务OpenFeign使用手册
spring cloud·微服务
Code季风2 天前
Gin Web 层集成 Viper 配置文件和 Zap 日志文件指南(下)
前端·微服务·架构·go·gin
Code季风2 天前
Gin Web 服务集成 Consul:从服务注册到服务发现实践指南(下)
java·前端·微服务·架构·go·gin·consul
掘金-我是哪吒2 天前
分布式微服务系统架构第156集:JavaPlus技术文档平台日更-Java线程池使用指南
java·分布式·微服务·云原生·架构