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

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

一、服务拆分原则

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

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

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

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

二、服务拆分示例

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

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

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

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

要求:

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

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

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

2.1 导入Sql语句

首先,将资料提供的cloud-order.sql和cloud-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方法:

相关推荐
2601_962219016 小时前
操作日志全留存架构:万象生鲜系统生鲜业务合规审计底层实现方案
微服务·云原生·架构
Thomas.Sir6 小时前
第6课:Nacos核心原理 & 2025版适配SpringCloud环境搭建
spring cloud·微服务
海宇AI7 小时前
零信任架构实战:基于海宇学历核验版构建自动化高并发资信评估网关
人工智能·微服务·架构·自动化
EatFan8 小时前
Spring Boot 4 升级避坑指南:依赖变化、Undertow 弃用、4.0.5 补丁与 Java 25 虚拟线程落地
java·spring boot·微服务·虚拟线程·spring boot 4
无序的浪20 小时前
测试博客-基于微服务的在线判题系统
java·spring cloud·docker·微服务·测试·在线判题
天远Date Lab1 天前
微服务架构实战:基于天远学历信息高级版构建自动化人才准入网关
人工智能·微服务·架构·自动化
troy1281 天前
Java 技术栈全景指南:从基础到微服务的完整知识体系
java·开发语言·微服务
阿狗童鞋1 天前
SpringBoot微服务实战指南
spring boot·后端·微服务
今年下半年1 天前
记录一次IBMS物联网项目的架构设计及技术栈应用
物联网·websocket·网络协议·tcp/ip·微服务·udp·kafka
ChaITSimpleLove7 天前
云原生性能对决:JDK21虚拟线程+GraalVM vs .NET10/11 技术栈深度对比
微服务·云原生·serverless·graalvm native·native aot·runtime async·.net11/java21