# springcloud_alibaba **Repository Path**: xiyg_admin/springcloud_alibaba ## Basic Information - **Project Name**: springcloud_alibaba - **Description**: 选择了比较熟悉的电商项目中的用户、商品和订单模块为例,因为这些模块的核心逻辑比较简单,并且真实的电商项目一般都采用分布式或微服务的架构模式,并且都会承载高并发大流量的场景。同时,涉及到分布式或微服务的场景时,一般又会产生分布式事务的问题。 所以以电商系统中的用户、商品和订单模块为例,学习SpringCloud Alibaba。 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-03-17 - **Last Updated**: 2024-03-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: nacos, SpringCloud, sentinel, fegin, Ribbon ## README # springcloud_alibaba #### 在案例上,选择了比较熟悉的电商项目中的用户、商品和订单模块为例,因为这些模块的核心逻辑比较简单,并且真实的电商项目一般都采用分布式或微服务的架构模式,并且都会承载高并发大流量的场景。同时,涉及到分布式或微服务的场景时,一般又会产生分布式事务的问题。 所以以电商系统中的用户、商品和订单模块为例,学习SpringCloud Alibaba。在开发电商系统的过程中,每个阶段会产生不同的需求,而我们在每个阶段针对不同的需求,会使用SpringCloud Alibaba中的对应组件来实现。 例如: ``` - 涉及到服务治理和服务配置的需求时,我们会使用Nacos实现。 - 涉及到负载均衡的需求时,我们会使用Ribbon实现。 - 涉及到远程服务调用的需求时,我们会使用Fegin实现。 - 涉及到服务容错的需求时,我们会使用Sentinel实现。 - 涉及到服务网关的需求时,由于目前SpringCloud Alibaba中并未提供自己的网关,所以,我们使用SpringCloud中的Gateway实现。 - 涉及到链路追踪的需求时,我们会使用Sleuth+ZipKin实现。 - 涉及到消息服务的需求时,我们会使用RocketMQ实现。 - 涉及到分布式事务的需求时,我们会使用Seata实现。 - 涉及到数据存储的需求时,我们会MySQL+ElasticSearch实现。 ``` 2. 微服务介绍 2.1 微服务化后的问题: 一个系统,尤其是大型系统使用微服务架构模式进行搭建和开发时,虽然总体上能够提高研发效率、能够支持更高的并发,也能够提高系统整体的性能和可靠性,以及可维护性。但是在实现细节上还是存在着不少的问题。 ``` - (1)将系统拆分成各个微服务后,如果管理和感知那么多的服务呢? - (2)将系统拆分成各个微服务后,各个微服务之间如何通信? - (3)将系统拆分成各个微服务后,一旦系统出现问题,如何快速定位问题呢? - (4)将系统拆分成各个微服务后,如何最大程度的保证系统的可用性? - (5)将系统拆分成各个微服务后,客户端如何访问那么多的微服务? ``` ![输入图片说明](images/1b6d3adf48de4d158402ab8c1aa64b12.png) #### 软件架构 ![输入图片说明](images/dcbde55b2c9c4d049447425826c226d6.png) 文章目录 - ### 1. 案例驱动 - ### 2. 微服务介绍 - #### 2.1 微服务化后的问题: - #### 2.2 微服务常见概念 - #### 2.3 SpringCloud Alibaba - ### 3. 项目说明 - #### 3.1 项目流程设计 - #### 3.2 技术选型 - #### 3.3 模块划分 - ### 4. 通用模块开发 - #### 4.1 项目总体结构 - #### 4.2 创建Maven父工程 - #### 4.3 创建工具类模块 - ##### 4.3.1 添加项目依赖 - ##### 4.3.2 核心类开发 - #### 4.4 创建实体类模块 - ##### 4.4.1 添加项目依赖 - ##### 4.4.2 核心类开发 - #### 4.5 创建数据表 - ### 5. 搭建三大微服务并完成交互开发与测试 - #### 5.1 项目概述 - ##### 5.1.1 整体交互流程 - ##### 5.1.2 服务规划 - ##### 5.2 用户微服务 - ##### 5.2.1 搭建项目 - ##### 5.2.2 开发持久层 - ##### 5.2.3 开发业务逻辑层 - ##### 5.2.4 开发接口层 - ##### 5.2.5 开发服务启动类 - #### 5.3 商品微服务 - ##### 5.3.1 搭建项目 - ##### 5.3.2 开发持久层 - ##### 5.3.3 开发业务逻辑层 - ##### 5.3.4 开发接口层 - ##### 5.3.5 开发服务启动类 - #### 5.4 订单微服务 - #### 5.4.1 搭建项目 - #### 5.4.2 开发持久层 - #### 开发业务逻辑层 - #### 5.4.4 开发接口层 - #### 5.4.5 开发服务启动类 - #### 5.4.6 开发辅助类 - ### 5.5 测试项目 - #### 5.5.1 添加测试数据 - #### 5.5.2 测试库存不足的情况 - #### 5.5.3 测试正常下单的情况 但在微服务实现过程中的会遇到一些问题: 就是将用户微服务所在的IP和端口,以及商品微服务所在的IP和端口硬编码到订单微服务的代码中了。这样的做法存在着非常多的问题。这就需要用到服务治理,来实现微服务之间的动态注册与发现。相应的就引出了使用Nacos来实现服务的注册与发现功能。可以参考:SpringCloud架构之Nacos配置注册中心。 但是还存在一个很明显的问题,那就是如果用户微服务和商品微服务在服务器上部署多份的话,之前的程序无法实现服务调用的负载均衡功能。这就需要使用Ribbon来实现服务调用的负载均衡功能。可以参考:SpringCloud架构之Ribbon负载均衡。 现在系统中存在着一个很明显的问题,那就是如果系统的并发量上来后,系统并没有容错的能力,这可能会导致系统不可用或者直接宕机,所以,我们的系统需要支持容错的能力。可以参考: ``` 1. Nacos实现服务治理 1.1 硬编码的问题 1.2 服务治理 1.3 注册中心 1.3.1 服务注册与发现 1.3.2 服务配置 1.3.3 服务健康检测 1.3.4 常见的注册中心 1.4 搭建Nacos环境 1.4.1 Nacos环境配置与启动 1.4.2 集成Nacos注册中心 2. Ribbon实现负载均衡 2.1 负载均衡 2.1.1 服务端负载均衡 2.1.2 客户端负载均衡 2.2 启动多服务 2.2.1 启动多个用户微服务 2.2.2 启动多个商品微服务 2.3 实现自定义负载均衡 2.3.1 修改订单微服务代码 2.3.2 测试负载均衡效果 2.4 使用Ribbon实现负载均衡 2.4.1 修改订单微服务代码 2.4.2 测试负载均衡效果 2.5 使用Fegin实现负载均衡 2.5.1 修改订单微服务代码 2.5.2 测试负载均衡效果 3. 服务容错:服务雪崩与容错方案 3.1 并发对系统的影响 3.1.1 压测说明 3.1.2 压测实战 3.2 服务雪崩 3.3 服务容错方案 3.3.1 服务限流 3.3.2 服务隔离 3.3.3 服务超时 3.3.4 服务熔断 3.3.5 服务降级 4. Sentinel实现接口限流 4.1 关于Sentinel 4.1.1 Sentinel的特征 4.1.2 Sentinel的主要特性 4.1.3 Sentinel的开源生态 4.2 项目整合Sentinel 4.2.1 安装Sentinel控制台 4.2.2 项目集成Sentinel 4.2.3 集成Sentinel限流功能 4.2.4 对提交订单的接口限流 4.3 Feign整合Sentinel实现容错 4.3.1 添加依赖并开启支持 4.3.2 为远程调用实现容错 4.3.3 测试服务容错 4.3.4 容错扩展 4.3.5 测试服务容错 ———————————————— ``` ![架构](images/261edafac82a4a5ba9637659890b7ddc.png) - 技术选型 整个项目采用SpringCloud Alibaba技术栈实现,主要的技术选型如下所示。 ``` 持久层框架:MyBatis、MyBatis-Plus 微服务框架:SpringCloud Alibaba 消息中间件:RocketMQ 服务治理与服务配置:Nacos 负载均衡组件:Ribbon 远程服务调用:Fegin 服务限流与容错:Sentinel 服务网关:SpringCloud-Gateway 服务链路追踪:Sleuth+ZipKin 分布式事务:Seata 数据存储:MySQL+ElasticSearch ``` 3.3 模块划分 为了方便开发和维护,同时为了模块的复用性,整体项目在搭建时,会将用户微服务、商品微服务和订单微服务放在同一个Maven父工程下,作为父工程的子模块,同时,将用户微服务、商品微服务和订单微服务都会使用的JavaBean单独作为一个Maven模块,以及各服务都会使用的工具类单独作为一个Maven模块。 ———————————————— - [特别感谢https://blog.csdn.net/weixin_44052055/article/details/124175826](https://blog.csdn.net/weixin_44052055/article/details/124175826) - [特别感谢https://blog.csdn.net/weixin_44052055/article/details/124444510](https://blog.csdn.net/weixin_44052055/article/details/124444510) - [特别感谢https://binghe.gitcode.host/md/microservices/springcloudalibaba/2022-04-02-SpringCloudAlibaba%E4%B8%93%E6%A0%8F%E5%BC%80%E7%AF%87.html](https://binghe.gitcode.host/md/microservices/springcloudalibaba/2022-04-02-SpringCloudAlibaba%E4%B8%93%E6%A0%8F%E5%BC%80%E7%AF%87.html)