SpringCloud篇(服务拆分 / 远程调用 - 入门案例)

目录

一、服务拆分原则

二、服务拆分示例

[1. 案例需求](#1. 案例需求)

[2. 案例要求](#2. 案例要求)

[3. 导入SQL语句](#3. 导入SQL语句)

[4. 实现思路](#4. 实现思路)

[4.1. 创建父工程 cloud-demo 管理依赖](#4.1. 创建父工程 cloud-demo 管理依赖)

依赖导入思路

[4.2. 创建子工程 order-servic](#4.2. 创建子工程 order-servic)

[4.3. 创建子工程 user-servic](#4.3. 创建子工程 user-servic)

[4.4. 创建 cloud_order 数据库和表并插入数据](#4.4. 创建 cloud_order 数据库和表并插入数据)

[4.5. 创建 cloud_user 数据库和表并插入数据](#4.5. 创建 cloud_user 数据库和表并插入数据)

[4.6. 子工程 order-service 的构建目录](#4.6. 子工程 order-service 的构建目录)

[4.7. 子工程 user-service 的构建目录](#4.7. 子工程 user-service 的构建目录)

[4.8. 调出并将启动类显示在Services中](#4.8. 调出并将启动类显示在Services中)

[4.9. 配置下项目使用的JDK](#4.9. 配置下项目使用的JDK)

三、服务远程调用案例

[1. 订单服务](#1. 订单服务)

[2. 用户服务](#2. 用户服务)

[3. 案例需求](#3. 案例需求)

[4. 注册RestTemplate](#4. 注册RestTemplate)

[5. 实现远程调用](#5. 实现远程调用)

[6. 重启服务测试](#6. 重启服务测试)


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

一、服务拆分原则

  • 不同微服务,不要重复开发相同业务
  • 微服务数据独立,不要访问其它微服务的数据库
  • 微服务可以将自己的业务暴露为接口,供其它微服务调用

二、服务拆分示例

1. 案例需求

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

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

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

2. 案例要求

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

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

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

3. 导入SQL语句

资料中的 cloud-order、cloud-user

4. 实现思路

4.1. 创建父工程 cloud-demo 管理依赖

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.cloud</groupId>
    <artifactId>d1_cloud-demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <packaging>pom</packaging>
    
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR10</spring-cloud.version>
        <mysql.version>5.1.47</mysql.version>
        <mybatis.version>2.1.1</mybatis.version>
    </properties>


    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.9.RELEASE</version>
        <relativePath/>
    </parent>

    <dependencyManagement>
        <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>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

</project>
依赖导入思路
  1. 创建父工程模块打包方式为 pom 的原因:

用在父级工程或聚合工程中,用来做 jar 包的版本控制,必须指明这个聚合工程的打包方式为 pom

父类打成 pom 包的意义在于:父工程不写代码,代码都在子工程里写,只在父类工程里写 pom.xml 里写 jar 的

版本,控制子工程所需依赖的版本

  1. 自定义属性在 properties 节点下进行声明依赖版本号,管理版本号。

  2. SpringCloud 底层是依赖于 SpringBoot 的,并且有版本的兼容关系,由于本人使用的是 Hoxton.SR10

从而本人选择的是稳定 SpringBoot 发布版本 2.3.9.RELEASE

4.2. 创建子工程 order-servic

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <parent>
        <artifactId>d1_cloud-demo</artifactId>
        <groupId>com.cloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    
    <modelVersion>4.0.0</modelVersion>

    <artifactId>order-service</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--mybatis-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

4.3. 创建子工程 user-servic

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>d1_cloud-demo</artifactId>
        <groupId>com.cloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>user-service</artifactId>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--mybatis-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

4.4. 创建 cloud_order 数据库和表并插入数据

4.5. 创建 cloud_user 数据库和表并插入数据

4.6. 子工程 order-service 的构建目录

4.7. 子工程 user-service 的构建目录

4.8. 调出并将启动类显示在Services中

4.9. 配置下项目使用的JDK

三、服务远程调用案例

1. 订单服务

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

根据id查询订单,返回值是Order对象,其中的user为null

访问地址:http://localhost:8080/order/101

结果:

2. 用户服务

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

访问地址:http://localhost:8081/user/1

结果:

3. 案例需求

修改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对象,一起返回

4. 注册RestTemplate

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

复制代码
package com.cloud.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("com.cloud.order.mapper")
@SpringBootApplication
public class OrderApplication {

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

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

}

5. 实现远程调用

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

6. 重启服务测试

重启服务测试,发现user不再为null,达到远程调用效果!

相关推荐
二闹7 分钟前
三个注解,到底该用哪一个?别再傻傻分不清了!
后端
用户490558160812519 分钟前
当控制面更新一条 ACL 规则时,如何更新给数据面
后端
林太白20 分钟前
Nuxt.js搭建一个官网如何简单
前端·javascript·后端
码事漫谈22 分钟前
VS Code 终端完全指南
后端
该用户已不存在1 小时前
OpenJDK、Temurin、GraalVM...到底该装哪个?
java·后端
怀刃1 小时前
内存监控对应解决方案
后端
码事漫谈1 小时前
VS Code Copilot 内联聊天与提示词技巧指南
后端
Moonbit2 小时前
MoonBit Perals Vol.06: MoonBit 与 LLVM 共舞 (上):编译前端实现
后端·算法·编程语言
Moonbit2 小时前
MoonBit Perals Vol.06: MoonBit 与 LLVM 共舞(下):llvm IR 代码生成
后端·程序员·代码规范
Moonbit2 小时前
MoonBit Pearls Vol.05: 函数式里的依赖注入:Reader Monad
后端·rust·编程语言