说明
从本篇文章开始学习微服务的知识
本次文章主要来自于这里
系统架构演变 从互联网兴起到现在,系统架构大致经历了以下几个过程:
单体应用架构
垂直应用架构
分布式应用架构
SOA架构
微服务架构
Service Mesh(服务网格化)
无服务化
案例准备 电商系统:搭建用户微服务,商品微服务,订单微服务
技术选型 maven:3.5+
数据库:mysql 5.7
持久层:MybatisPlus
其他:Spring Cloud Alibaba
模块设计 父工程:shop-parent
用户微服务:shop-user
商品微服务:shop-goods
订单微服务: shop-order
公共服务: shop-common
应用服务:shop-app
下单场景 用户下单,会涉及到用户微服务,商品微服务,订单微服务
搭建工程 创建父工程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 <?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.example</groupId> <artifactId>shop-parent</artifactId> <version>1.0-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.5.RELEASE</version> <relativePath/> </parent> <packaging>pom</packaging> <properties> <!-- Spring Cloud --> <spring.cloud.version>Hoxton.SR9</spring.cloud.version> <!-- Apache Dubbo --> <dubbo.version>2.7.8</dubbo.version> <curator.version>4.0.1</curator.version> <!-- Apache RocketMQ --> <rocketmq.starter.version>2.0.2</rocketmq.starter.version> <spring.cloud.alibaba>2.2.5.RELEASE</spring.cloud.alibaba> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>${spring.cloud.alibaba}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring.cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> </project>
<parent>
元素用于继承父级项目的默认配置和依赖管理,而 <dependencyManagement>
元素用于集中管理项目的依赖版本,确保团队中所有成员使用相同的依赖版本。这些元素的使用可以提高项目的组织性、可维护性和一致性。
创建shop-common模块
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 <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> <parent> <groupId>org.example</groupId> <artifactId>shop-parent</artifactId> <version>1.0-SNAPSHOT</version> </parent> <artifactId>shop-common</artifactId> <dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> </dependencies> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> </project>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 package xyz.shi.shop.common; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class Result<T> { private boolean success; private int code; private String msg; private T data; public static <T> Result<T> success(T data) { return new Result<>(true,200,"success",data); } public static <T> Result<T> fail(int code, String msg) { return new Result<>( true,code,msg,null); } }
创建用户微服务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 <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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.example</groupId> <artifactId>shop-parent</artifactId> <version>1.0-SNAPSHOT</version> </parent> <artifactId>shop_user</artifactId> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.example</groupId> <artifactId>shop-common</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.3</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> </project>
注意这里依赖了shop-common 模块
1 2 3 4 5 6 7 8 9 10 11 12 13 14 package xyz.shi.shop.user; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class UserApp { public static void main(String[] args) { SpringApplication.run(UserApp.class,args); } }
配置文件,src-resources-application.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 spring: application: name: shop-user datasource: password: root username: root driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/shop?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC server: port: 8001 mybatis-plus: global-config: db-config: table-prefix: shop_
shop_user表,在shop数据库中手动创建user表
1 2 3 4 5 6 7 8 CREATE TABLE `shop`.`shop_user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `username` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `password` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `telephone` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `account` decimal(10, 2) NOT NULL COMMENT '账户', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_unicode_ci ROW_FORMAT = Dynamic;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 package xyz.shi.shop.user.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.math.BigDecimal; @Data @AllArgsConstructor @NoArgsConstructor public class User { //分布式id @TableId(type = IdType.ASSIGN_ID) private Long id; private String username; private String password; private String telephone; private BigDecimal account; }
创建商品微服务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 <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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.example</groupId> <artifactId>shop-parent</artifactId> <version>1.0-SNAPSHOT</version> </parent> <artifactId>shop-goods</artifactId> <!-- <packaging>war</packaging>--> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.example</groupId> <artifactId>shop-common</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.3</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> </project>
注意这里依赖了shop-common 模块
1 2 3 4 5 6 7 8 9 10 11 12 13 package xyz.shi.shop.goods; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class GoodsApp { public static void main(String[] args) { SpringApplication.run(GoodsApp.class); } }
配置文件 src-resources-application.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 spring: application: name: shop-goods datasource: password: root username: 123456 driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/shop?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC server: port: 8002 mybatis-plus: global-config: db-config: table-prefix: shop_
1 2 3 4 5 6 7 8 CREATE TABLE `shop`.`shop_goods` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `goods_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '商品名称', `goods_price` decimal(10, 2) NOT NULL COMMENT '商品价格', `goods_stock` int(10) NOT NULL COMMENT '商品库存', `create_time` bigint(20) NOT NULL COMMENT '创建时间', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_unicode_ci ROW_FORMAT = Dynamic;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 package xyz.shi.shop.goods.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; import java.math.BigDecimal; @Data public class Goods { @TableId(type = IdType.ASSIGN_ID) private Long id; private String goodsName; private BigDecimal goodsPrice; private Integer goodsStock; private Long createTime; }
创建订单微服
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 <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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.example</groupId> <artifactId>shop-parent</artifactId> <version>1.0-SNAPSHOT</version> </parent> <artifactId>shop-order</artifactId> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.example</groupId> <artifactId>shop-common</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.3</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> </project>
1 2 3 4 5 6 7 8 9 10 11 12 package xyz.shi.shop.order; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class OrderApp { public static void main(String[] args) { SpringApplication.run(OrderApp.class,args); } }
配置文件 sr-resources-application.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 spring: application: name: shop-order datasource: password: root username: root driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/shop?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC server: port: 8003 mybatis-plus: global-config: db-config: table-prefix: shop_
1 2 3 4 5 6 7 8 9 10 11 12 CREATE TABLE `shop`.`shop_order` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `order_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `user_id` bigint(20) NOT NULL, `goods_id` bigint(20) NOT NULL, `order_price` decimal(10, 2) NOT NULL, `order_status` tinyint(4) NOT NULL, `pay_status` tinyint(4) NOT NULL, `pay_time` bigint(20) NOT NULL, `create_time` bigint(20) NOT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_unicode_ci ROW_FORMAT = Dynamic;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 package xyz.shi.shop.order.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; import java.math.BigDecimal; @Data public class Order { @TableId(type = IdType.ASSIGN_ID) private Long id; private String orderId; private Long userId; private Long goodsId; private BigDecimal orderPrice; private Integer orderStatus; private Integer payStatus; private Long payTime; private Long createTime; }
总结