目录
[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>
依赖导入思路
- 创建父工程模块打包方式为 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 数据库和表并插入数据
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,达到远程调用效果!