目录
[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 为例,其结构如下:
![](https://img-blog.csdnimg.cn/img_convert/681cbef18970b2cf184d6c204b7af7aa.png)
cloud-demo:父工程,管理依赖
- order-service:订单微服务,负责订单相关业务
- user-service:用户微服务,负责用户相关业务
2. 案例要求
订单微服务和用户微服务都必须有各自的数据库,相互独立
订单服务和用户服务都对外暴露 Restful 的接口
订单服务如果需要查询用户信息,只能调用用户服务的 Restful 接口,不能查询用户数据库
3. 导入SQL语句
资料中的 cloud-order、cloud-user
![](https://img-blog.csdnimg.cn/img_convert/10334a631f4160a09bc6e433c4696b5f.png)
4. 实现思路
4.1. 创建父工程 cloud-demo 管理依赖
![](https://img-blog.csdnimg.cn/img_convert/d188b23238eaa9929068155195631dbe.png)
<?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>
依赖导入思路
- 创建父工程模块打包方式为 pom 的原因:
用在父级工程或聚合工程中,用来做 jar 包的版本控制,必须指明这个聚合工程的打包方式为 pom
父类打成 pom 包的意义在于:父工程不写代码,代码都在子工程里写,只在父类工程里写 pom.xml 里写 jar 的
版本,控制子工程所需依赖的版本
-
自定义属性在 properties 节点下进行声明依赖版本号,管理版本号。
-
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 数据库和表并插入数据
![](https://img-blog.csdnimg.cn/img_convert/f664b2fd033f39cbdf5174c6aa95019f.png)
4.5. 创建 cloud_user 数据库和表并插入数据
![](https://img-blog.csdnimg.cn/img_convert/0c1f34e0aedce69c4e0e0df8674fa4f2.png)
![](https://img-home.csdnimg.cn/images/20230724024159.png)
![](https://img-blog.csdnimg.cn/img_convert/1fc8173203b2e1061e45825f558767a9.png)
4.6. 子工程 order-service 的构建目录
![](https://img-blog.csdnimg.cn/img_convert/18d4db64a11cbb073033d93db9e79f37.png)
4.7. 子工程 user-service 的构建目录
![](https://img-blog.csdnimg.cn/img_convert/7e392750e1c185b3e820e59d4e801962.png)
4.8. 调出并将启动类显示在Services中
![](https://img-blog.csdnimg.cn/img_convert/83261fd41ddd357c45aa6fa48390c07e.png)
![](https://img-blog.csdnimg.cn/img_convert/d42e8b5be701f1329a2727ee3295a9c6.png)
![](https://img-blog.csdnimg.cn/img_convert/8bc8178403209d87b7557d0bf012f722.png)
4.9. 配置下项目使用的JDK
![](https://img-blog.csdnimg.cn/img_convert/dbb25fd46b73cc6130da22117c23d8e0.png)
三、服务远程调用案例
1. 订单服务
在order-service服务中,有一个根据 id 查询订单的接口:
![](https://img-blog.csdnimg.cn/img_convert/f064bcb94a949a18eb1cb28004f3b380.png)
根据id查询订单,返回值是Order对象,其中的user为null
访问地址:http://localhost:8080/order/101
结果:
![](https://img-blog.csdnimg.cn/img_convert/ad610a5100a065b97db8e2d141ca9cf7.png)
2. 用户服务
在user-service中有一个根据id查询用户的接口:
![](https://img-blog.csdnimg.cn/img_convert/e1bc19600c306e8e4876155a7ab0531c.png)
访问地址:http://localhost:8081/user/1
结果:
![](https://img-blog.csdnimg.cn/img_convert/80e318207ab6de349db7557081981ac4.png)
3. 案例需求
修改order-service中的根据id查询订单业务,要求在查询订单的同时,根据订单中包含的userId查询出用户信
息,一起返回!
![](https://img-blog.csdnimg.cn/img_convert/33c57bb8cebcd9f792a2862421d8635d.png)
因此,我们需要在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方法:
![](https://img-blog.csdnimg.cn/img_convert/44fc29c38e39e854f5c12cc6b1b283ff.png)
6. 重启服务测试
重启服务测试,发现user不再为null,达到远程调用效果!
![](https://img-blog.csdnimg.cn/img_convert/dc08187a12bede5b38a2df81d83007fd.png)