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,达到远程调用效果!

相关推荐
hummhumm15 分钟前
第 10 章 - Go语言字符串操作
java·后端·python·sql·算法·golang·database
Kika写代码40 分钟前
【基于轻量型架构的WEB开发】课程 13.2.4 拦截器 Java EE企业级应用开发教程 Spring+SpringMVC+MyBatis
spring·架构·java-ee
man20172 小时前
【2024最新】基于springboot+vue的闲一品交易平台lw+ppt
vue.js·spring boot·后端
hlsd#2 小时前
关于 SpringBoot 时间处理的总结
java·spring boot·后端
路在脚下@2 小时前
Spring Boot 的核心原理和工作机制
java·spring boot·后端
幸运小圣3 小时前
Vue3 -- 项目配置之stylelint【企业级项目配置保姆级教程3】
开发语言·后端·rust
前端SkyRain4 小时前
后端Node学习项目-用户管理-增删改查
后端·学习·node.js
提笔惊蚂蚁4 小时前
结构化(经典)软件开发方法: 需求分析阶段+设计阶段
后端·学习·需求分析
老猿讲编程4 小时前
Rust编写的贪吃蛇小游戏源代码解读
开发语言·后端·rust
黄小耶@4 小时前
python如何使用Rabbitmq
分布式·后端·python·rabbitmq