作者为冰河忠实粉丝,可以加入【冰河技术】知识星球获取源码,也可以关注【冰河技术】公众号,加入社群学习,学习氛围好,干货满满。
1 项目流程设计
整个项目主要分为用户服务、商品服务和订单服务,整个过程模拟的是用户下单扣减库存的操作。这里,为了简化整个流程,将商品的库存信息保存到了商品数据表,同时,使用商品微服务来扣减库存。各服务之间的调用流程如下。
整体流程为:用户通过客户端调用订单微服务的提交订单的接口后,订单微服务会分别调用用户服务和商品服务的接口来查询用户信息和商品信息,并校验商品库存是否充足,如果商品库存充足的话,就会保存订单。并且会调用商品服务的扣减库存的接口来扣减库存。
2 技术选型
整个项目采用SpringCloud Alibaba技术栈实现,主要的技术选型如下所示。
- 持久层框架:MyBatis、MyBatis-Plus
- 微服务框架:SpringCloud Alibaba
- 消息中间件:RocketMQ
- 服务治理与服务配置:Nacos
- 负载均衡组件:Ribbon
- 远程服务调用:Fegin
- 服务限流与容错:Sentinel
- 服务网关:SpringCloud-Gateway
- 服务链路追踪:Sleuth+ZipKin
- 分布式事务:Seata
- 数据存储:MySQL+ElasticSearch
3 项目总体结构
为了方便开发和维护,同时为了模块的复用性,整体项目在搭建时,会将实体类模块、公共模块、用户服务、商品服务和订单服务放在同一个Maven父工程下,作为父工程的子模块。
其中各模块说明:
- shop-springcloud-alibaba-mawenda:Maven父工程
- shop-common:公共模块
- shop-bean:各服务通用Bean模块,包含实体类、Dto、Vo等
- shop-order:订单服务 8060
- shop-product:商品服务 8070
- shop-user:用户服务 8080
4 项目搭建
4.1 创建Maven父工程
在IDEA中创建Maven工程,名称为shop-springcloud-alibaba-xx,创建后在项目的pom.xml文件中添加StringBoot与SpringCloud alibaba相关的配置,如下所示。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<modules>
<module>shop-common</module>
<module>shop-bean</module>
<module>shop-user</module>
<module>shop-product</module>
<module>shop-order</module>
</modules>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring-cloud.version>Greenwich.RELEASE</spring-cloud.version>
<spring-cloud-alibaba.version>2.1.0.RELEASE</spring-cloud-alibaba.version>
<logback.version>1.1.7</logback.version>
<slf4j.version>1.7.21</slf4j.version>
<common.logging>1.2</common.logging>
<fastjson.version>1.2.51</fastjson.version>
<mybatis.version>3.4.6</mybatis.version>
<mybatis.plus.version>3.4.1</mybatis.plus.version>
<mysql.jdbc.version>8.0.19</mysql.jdbc.version>
<druid.version>1.1.10</druid.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</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>
4.2 创建子模块
搭建的具体细节可以查看冰河技术 环境搭建专栏,完成数据库建表,公共模块、实体类模块、用户模块、产品模块、订单模块的搭建。
4.3 搭建完成
我最终的搭建效果如下:
4.4 测试接口
分别启动用户服务、产品服务、订单服务,然后通过api测试工具进行测试。
4.4.1 请求用户服务获取用户信息
4.4.2 请求产品服务获取产品信息
4.4.3 请求订单服务创建订单
- 库存充足的情况下,请求成功
- 库存不足的情况下,返回失败信息
5 总结
我的理解大白话就是:
- 在一个父Maven工程下创建了多个服务模块,将公共部分提取出来,增加代码的复用性
- 根据不同的业务进行拆分,各服务模块通过定义声明Restful接口进行交互,降低了各业务的耦合度,开发时一个项目也不局限在一种开发语言,增加了灵活性,后面部署也不会因为局部的更改使整个项目都重新部署。
6 硬编码问题
当前用户服务和商品服务所在的IP地址和端口号硬编码到了订单服务中,会存在三个很明显的问题。
- 用户服务和产品服务的IP地址或端口发生变化,订单服务会变得不可用,需要同步修改请求用户服务、产品服务的IP与端口。
- 如果系统中提供了多个用户服务和产品服务,则无法实现微服务的负载均衡功能。
- 当系统需要支持更高的并发,需要部署更多的服务,系统会变得更复杂。
所以,微服务开发的过程中,需要引入服务治理功能,实现微服务之间的动态注册与发现。