Java研学-RabbitMQ(三)

一 消息通信协议

1 AMQP

  AMQP 是一个开放的、跨语言、跨平台的消息协议标准,用于在分布式系统中传递业务消息。它定义了消息队列的二进制协议格式和交互模型(如交换机、队列、绑定等),确保不同语言(Java、Python、C#等)和平台(RabbitMQ、Qpid等)的实现能够互操作。

2 Spring AMQP

  Spring AMQP 是 Spring 框架对 AMQP 协议(如 RabbitMQ)的抽象与封装,提供了一套简洁的 Java API 来简化消息的生产和消费。
  它通过AmqpTemplate模板类实现消息的快速发送(如自动序列化、路由键设置),结合@RabbitListener注解实现声明式的消费者监听,同时支持动态声明交换机、队列和绑定(通过 RabbitAdmin),并深度集成 Spring 生态(如依赖注入、事务管理)。
  其核心优势在于隐藏底层协议细节,让开发者仅需关注业务逻辑,无需手动处理连接、通道或消息确认等复杂操作,从而高效构建异步、解耦的分布式系统。

二 入门demo

1 项目路径图

在这里插入图片描述

2 交换机与队列准备

  创建虚拟主机/midhuang,使用其中的交换机amq.fanout,与队列xiaohuang.queue1进行绑定。

3 父工程导入依赖

  创建spring项目,为父工程导入依赖,两个子工程会会自动继承这些依赖

        <!-- Lombok:简化Java代码(如自动生成Getter/Setter-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <!-- Spring AMQP + RabbitMQ 集成 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

        <!-- Spring Boot 单元测试 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

4 各个微服务中配置文件

  ① consumer(消费者),5672是用来发消息的端口,15672是Web控制台

spring:
  rabbitmq:
    host: 192.168.44.128
    port: 5672 
    virtual-host: /midhuang
    username: dahuang
    password: "dahuang66"
logging:
  level:
    cn.tj.consumer.listeners: DEBUG # 设置为 DEBUG 以查看详细日志

  ② publisher(生产者)

spring:
  rabbitmq:
    host: 192.168.44.128
    port: 5672
    virtual-host: /midhuang
    username: dahuang
    password: "dahuang66"
logging:
  level:
    cn.tj: DEBUG # 设置为 DEBUG 以查看详细日志

5 测试类发送消息

  利用RabbitTemplate发送消息

@SpringBootTest
class PublisherApplicationTests {
    // 注入 RabbitTemplate
    @Autowired
    private RabbitTemplate rabbitTemplate;

    // 直接发送消息到队列
    @Test
    public void testHuangQueue() {
        // 1. 定义队列名称
        String queueName = ".queue";
        // 2. 定义消息内容
        String message = "hello, spring amqp!";
        // 3. 发送消息(默认路由到队列)
        rabbitTemplate.convertAndSend(queueName, message);
        System.out.println("消息发送成功: " + message);
    }
}

6 控制台检查刚刚发送消息

在这里插入图片描述

7 接收消息

  利用@RabbitListener注解声明要监听的队列,监听消息,此时消费者服务需启动保持监听状态

@Slf4j
@Component
public class MqListener {
    @RabbitListener(queues = "xiaohuang.queue1")
    public void listenHuangQueue(String msg) {
        log.info("收到消息: {}", msg);
        // 调试:打印消息长度和字节(如果 msg 为 null,会输出 "null")
        log.debug("消息长度: {}, 内容: {}", msg == null ? "null" : msg.length(), msg);
    }
}

三 Workqueues

  Workqueues(工作队列)是一种常见的任务分发模型,将多个消费者绑定到一个队列,共同消费队列中的消息,通过共享队列实现负载均衡,从而解决消息堆积问题。

1 创建队列 work.queue

在这里插入图片描述

2 添加两个消费者 – MqListener

@Slf4j
@Component
public class MqListener {
    @RabbitListener(queues = "work.queue")
    public void listenWorkQueue1(String msg) {
        log.info("1号消费者收到消息: {}", msg);
    }
    @RabbitListener(queues = "work.queue")
    public void listenWorkQueue2(String msg) {
        log.info("2号消费者收到消息: {}", msg);
    }
}

3 生产者连续发送消息 – PublisherApplicationTests

@SpringBootTest
class PublisherApplicationTests {
    // 注入 RabbitTemplate
    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Test
    void testWorkQueue() throws InterruptedException {
        String queueName = "work.queue";

        // 发送50条测试消息
        for (int i = 1; i <= 40; i++) {
            String msg = "hello" + i;
            rabbitTemplate.convertAndSend(queueName, msg);
            System.out.println(" [x] Sent '" + msg + "'");
            Thread.sleep(30); // 模拟延迟,避免消息爆发
        }
    }
}

4 控制台输出

  此时并未考虑到消费者的处理能力,RabbitMQ 默认使用 轮询(Round-Robin) 策略分发消息,这可能导致某些消费者积压大量未处理消息,而其他消费者空闲。
在这里插入图片描述

5 编写配置文件 – consumer

  prefetchCount:1像外卖小哥一次只接一单,平台会一次性给小哥派5 个订单(即使他还没处理完之前的订单)。如果小哥手慢(比如堵车),这 5 个订单都会卡在他手里,其他空闲的小哥却没订单可接。
  启用prefetchCount:1后:平台每次只给小哥派 1 个订单。小哥必须完成这个订单(送到顾客手里),平台才会派下一个订单。如果小哥 A 处理快,他很快能接下一个订单;小哥 B 处理慢,他手头的订单不会影响别人。

spring:
  rabbitmq:
    host: 192.168.44.128
    port: 5672
    virtual-host: /midhuang
    username: dahuang
    password: "dahuang66"
    listener:
      simple:
        prefetch: 1
logging:
  level:
    cn.tj.consumer.listeners: DEBUG # 设置为 DEBUG 以查看详细日志

6 设置消费者处理速度 – MqListener

@Slf4j
@Component
public class MqListener {
    @RabbitListener(queues = "work.queue")
    public void listenWorkQueue1(String msg) throws InterruptedException {
        log.info("1号消费者收到消息: {}", msg);
        Thread.sleep(20);
    }
    @RabbitListener(queues = "work.queue")
    public void listenWorkQueue2(String msg) throws InterruptedException {
        log.debug("2号消费者收到消息: {}", msg);
        Thread.sleep(200);
    }
}

7 控制台输出

在这里插入图片描述

<think>我们正在讨论Java高级开发的习路线和指导。用户已经提供了几个引用,但需要注意的是,这些引用主要涉及Java基础到中级的内容(如JavaSE基础、JavaWeb、SSM框架等),而用户现在询问的是“高级开发”阶段。因此,我们需要在已有基础上,重点补充高级部分的内容。根据引用[1]和引用[2],我们可以知道习路线包括:1. Java基础2.面向对象编程3.常用数据结构与算法4.异常处理、I/O与网络编程5.并发编程6.设计模式7.常用框架(如SSM)8.项目实战但高级开发阶段通常包括:-深入理解Java底层原理(如JVM、并发机制)-分布式系统、微服务架构-高性能、高可用、高并发解决方案-系统设计能力-源码阅读与分析能力因此,我们将习路线分为个阶段:基础阶段、中级阶段、高级阶段。用户已经具备基础和中级的技能(根据问题描述,用户已经知道这些内容),所以我们重点放在高级阶段。高级阶段的核心技术指南:1.JVM深度解析:内存模型、垃圾回收、性能调优2.并发编程高级主题:并发工具包(java.util.concurrent)的深入使用、锁优化、并发设计模式3.分布式系统:分布式理论(CAP、BASE)、分布式事务、分布式锁、分布式缓存、消息队列4.微服务架构:SpringCloud生态(服务注册与发现、配置中心、熔断、网关等)5.性能优化:数据库优化、JVM调优、网络优化6.源码分析:阅读主流框架源码(如Spring、MyBatis、Netty)7.系统设计:设计可扩展、高可用的系统架构同时,引用[3]提到了一份GitHub上星标115k+的教程,包括Java基础、容器、并发、虚拟机和IO,我们可以将其作为高级阶段习的基础资料。另外,引用[4]提到了JavaWeb核心技术(Servlet、Request/Response、Cookie/Session),这是中级阶段的内容,但高级开发者需要理解其底层原理,比如Servlet容器的工作原理(如Tomcat)。因此,我们构建如下习路线:阶段一:基础巩固(略讲,因为用户可能已经掌握)-Java基础语法、面向对象-异常处理、I/O、集合框架-多线程基础-数据库基础阶段二:中级进阶(略讲)-JavaWeb(Servlet、JSP等)-常用框架(Spring、SpringMVC、MyBatis)-设计模式-基础项目实战阶段:高级开发(重点)1.JVM深度解析-内存区域(堆、栈、方法区等)-垃圾回收算法与调优(G1、ZGC等)-类加载机制-性能监控与故障排查工具(jstack,jmap, jstat,VisualVM等)2.并发编程高级-java.util.concurrent包(线程池、并发集合、同步器)-锁的优化(自旋锁、锁消除、锁粗化)-原子类与CAS-并发设计模式(如生产者-消费者、Future模式等)3.分布式系统-分布式理论:CAP、BASE、一致性协议(如Raft)-分布式事务:2PC、3PC、TCC、Saga、消息事务(如RocketMQ事务消息)-分布式锁:基于数据库、Redis、ZooKeeper的实现-分布式缓存:Redis高级特性(集群、持久化、缓存穿透/击穿/雪崩解决方案)-消息队列:Kafka、RabbitMQ、RocketMQ的原理与使用4.微服务架构-Spring CloudNetflix(Eureka, Hystrix, Zuul)或SpringCloud Alibaba(Nacos, Sentinel, Seata)-服务治理(限流、降级、熔断)-配置中心(SpringCloud Config, Apollo)-服务网格(如Istio,可选)5.性能优化- JVM调优:根据应用场景调整堆大小、选择垃圾收集器-数据库优化:索引优化、慢查询分析、分库分表-网络优化:TCP参数调优、HTTP/2、QUIC-应用优化:异步处理、缓存应用、资源池化6.源码分析-阅读Spring框架核心源码(IoC容器、AOP实现)-阅读MyBatis源码(SQL解析、执行器)-阅读Netty源码(NIO模型、事件驱动)7.系统设计能力-设计模式在大型系统中的应用-高可用设计:冗余、负载均衡、故障转移-高并发设计:水平扩展、异步解耦、缓存-大型系统案例习(如电商、社交)习建议:-实践:通过项目实战应用所,例如搭建一个分布式电商系统。-阅读:阅读经典书籍如《深入理解Java虚拟机》、《Java并发编程实战》、《分布式系统:概念与设计》等。-源码:从简单的框架开始阅读源码,逐步深入。-工具:熟练使用Git、Maven/Gradle、Docker、Linux等工具和环境。最后,根据用户要求,生成相关问题。注意:在回答中,我们不需要详细展开基础和中阶部分,但为了路线完整,可以简要提及。重点放在高级部分。</think>### Java高级开发习路径及核心技术指南 以下习路线基于Java技术栈的演进和行业需求设计,结合高级开发的核心能力要求,分为**基础巩固**、**核心进阶**、**架构设计**和**高阶实践**四个阶段,重点涵盖分布式、高并发、性能优化等关键技术。 --- #### 一、基础巩固(必备基石) 1. **Java语言深度** - 掌握JVM原理:内存模型(堆/栈/方法区)、GC算法(G1/ZGC)、类加载机制[^3] - 并发编程核心:`java.util.concurrent`包、线程池、锁优化(CAS/AQS) - 新特性实践:Lambda表达式、模块化(JPMS)、Records类等 *习资源:《Java并发编程实战》《深入理解Java虚拟机》* 2. **数据结构与算法** - 高级数据结构:红黑树、B+树、跳表 - 算法实战:动态规划、分治算法、图算法(如Dijkstra) - 复杂度分析:时空复杂度推导与优化 *工具:LeetCode高频题(HARD级)* --- #### 二、核心进阶(企业级开发) 1. **框架源码级掌握** - Spring生态: - IoC/AOP源码实现(Bean生命周期、代理机制) - Spring Boot自动装配原理(`@Conditional`机制) - Spring Cloud微服务组件(Netflix/Alibaba套件) - ORM框架:MyBatis插件开发、Hibernate二级缓存优化 *关键点:通过调试源码理解设计模式应用(如模板方法、责任链)* 2. **分布式系统基础** - 分布式理论:CAP定理、BASE理论、一致性协议(Raft/Paxos) - 通信机制:Netty网络编程、gRPC/Thrift序列化 - 协调服务:ZooKeeper原理与应用场景 --- #### 、架构设计(高阶能力) 1. **高并发与高可用** - 缓存体系:Redis集群、缓存穿透/雪崩解决方案 - 消息队列:Kafka分区策略、RocketMQ事务消息 - 流量治理:熔断(Hystrix/Sentinel)、限流(令牌桶/漏桶算法) *案例:秒杀系统设计(分层削峰、热点探测)* 2. **性能调优** - JVM层:堆外内存管理(DirectByteBuffer)、JIT编译优化 - 数据库层:索引优化、分库分表(ShardingSphere)、慢SQL分析 - 全链路压测:JMeter分布式压测、Arthas在线诊断 --- #### 四、高阶实践(综合落地) 1. **云原生与DevOps** - 容器化:Docker镜像优化、Kubernetes调度策略 - 持续交付:Jenkins流水线设计、GitOps实践 - 监控体系:Prometheus+Grafana监控、ELK日志分析 2. **系统设计方法论** - DDD(领域驱动设计):限界上下文、聚合根设计 - 架构模式:CQRS、Event Sourcing、Saga事务 - 安全设计:OAuth2.0、JWT令牌、防注入攻击 --- ### 习路径建议 ```mermaid graph LR A[基础巩固] --> B[JVM/并发/新特性] A --> C[数据结构/算法] B --> D[框架源码] C --> D D --> E[分布式系统] E --> F[高并发架构] F --> G[性能调优] G --> H[云原生落地] ``` > **关键提示**: > 1. 源码习建议从Spring Core和Netty入手,理解设计思想 > 2. 分布式场景优先掌握Redis/Kafka/RocketMQ的组合应用 > 3. 性能优化需结合Arthas+JProfiler进行实证分析 --- #### 推荐资源 - 书籍:《凤凰架构》《数据密集型应用系统设计》 - 开源项目: - Spring官方源码(GitHub) - 阿里Java开发手册(泰山版) - 实践平台: - 模拟电商平台(处理千万级并发) -简易RPC框架(理解通信本质)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

泰勒疯狂展开

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值