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

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

一、服务拆分原则

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

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

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

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

二、服务拆分示例

以微服务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方法:

 

相关推荐

  1. 一、初始项目服务远程调用

    2024-01-20 07:14:04       16 阅读
  2. 服务架构服务原则

    2024-01-20 07:14:04       19 阅读
  3. 服务规范原则

    2024-01-20 07:14:04       31 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-20 07:14:04       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-20 07:14:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-20 07:14:04       20 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-20 07:14:04       20 阅读

热门阅读

  1. Webpack5入门到原理14:生产模式介绍

    2024-01-20 07:14:04       32 阅读
  2. 【机器学习】TensorFlowLite安装和模型训练

    2024-01-20 07:14:04       40 阅读
  3. Cryptography and Coding Theory

    2024-01-20 07:14:04       29 阅读
  4. 【设计模式 创建型】单例模式

    2024-01-20 07:14:04       35 阅读
  5. python获取线程名称和传递参数,数据共享

    2024-01-20 07:14:04       32 阅读
  6. npm install 太慢?解决方法

    2024-01-20 07:14:04       33 阅读
  7. React与Vue:前端框架的比较

    2024-01-20 07:14:04       35 阅读
  8. React16源码: React中的reconcileChildren的源码实现

    2024-01-20 07:14:04       27 阅读
  9. 每日coding

    2024-01-20 07:14:04       31 阅读
  10. spark的jdbc接口,类似于hiveserver2

    2024-01-20 07:14:04       33 阅读