目录
1. 案例准备
1.1 技术选型
maven:3.3.X
数据库RDS:MySQL 8.0
持久层:Mybatis-Plus
其他:SpringCloudAlibaba技术栈
1.2 模块设计
springcloud-alibaba 父工程
magic-common 基础服务模块【工具类】
magic-repository 底层数据服务【实体类+Mapper】
magic-user 用户微服务 【端口: 807x】
magic-conmmodity 商品微服务 【端口: 808x】
magic-order 订单微服务 【端口: 809x】
1.3 微服务调用
在微服务架构中,最常见的就是服务间的相互调用。我们以电商为例,常见的流程用户下单操作:客户向订单微服务发起一个下单请求,在写入订单信息之前需要调用商品微服务检索商品信息。
我们一般把服务主动调用方称之为服务消费者,被调用方称之为服务提供者
2 创建父工程
创建一个maven工程,然后再pom配置文件中添加以下内容
<?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>org.magic.java</groupId>
<artifactId>magic-study</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>magic-repository</module>
</modules>
<properties>
<!-- Lombok -->
<lombok.version>1.18.2</lombok.version>
<!-- jdk -->
<java.version>1.8</java.version>
<!-- 编码 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!-- spring-cloud 版本 -->
<spring-cloud.version>Greenwich.RELEASE</spring-cloud.version>
<!-- spring-cloud-alibaba 版本 -->
<spring-cloud-alibaba.version>2.2.6.RELEASE</spring-cloud-alibaba.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.2</version>
<relativePath/>
</parent>
<dependencyManagement>
<dependencies>
<!--Lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
3.创建底层数据服务
3.1 创建magic-repository服务
pom文件添加一下内容
<?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>magic-study</artifactId>
<groupId>org.magic.java</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<!-- 底层数据服务-->
<artifactId>magic-repository</artifactId>
<properties>
<!-- Mybatis-Plus 版本号-->
<mybatis-plus.version>3.4.2</mybatis-plus.version>
</properties>
<dependencies>
<!--jackson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.2</version>
<scope>compile</scope>
</dependency>
<!--Lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<!-- Mybatis-Plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
</dependencies>
</project>
3.2 创建实体类
package com.java.magic.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.time.LocalDateTime;
/**
* @ClassName User
* @Description 用户实体类
* @Author Magic
* @Date 2022/1/6 3:49 下午
* @Version V1.0.1
*/
@Data
public class User {
/**
* id 主键自增
*/
@TableId(value = "id",type = IdType.AUTO)
private Long id;
/**
* 用户名称
*/
private String userName;
/**
* 用户账号
*/
private String userAccount;
/**
* 用户手机号
*/
private String userPhone;
/**
* 操作人账号
*/
private String createBy;
/**
* 操作时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime createTime;
/**
* 状态 开启(ENABLE)/关闭(DISABLE)
*/
private CommontState state;
}
package com.java.magic.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.time.LocalDateTime;
/**
* @ClassName Commodity
* @Description 商品信息
* @Author Magic
* @Date 2022/1/6 3:58 下午
* @Version V1.0.1
*/
@Data
public class Commodity {
/**
* id 主键自增
*/
@TableId(value = "id",type = IdType.AUTO)
private Long id;
/**
* 商品名称
*/
private String name;
/**
* 商品价格
*/
private Double price;
/**
* 库存
*/
private Integer tock;
/**
* 创建人id
*/
private String createBy;
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime createTime;
/**
* 状态 开启(ENABLE)/关闭(DISABLE)
*/
private CommontState state;
}
package com.java.magic.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.time.LocalDateTime;
/**
* @ClassName Oder
* @Description 订单实体类
* @Author Magic
* @Date 2022/1/6 4:01 下午
* @Version V1.0.1
*/
@Data
public class Oder {
/**
* 主键id 订单id
*/
private Long id;
/**
* 用户id
*/
private Integer userId;
/**
* 商品id
*/
private Integer commodityId;
/**
* 商品数量
*/
private Integer number;
/**
* 创建人id
*/
private String createBy;
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime createTime;
/**
* 状态 开启(ENABLE)/关闭(DISABLE)
*/
private CommontState state;
}
3.3 创建 Mapper
package com.java.magic.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.java.magic.entity.User;
import org.apache.ibatis.annotations.Mapper;
/**
* @ClassName UserMapper
* @Description 用户Mapper
* @Author Magic
* @Date 2022/1/6 3:57 下午
* @Version V1.0.1
*/
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
package com.java.magic.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.java.magic.entity.Oder;
import org.apache.ibatis.annotations.Mapper;
/**
* @ClassName OderMapper
* @Description 订单Mapper
* @Author Magic
* @Date 2022/1/6 4:07 下午
* @Version V1.0.1
*/
@Mapper
public interface OderMapper extends BaseMapper<Oder> {
}
package com.java.magic.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.java.magic.entity.Commodity;
import org.apache.ibatis.annotations.Mapper;
/**
* @ClassName CommodityMapper
* @Description CommodityMapper
* @Author Magic
* @Date 2022/1/6 4:00 下午
* @Version V1.0.1
*/
@Mapper
public interface CommodityMapper extends BaseMapper<Commodity> {
}
4. 创建用户微服务
4.1创建magic-user项目
pom配置文件添加以下内容
<?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>magic-study</artifactId>
<groupId>org.magic.java</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<!--用户微服务magic-user-->
<artifactId>magic-user</artifactId>
<dependencies>
<!--spring-boot包依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--底层数据服务-->
<dependency>
<groupId>org.magic.java</groupId>
<artifactId>magic-repository</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<!--druid链接-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.24</version>
</dependency>
<!--mysql版本-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
</project>
4.2 创建主启动类
package com.java.magic;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @ClassName UserApplication
* @Description 启动类
* @Author Magic
* @Date 2022/1/6 4:22 下午
* @Version V1.0.1
*/
@SpringBootApplication
@MapperScan("com.java.magic.mapper")
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class, args);
System.out.println("项目启动成功SUCCESS!!!!!!!!!!!");
}
}
4.3 创建配置文件
# 文件名称 application.yml 区分环境配置
server:
port: 8071
spring:
profiles:
active: dev
# application-dev.yml 本机测试环境
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/magic?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false
username: magic
password: Magic@2020&*&
druid:
initial-size: 5
min-idle: 5
max-active: 20
max-wait: 60000
max-pool-prepared-statement-per-connection-size: 20
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 300000
pool-prepared-statements: true
#druid登录权限配置
druid-monitor:
name: admin
password: Magic@Adim@2021
5. 创建订单微服务和商品微服务
6.实际代码运行测试
6.1 运行截图
6.2 下载链接
只针对该章节内容进行打包,下载后变更数据库连接即可,如果mysql版本不一致,还需改下依赖包和配置文件
https://jm-cyzy.oss-cn-beijing.aliyuncs.com/magic/magic/magic-study%E7%AC%AC%E5%9B%9B%E7%AB%A0.zip
7.建表语句
/*
Navicat Premium Data Transfer
Source Server : 服务家8.0
Source Server Type : MySQL
Source Server Version : 80018
Source Host : rm-2zez56ib0b6d1l50hxo.mysql.rds.aliyuncs.com:3306
Source Schema : magic
Target Server Type : MySQL
Target Server Version : 80018
File Encoding : 65001
Date: 06/01/2022 17:52:53
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for commodity
-- ----------------------------
DROP TABLE IF EXISTS `commodity`;
CREATE TABLE `commodity` (
`id` bigint(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '商品名称',
`price` double(10,2) DEFAULT NULL COMMENT '商品价格',
`tock` int(11) DEFAULT NULL COMMENT '库存',
`create_by` int(11) DEFAULT NULL COMMENT '创建人id',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`state` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'ENABLE' COMMENT '状态 开启(ENABLE)/关闭(DISABLE)',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- ----------------------------
-- Table structure for oder
-- ----------------------------
DROP TABLE IF EXISTS `oder`;
CREATE TABLE `oder` (
`id` bigint(11) NOT NULL COMMENT '主键id 订单id',
`user_id` int(11) DEFAULT NULL COMMENT '用户ID',
`commodity_id` int(11) DEFAULT NULL COMMENT '商品id',
`number` int(11) DEFAULT NULL COMMENT '订单商品数量',
`create_by` int(11) DEFAULT NULL COMMENT '创建人id',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`state` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT 'ENABLE' COMMENT '状态 开启(ENABLE)/关闭(DISABLE)',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '主键id',
`user_name` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '用户姓名',
`user_account` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '用户账号',
`user_phone` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '用户手机号',
`create_by` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '操作人账号',
`createTime` datetime DEFAULT NULL COMMENT '操作时间',
`state` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'ENABLE' COMMENT '状态开启(ENABLE)/关闭(DISABLE)',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
SET FOREIGN_KEY_CHECKS = 1;