Blog - SpringCloud
type: channel
link: https://qiqa.llhnp.com/index.php/category/springcloud/
items: 分布式消息队列详解
items: 车辆模拟支付、出租、抢单等功能实现

分布式消息队列详解
type: item
date: 2023-11-03T22:23:00+08:00
description: 1、什么是分布式消息队列？消息队列 是指利用 高效可靠 的 消息传递机制 进行与平台无关的 数据交流，并基于 数据通信 来进行分布式系统的集成。通过提供 消息传递 和 消息排队 模型，它可以在 分布式环境 下提供 应用解耦、弹性伸缩、冗余存储、流量削峰、异步通信、数据同步 等等功能，其作为 分布式系统架构 中的一个重要组件，有着举足轻重的地位。2、消息队列--历程与区别2.1、发布历程下图根据时间线展示了不同时间点产生的消息队列产品，主要的产品有：2.2、各个中间件的区别3、中间件--详解3.1、Apache Kafka简介Apache Kafka 是一个 分布式消息发布订阅 系统。它最初由 LinkedIn 公司基于独特的设计实现为一个 分布式的日志提交系统 (a distributed commit log)，之后成为 Apache 项目的一部分。Kafka 性能高效、可扩展良好 并且 可持久化。它的 分区特性，可复制 和 可容错 都是其不错的特性。架构图基本术语Producer：消息生产者。Topic：Topic是个抽象的虚拟概念，一个集群可以有多个Topic，作为一类消息的标识。Partition：Partition是个物理概念，一个Topic对应一个或多个Partition。Replicas：一个Partition有多个Replicas副本。Consumer：消息读取者。消费者订阅主题，并按照一定顺序读取消息。Offset：偏移量是一种元数据，是不断递增的整数。Broker：独立的Kafka服务器。主要特性快速持久化：可以在 O(1) 的系统开销下进行 消息持久化；高吞吐：在一台普通的服务器上既可以达到 10W/s 的 吞吐速率；完全的分布式系统：Broker、Producer 和 Consumer 都原生自动支持 分布式，自动实现 负载均衡；支持 同步 和 异步 复制两种 高可用机制；支持 数据批量发送 和 拉取；零拷贝技术(zero-copy)：减少 IO 操作步骤，提高 系统吞吐量；数据迁移、扩容 对用户透明；无需停机 即可扩展机器；其他特性：丰富的 消息拉取模型、高效 订阅者水平扩展、实时的 消息订阅、亿级的 消息堆积能力、定期删除机制；优点客户端语言丰富：支持 Java、.Net、PHP、Ruby、Python、Go 等多种语言；高性能：单机写入 TPS 约在 100 万条/秒，消息大小 10 个字节；提供 完全分布式架构，并有 replica 机制，拥有较高的 可用性 和 可靠性，理论上支持 消息无限堆积；支持批量操作；消费者 采用 Pull方式 获取消息。消息有序，通过控制 能够保证所有消息被消费且仅被消费一次；有优秀的第三方 Kafka Web 管理界面 Kafka-Manager；在 日志领域 比较成熟，被多家公司和多个开源项目使用。缺点Kafka 单机超过64个 队列/分区 时，Load 时会发生明显的飙高现象。队列 越多，负载 越高，发送消息 响应时间变长；使用 短轮询方式，实时性 取决于 轮询间隔时间；消费失败 不支持重试；支持 消息顺序，但是 一台代理宕机 后，就会产生 消息乱序；社区更新较慢。使用场景日志收集：大量的日志消息先写入kafka，数据服务通过消费kafka消息将数据落地；消息系统：解耦生产者和消费者、缓存消息等；用户活动跟踪：kafka经常被用来记录web用户或者app用户的各种活动运营指标：记录运营、监控数据，包括收集各种分布式应用的数据，生产各种操作的集中反馈。流式处理：比如spark streaming3.2、RabbitMQ简介RabbitMQ 是实现了 高级消息队列协议（AMQP）的开源消息代理软件（亦称面向消息的中间件（英语：Message-oriented middleware））。RabbitMQ服务器是用 Erlang 语言 编写的，而 群集和故障转移 是构建在开放电信平台框架上的。所有主要的编程语言均有与 代理接口通讯 的客户端函式库。架构图基本术语Broker：接收客户端链接实体，实现AMQP消息队列和路由功能；Virtual Host：是一个虚拟概念，权限控制的最小单位。Exchange：接收消息生产者的消息并将消息转发到队列。Message Queue：消息队列，存储为被消费的消息；Message：由Header和Body组成，Header是生产者添加的各种属性；Binding：Binding连接起了Exchange和Message Queue。Connection：在Broker和客户端之间的TCP连接；Channel：信道。Broker和客户端只有tcp连接是不能发送消息的，必须创建信道Command：AMQP命令，客户端通过Command来完成和…

车辆模拟支付、出租、抢单等功能实现
type: item
date: 2023-10-22T11:11:00+08:00
description: 1、部分效果演示车辆列表租车详情订单列表jmeter压力测试抢单错误信息持久化到redis控制台信息2、技术栈功能或特点名称版本父项目依赖spring-boot-starter-parent2.2.5.RELEASE微服务架构spring-cloud-dependenciesHoxton.RELEASEadmin监控服务spring-boot-admin-starter-server2.2.4eureka管理服务spring-cloud-starter-netflix-eureka-server2.2.0.RELEASEconfig配置服务spring-cloud-config-server2.2.0.RELEASEgateway网关服务spring-cloud-starter-gateway2.2.0.RELEASE链路追踪服务spring-cloud-starter-zipkin2.2.0.RELEASEredis限流spring-boot-starter-data-redis-reactive2.2.5.RELEASE组件调用(已集成熔断,负载均衡)spring-cloud-starter-openfeign2.2.0.RELEASEhutool工具类hutool-all5.8.22数据库curdmybatis-plus-boot-starter3.5.3.2短信榛子云短信zhenzisms2.0.2email邮件发送spring-boot-starter-mail2.2.5.RELEASEmq消息队列rocketmq-spring-boot-starter2.2.1阿里云oos对象储存aliyun-sdk-oss3.15.1支付宝支付alipay-sdk-java4.38.111.ALL分布式图片管理minio8.2.23、后端集成3.2、用户登录UserController.javapackage com.llh.controller; import cn.hutool.captcha.CaptchaUtil; import cn.hutool.captcha.CircleCaptcha; import cn.hutool.core.lang.UUID; import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.digest.DigestUtil; import cn.hutool.json.JSONUtil; import cn.hutool.jwt.JWTUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.llh.domain.User; import com.llh.service.UserService; import com.llh.utils.ZzyUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; /** * User: lilinhan * DateTime: 2023/10/20 11:57 */ @RestController @RequestMapping("/user") public class UserController { @Autowired UserService userService; @Autowire…