当前位置: 首页 > article >正文

RabbitMQ(七大模式+微服务+自用)

一、前置准备安装并启动 RabbitMQ默认端口 5672JDK 8、Maven、IDEA所有项目通用工具类 通用 pom直接复制二、全局统一配置所有项目必用1. 公共连接工具类 ConnectionUtil.javajava运行package com.mq.util; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; /** * RabbitMQ 公共连接工具类所有项目通用 */ public class ConnectionUtil { // 获取RabbitMQ连接 public static Connection getConnection() throws Exception { ConnectionFactory factory new ConnectionFactory(); factory.setHost(localhost); factory.setPort(5672); factory.setUsername(guest); factory.setPassword(guest); return factory.newConnection(); } // 关闭连接和通道 public static void close(Connection conn, Channel channel) { try { if (channel ! null) channel.close(); if (conn ! null) conn.close(); } catch (Exception e) { e.printStackTrace(); } } }2. 通用 pom.xml原生 Java 项目xml?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion groupIdcom.mq/groupId !-- 替换为项目名simple-demo / work-demo 等 -- artifactId项目名/artifactId version1.0/version dependencies !-- RabbitMQ客户端依赖 -- dependency groupIdcom.rabbitmq/groupId artifactIdamqp-client/artifactId version5.18.0/version /dependency /dependencies /project三、项目 1simple-demo 简单模式项目结构plaintextsimple-demo ├── src/main/java/com/mq │ ├── util/ConnectionUtil.java │ ├── Producer.java │ └── Consumer.java └── pom.xml完整代码生产者 Producer.javajava运行package com.mq; import com.mq.util.ConnectionUtil; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; public class Producer { private static final String QUEUE simple_queue; public static void main(String[] args) throws Exception { Connection conn ConnectionUtil.getConnection(); Channel channel conn.createChannel(); channel.queueDeclare(QUEUE, false, false, false, null); String msg 简单模式消息; channel.basicPublish(, QUEUE, null, msg.getBytes()); System.out.println(发送 msg); ConnectionUtil.close(conn, channel); } }消费者 Consumer.javajava运行package com.mq; import com.mq.util.ConnectionUtil; import com.rabbitmq.client.*; public class Consumer { private static final String QUEUE simple_queue; public static void main(String[] args) throws Exception { Connection conn ConnectionUtil.getConnection(); Channel channel conn.createChannel(); channel.queueDeclare(QUEUE, false, false, false, null); DeliverCallback callback (tag, msg) - { System.out.println(接收 new String(msg.getBody())); }; channel.basicConsume(QUEUE, true, callback, tag - {}); System.out.println(等待消息...); } }✅ 运行顺序必须先开消费者运行Consumer保持运行运行Producer消费者控制台打印消息四、项目 2work-demo 工作队列模式项目结构plaintextwork-demo ├── src/main/java/com/mq │ ├── util/ConnectionUtil.java │ ├── Producer.java │ ├── Consumer1.java │ └── Consumer2.java └── pom.xml完整代码生产者 Producer.javajava运行package com.mq; import com.mq.util.ConnectionUtil; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; public class Producer { private static final String QUEUE work_queue; public static void main(String[] args) throws Exception { Connection conn ConnectionUtil.getConnection(); Channel channel conn.createChannel(); channel.queueDeclare(QUEUE, false, false, false, null); // 发送10条消息 for (int i 1; i 10; i) { String msg 任务 i; channel.basicPublish(, QUEUE, null, msg.getBytes()); System.out.println(发送 msg); } ConnectionUtil.close(conn, channel); } }消费者 1 Consumer1.javajava运行package com.mq; import com.mq.util.ConnectionUtil; import com.rabbitmq.client.*; public class Consumer1 { private static final String QUEUE work_queue; public static void main(String[] args) throws Exception { Connection conn ConnectionUtil.getConnection(); Channel channel conn.createChannel(); channel.queueDeclare(QUEUE, false, false, false, null); DeliverCallback callback (tag, msg) - { System.out.println(消费者1接收 new String(msg.getBody())); }; channel.basicConsume(QUEUE, true, callback, tag - {}); } }消费者 2 Consumer2.javajava运行package com.mq; import com.mq.util.ConnectionUtil; import com.rabbitmq.client.*; public class Consumer2 { private static final String QUEUE work_queue; public static void main(String[] args) throws Exception { Connection conn ConnectionUtil.getConnection(); Channel channel conn.createChannel(); channel.queueDeclare(QUEUE, false, false, false, null); DeliverCallback callback (tag, msg) - { System.out.println(消费者2接收 new String(msg.getBody())); }; channel.basicConsume(QUEUE, true, callback, tag - {}); } }✅ 运行顺序运行Consumer1运行Consumer2运行Producer两个消费者轮流接收消息轮询分发五、项目 3fanout-demo 发布订阅模式项目结构plaintextfanout-demo ├── src/main/java/com/mq │ ├── util/ConnectionUtil.java │ ├── Producer.java │ ├── Consumer1.java │ └── Consumer2.java └── pom.xml完整代码生产者 Producer.javajava运行package com.mq; import com.mq.util.ConnectionUtil; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; public class Producer { private static final String EXCHANGE fanout_exchange; public static void main(String[] args) throws Exception { Connection conn ConnectionUtil.getConnection(); Channel channel conn.createChannel(); channel.exchangeDeclare(EXCHANGE, fanout); String msg 广播消息; channel.basicPublish(EXCHANGE, , null, msg.getBytes()); System.out.println(发送 msg); ConnectionUtil.close(conn, channel); } }消费者 1 Consumer1.javajava运行package com.mq; import com.mq.util.ConnectionUtil; import com.rabbitmq.client.*; public class Consumer1 { private static final String EXCHANGE fanout_exchange; public static void main(String[] args) throws Exception { Connection conn ConnectionUtil.getConnection(); Channel channel conn.createChannel(); channel.exchangeDeclare(EXCHANGE, fanout); String queue channel.queueDeclare().getQueue(); channel.queueBind(queue, EXCHANGE, ); DeliverCallback callback (tag, msg) - { System.out.println(消费者1接收 new String(msg.getBody())); }; channel.basicConsume(queue, true, callback, tag - {}); } }消费者 2 Consumer2.javajava运行package com.mq; import com.mq.util.ConnectionUtil; import com.rabbitmq.client.*; public class Consumer2 { private static final String EXCHANGE fanout_exchange; public static void main(String[] args) throws Exception { Connection conn ConnectionUtil.getConnection(); Channel channel conn.createChannel(); channel.exchangeDeclare(EXCHANGE, fanout); String queue channel.queueDeclare().getQueue(); channel.queueBind(queue, EXCHANGE, ); DeliverCallback callback (tag, msg) - { System.out.println(消费者2接收 new String(msg.getBody())); }; channel.basicConsume(queue, true, callback, tag - {}); } }✅ 运行顺序运行Consumer1运行Consumer2运行Producer两个消费者都收到同一条消息广播六、项目 4direct-demo 路由模式项目结构plaintextdirect-demo ├── src/main/java/com/mq │ ├── util/ConnectionUtil.java │ ├── Producer.java │ ├── ConsumerInfo.java │ └── ConsumerError.java └── pom.xml完整代码生产者 Producer.javajava运行package com.mq; import com.mq.util.ConnectionUtil; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; public class Producer { private static final String EXCHANGE direct_exchange; public static void main(String[] args) throws Exception { Connection conn ConnectionUtil.getConnection(); Channel channel conn.createChannel(); channel.exchangeDeclare(EXCHANGE, direct); // 发送不同路由键消息 channel.basicPublish(EXCHANGE, info, null, info日志.getBytes()); channel.basicPublish(EXCHANGE, error, null, error日志.getBytes()); ConnectionUtil.close(conn, channel); } }消费者 ConsumerInfo.javajava运行package com.mq; import com.mq.util.ConnectionUtil; import com.rabbitmq.client.*; public class ConsumerInfo { public static void main(String[] args) throws Exception { Connection conn ConnectionUtil.getConnection(); Channel channel conn.createChannel(); channel.exchangeDeclare(direct_exchange, direct); String queue channel.queueDeclare().getQueue(); channel.queueBind(queue, direct_exchange, info); channel.basicConsume(queue, true, (t, m) - { System.out.println(info接收 new String(m.getBody())); }, t - {}); } }消费者 ConsumerError.javajava运行package com.mq; import com.mq.util.ConnectionUtil; import com.rabbitmq.client.*; public class ConsumerError { public static void main(String[] args) throws Exception { Connection conn ConnectionUtil.getConnection(); Channel channel conn.createChannel(); channel.exchangeDeclare(direct_exchange, direct); String queue channel.queueDeclare().getQueue(); channel.queueBind(queue, direct_exchange, error); channel.basicConsume(queue, true, (t, m) - { System.out.println(error接收 new String(m.getBody())); }, t - {}); } }✅ 运行顺序运行ConsumerInfo运行ConsumerError运行Producer各自只收到对应路由键的消息七、项目 5topic-demo 主题模式完整代码项目结构plaintexttopic-demo ├── src/main/java/com/mq │ ├── util/ConnectionUtil.java │ ├── Producer.java │ ├── Consumer1.java │ └── Consumer2.java └── pom.xmlProducer.java生产者java运行package com.mq; import com.mq.util.ConnectionUtil; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; public class Producer { private static final String EXCHANGE topic_exchange; public static void main(String[] args) throws Exception { Connection conn ConnectionUtil.getConnection(); Channel channel conn.createChannel(); channel.exchangeDeclare(EXCHANGE, topic); // 发送两条带路由键的消息 channel.basicPublish(EXCHANGE, user.save, null, 用户新增.getBytes()); channel.basicPublish(EXCHANGE, order.pay, null, 订单支付.getBytes()); System.out.println(主题模式消息发送完成); ConnectionUtil.close(conn, channel); } }Consumer1.java匹配 user.#java运行package com.mq; import com.mq.util.ConnectionUtil; import com.rabbitmq.client.*; public class Consumer1 { private static final String EXCHANGE topic_exchange; public static void main(String[] args) throws Exception { Connection conn ConnectionUtil.getConnection(); Channel channel conn.createChannel(); channel.exchangeDeclare(EXCHANGE, topic); String queue channel.queueDeclare().getQueue(); // 绑定通配符匹配所有 user 开头的路由 channel.queueBind(queue, EXCHANGE, user.#); channel.basicConsume(queue, true, (tag, msg) - { System.out.println(消费者1(user.#) 接收 new String(msg.getBody())); }, tag - {}); } }Consumer2.java匹配 *.payjava运行package com.mq; import com.mq.util.ConnectionUtil; import com.rabbitmq.client.*; public class Consumer2 { private static final String EXCHANGE topic_exchange; public static void main(String[] args) throws Exception { Connection conn ConnectionUtil.getConnection(); Channel channel conn.createChannel(); channel.exchangeDeclare(EXCHANGE, topic); String queue channel.queueDeclare().getQueue(); // 绑定通配符匹配所有以 .pay 结尾的路由 channel.queueBind(queue, EXCHANGE, *.pay); channel.basicConsume(queue, true, (tag, msg) - { System.out.println(消费者2(*.pay) 接收 new String(msg.getBody())); }, tag - {}); } }✅ 运行顺序运行Consumer1运行Consumer2运行Producer结果消费者 1 收到用户新增消费者 2 收到订单支付八、项目 6headers-demo 首部匹配模式完整代码项目结构plaintextheaders-demo ├── src/main/java/com/mq │ ├── util/ConnectionUtil.java │ ├── Producer.java │ └── Consumer.java └── pom.xmlProducer.javajava运行package com.mq; import com.mq.util.ConnectionUtil; import com.rabbitmq.client.AMQP; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import java.util.Map; public class Producer { private static final String EXCHANGE headers_exchange; public static void main(String[] args) throws Exception { Connection conn ConnectionUtil.getConnection(); Channel channel conn.createChannel(); channel.exchangeDeclare(EXCHANGE, headers); // 设置消息头 AMQP.BasicProperties props new AMQP.BasicProperties.Builder() .headers(Map.of(type, sms)).build(); channel.basicPublish(EXCHANGE, , props, 短信消息.getBytes()); System.out.println(首部模式消息发送完成); ConnectionUtil.close(conn, channel); } }Consumer.javajava运行package com.mq; import com.mq.util.ConnectionUtil; import com.rabbitmq.client.*; import java.util.Map; public class Consumer { private static final String EXCHANGE headers_exchange; public static void main(String[] args) throws Exception { Connection conn ConnectionUtil.getConnection(); Channel channel conn.createChannel(); channel.exchangeDeclare(EXCHANGE, headers); String queue channel.queueDeclare().getQueue(); // 匹配headers任意一个满足即可 MapString, Object args Map.of(x-match, any, type, sms); channel.queueBind(queue, EXCHANGE, , args); channel.basicConsume(queue, true, (tag, msg) - { System.out.println(首部匹配消费者接收 new String(msg.getBody())); }, tag - {}); } }✅ 运行顺序运行Consumer运行Producer消费者收到短信消息九、项目 7delay-demo 延迟队列完整代码项目结构plaintextdelay-demo ├── src/main/java/com/mq │ ├── util/ConnectionUtil.java │ ├── Producer.java │ └── Consumer.java └── pom.xmlProducer.java生产者 —— 发送到过期队列java运行package com.mq; import com.mq.util.ConnectionUtil; import com.rabbitmq.client.AMQP; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import java.util.HashMap; import java.util.Map; public class Producer { // 过期队列消息在这里等待5秒 private static final String WAIT_QUEUE wait_queue; public static void main(String[] args) throws Exception { Connection conn ConnectionUtil.getConnection(); Channel channel conn.createChannel(); // 核心过期队列配置死信转发 MapString, Object params new HashMap(); // 消息过期时间 5秒 params.put(x-message-ttl, 5000); // 过期后转发到死信交换机 params.put(x-dead-letter-exchange, ); // 过期后路由到真正队列 params.put(x-dead-letter-routing-key, real_delay_queue); // 声明过期等待队列 channel.queueDeclare(WAIT_QUEUE, true, false, false, params); // 发送消息不设置expiration队列统一过期 String msg 我是延迟5秒的消息; channel.basicPublish(, WAIT_QUEUE, null, msg.getBytes()); System.out.println(已发送延迟消息等待5秒后到达消费者...); ConnectionUtil.close(conn, channel); } }Consumer.java消费者 —— 监听真正队列java运行package com.mq; import com.mq.util.ConnectionUtil; import com.rabbitmq.client.*; public class Consumer { // 真正消费的队列5秒后消息才会来 private static final String REAL_QUEUE real_delay_queue; public static void main(String[] args) throws Exception { Connection conn ConnectionUtil.getConnection(); Channel channel conn.createChannel(); // 声明真正的消费队列 channel.queueDeclare(REAL_QUEUE, true, false, false, null); System.out.println(延迟消费者已启动等待5秒后收到消息...); // 监听消费 channel.basicConsume(REAL_QUEUE, true, (tag, msg) - { System.out.println(✅ 收到延迟消息 new String(msg.getBody())); }, tag - {}); } }十、项目 8springboot-rabbitmq-demo完整代码pom.xmlxml?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.7.15/version /parent modelVersion4.0.0/modelVersion groupIdcom.mq/groupId artifactIdspringboot-rabbitmq-demo/artifactId version1.0/version dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-amqp/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency /dependencies /projectapplication.ymlyamlspring: rabbitmq: host: localhost port: 5672 username: guest password: guestRabbitApplication.java启动类java运行package com.mq; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; SpringBootApplication public class RabbitApplication { public static void main(String[] args) { SpringApplication.run(RabbitApplication.class, args); } }RabbitConfig.javajava运行package com.mq.config; import org.springframework.amqp.core.Queue; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; Configuration public class RabbitConfig { Bean public Queue queue(){ return new Queue(boot_queue); } }ProducerController.javajava运行package com.mq.controller; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; RestController public class ProducerController { Autowired private RabbitTemplate template; GetMapping(/send) public String send(){ template.convertAndSend(boot_queue, SpringBoot集成RabbitMQ消息); return 消息发送成功; } }Consumer.javajava运行package com.mq.consumer; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; Component public class Consumer { RabbitListener(queues boot_queue) public void receive(String msg){ System.out.println(SpringBoot消费者接收msg); } }✅ 运行顺序启动RabbitApplication浏览器访问http://localhost:8080/send控制台打印消息十一、项目 9rabbitmq-microservice-demo 微服务异步通信完整代码启动类 MicroApplication.javajava运行package com.mq.micro; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; SpringBootApplication public class MicroApplication { public static void main(String[] args) { SpringApplication.run(MicroApplication.class,args); } }配置类 RabbitMicroConfig.javajava运行package com.mq.micro.config; import org.springframework.amqp.core.Binding; import org.springframework.amqp.core.BindingBuilder; import org.springframework.amqp.core.DirectExchange; import org.springframework.amqp.core.Queue; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; Configuration public class RabbitMicroConfig { public static final String ORDER_EXCHANGE order_business_exchange; public static final String STOCK_QUEUE stock_reduce_queue; public static final String SMS_QUEUE sms_send_queue; public static final String ROUTING_STOCK order.stock; public static final String ROUTING_SMS order.sms; Bean public DirectExchange orderExchange(){ return new DirectExchange(ORDER_EXCHANGE,true,false); } Bean public Queue stockQueue(){ return new Queue(STOCK_QUEUE,true); } Bean public Queue smsQueue(){ return new Queue(SMS_QUEUE,true); } Bean public Binding stockBinding(){ return BindingBuilder.bind(stockQueue()).to(orderExchange()).with(ROUTING_STOCK); } Bean public Binding smsBinding(){ return BindingBuilder.bind(smsQueue()).to(orderExchange()).with(ROUTING_SMS); } }订单生产者 OrderProducer.javajava运行package com.mq.micro.order; import com.mq.micro.config.RabbitMicroConfig; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; RestController public class OrderProducer { Resource private RabbitTemplate rabbitTemplate; GetMapping(/create/order/{orderNo}) public String createOrder(PathVariable String orderNo){ String orderMsg 订单orderNo 支付完成; rabbitTemplate.convertAndSend(RabbitMicroConfig.ORDER_EXCHANGE, RabbitMicroConfig.ROUTING_STOCK,orderMsg); rabbitTemplate.convertAndSend(RabbitMicroConfig.ORDER_EXCHANGE, RabbitMicroConfig.ROUTING_SMS,orderMsg); return 订单创建成功消息已推送; } }库存消费者 StockConsumer.javajava运行package com.mq.micro.stock; import com.mq.micro.config.RabbitMicroConfig; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; Component public class StockConsumer { RabbitListener(queues RabbitMicroConfig.STOCK_QUEUE) public void reduceStock(String msg){ System.out.println(【库存微服务】收到msg); System.out.println(【库存微服务】执行商品库存扣减...); } }短信消费者 SmsConsumer.javajava运行package com.mq.micro.sms; import com.mq.micro.config.RabbitMicroConfig; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; Component public class SmsConsumer { RabbitListener(queues RabbitMicroConfig.SMS_QUEUE) public void sendSms(String msg){ System.out.println(【短信微服务】收到msg); System.out.println(【短信微服务】执行发送下单成功短信...); } }✅ 运行顺序启动RabbitMQ启动MicroApplication浏览器访问plaintexthttp://localhost:8080/create/order/ORDER20260520控制台输出plaintext【库存微服务】收到订单ORDER20260520 支付完成 【库存微服务】执行商品库存扣减... 【短信微服务】收到订单ORDER20260520 支付完成 【短信微服务】执行发送下单成功短信...十二、所有项目通用运行口诀零基础必背原生 Java 项目先运行消费者再运行生产者SpringBoot 项目直接启动访问接口即可多个消费者全部先启动再发消息交换机模式消费者必须先绑定队列

相关文章:

RabbitMQ(七大模式+微服务+自用)

一、前置准备安装并启动 RabbitMQ(默认端口 5672)JDK 8、Maven、IDEA所有项目通用工具类 通用 pom,直接复制二、全局统一配置(所有项目必用)1. 公共连接工具类 ConnectionUtil.javajava运行package com.mq.util;impor…...

工控机厂家怎么选?20年从业者告诉你这5个关键点

在工业自动化领域,工控机的选择直接关系到生产线的稳定运行。作为一名在工业电脑行业摸爬滚打20年的从业者,我见过太多企业因为选错厂家而付出惨痛代价——设备频繁故障、售后推诿扯皮、项目延期损失百万。今天,我就从专业角度告诉你&#xf…...

2026年房建工程管理软件选购指南:7款主流工具横向对比,助你找到最适合的那一款

2025年,房建行业整体营收下滑5.62%,净利润降幅超20%,利润空间持续收窄。越来越多施工企业意识到,精细化管理是穿越周期的唯一路径。然而,数据孤岛、多分包协同混乱、合规要求升级,让选对一款工程管理软件变…...

技术架构深度剖析:如何构建专业的浏览器资源嗅探扩展

技术架构深度剖析:如何构建专业的浏览器资源嗅探扩展 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 在现代浏览器扩展开发领域&#x…...

明日方舟智能基建管理终极指南:5分钟实现全自动资源生产

明日方舟智能基建管理终极指南:5分钟实现全自动资源生产 【免费下载链接】arknights-mower 《明日方舟》长草助手 项目地址: https://gitcode.com/gh_mirrors/ar/arknights-mower 还在为《明日方舟》繁琐的基建管理而头疼吗?每天花费大量时间手动…...

Java智能地址解析架构深度解析:构建高精度企业级地址识别系统

Java智能地址解析架构深度解析:构建高精度企业级地址识别系统 【免费下载链接】address-parse Java 版智能解析收货地址 项目地址: https://gitcode.com/gh_mirrors/addr/address-parse 面对海量非结构化地址数据的处理挑战,传统规则引擎已无法满…...

3分钟快速检测微信单向好友:告别隐形社交困扰的实用指南

3分钟快速检测微信单向好友:告别隐形社交困扰的实用指南 【免费下载链接】WechatRealFriends 微信好友关系一键检测,基于微信ipad协议,看看有没有朋友偷偷删掉或者拉黑你 项目地址: https://gitcode.com/gh_mirrors/we/WechatRealFriends …...

外泌体检测推荐公司

外泌体检测推荐公司 核心优势:外泌体领域一站式技术龙头,搭建从外泌体提取、鉴定到分子检测的完整技术体系,可提供包括样本处理、分离纯化、表征分析、核酸 / 蛋白标志物检测等全链条科研服务,实验体系成熟、整合度高、交付顺畅。…...

为什么顶级AI艺术家总在第3轮生成才出片?——揭秘构图迭代中的“临界收敛点”与3次生成内锁定最佳构图的硬核策略

更多请点击: https://kaifayun.com 第一章:为什么顶级AI艺术家总在第3轮生成才出片? AI图像生成并非“一击必中”的魔法,而是一场精密的概率博弈。Stable Diffusion、DALLE 3 和 MidJourney v6 等主流模型在采样过程中采用多步去…...

书匠策AI降重降AIGC到底有多野?论文党看完直接封神!

各位论文战士们,今天不聊开题,不聊答辩,咱们聊点真正救命的东西——降重和降AIGC。 你有没有经历过这种绝望:查重报告一出来,红得像过年的对联?导师一句"你这AIGC率太高了,重写"&…...

MySQL 9.0安装教程:免费数据库软件,科研数据管理必备

做科研的朋友,应该都有这个经历。以前用Excel打开数据文件,几秒钟就出来了。现在呢?几十万行的数据表,打开转半天圈,筛选一下直接未响应。保存一次要等好久,生怕电脑死机。不是你的电脑不行,是数…...

RNA-seq公司推荐

RNA-seq公司推荐 伯远生物是国内高通量测序综合性服务商,聚焦RNA-seq全场景服务,覆盖临床、科研、农业等领域,提供一站式测序与分析解决方案; 其临床转化与大样本服务市占率领先,依托自研平台实现高通量、成本可控&…...

跨境漫游通信解析:全球漫游物联网卡的适配逻辑与行业应用

在跨境物联网行业中,除固定单一国家投放的设备外,有大量终端设备存在跨区域流动、多国家部署、不定向出海的使用需求。车载定位、跨境物流终端、移动式工控、巡回检测设备,这类硬件无法限定单一运营商网络,对多国网络切换、信号漫…...

2026年京东云OpenClaw/Hermes Agent配置Token Plan环境搭建指南

2026年京东云OpenClaw/Hermes Agent配置Token Plan环境搭建指南。OpenClaw是开源的个人AI助手,Hermes Agent则是一个能自我进化的AI智能体框架。阿里云提供计算巢、轻量服务器及无影云电脑三种部署OpenClaw 与 Hermes Agent的方案、百炼Token Plan兼容主流 AI 工具&…...

Windows与Office激活终极指南:KMS_VL_ALL_AIO完整解决方案

Windows与Office激活终极指南:KMS_VL_ALL_AIO完整解决方案 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 在Windows和Office激活管理中,你是否经常遇到版本不匹配、激活…...

Diablo Edit2:10分钟掌握暗黑破坏神2存档修改终极指南

Diablo Edit2:10分钟掌握暗黑破坏神2存档修改终极指南 【免费下载链接】diablo_edit Diablo II Character editor. 项目地址: https://gitcode.com/gh_mirrors/di/diablo_edit 厌倦了在暗黑破坏神2中反复刷装备?想要快速测试新build却不想花费40小…...

FineBI组件制作-表格

FineBI 为用户提供了三种表格类型:明细表、分组表、交叉表。 明细表 明细表将表格中的所有数据一条一条都罗列出来,用于展示明细数据,通常包含了大量的数据记录,可以用于进行分析、查询等操作。特点: 可以展示数据的详…...

终极指南:如何在Android设备上实现Zwift离线骑行模拟

终极指南:如何在Android设备上实现Zwift离线骑行模拟 【免费下载链接】zwift-offline Use Zwift offline 项目地址: https://gitcode.com/gh_mirrors/zw/zwift-offline 你是否厌倦了网络不稳定导致的Zwift训练中断?想要在任何地方都能享受专业的虚…...

裁员风暴:从大厂骨干到失业边缘

2024年的春天,我在一家头部互联网公司担任测试主管的第八个年头,一场突如其来的裁员风暴打破了看似安稳的生活。公司战略收缩,测试部门首当其冲,我和近三成同事被列入优化名单。看着熟悉的工位被迅速清空,手里的离职证…...

文档下载神器kill-doc:如何一键拯救被平台困住的30+文档资源

文档下载神器kill-doc:如何一键拯救被平台困住的30文档资源 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该脚本就是…...

宣传片微电影制作拍摄

荣誉见证实力・匠心铸就品牌|国隆映像传媒,6 年深耕乌鲁木齐,斩获全国影像盛典、脱贫攻坚、文旅代言等多项大奖,为企事业单位提供一站式影视制作服务。...

如何在Photoshop中构建AI原生工作流:SD-PPP的技术架构解析

如何在Photoshop中构建AI原生工作流:SD-PPP的技术架构解析 【免费下载链接】sd-ppp A Photoshop AI plugin 项目地址: https://gitcode.com/gh_mirrors/sd/sd-ppp 当我们谈论AI与创意工具的结合时,通常面临一个核心挑战:如何在保持专业…...

【往届均已完成EI检索!】第三届遥感测绘与全球定位算法国际学术会议(RSGPA 2026)

第三届遥感测绘与全球定位算法国际学术会议(RSGPA 2026)将于2026年6月13日举办线上会议。会议主要围绕遥感测绘与定位算法等研究领域展开讨论。本次会议旨在为相关领域的研究人员提供一个权威的国际交流平台,交流全球相关领域科技学术最新发展…...

MC端口映射完全教程:路由器虚拟服务器配置+防火墙放行+内网穿透备用方案

一、什么是MC端口映射MC端口映射是指将运行《我的世界》服务器的电脑内网IP和端口(Java版默认25565),通过路由器设置“映射”到公网,让外网玩家能够连接进来。简单说,就是把你自己电脑上开的游戏房“门牌号”告诉全世界…...

汽车零部件三维扫描检测:精密制造新标杆,全链路质量管控升级

当下,汽车产业正加速向轻量化、电动化、集成化转型,零部件作为整车质量的核心基石,其制造精度与检测标准持续攀升。主机厂对零部件的形位公差、曲面轮廓度、装配匹配度要求日趋严苛,尤其在新能源汽车领域,薄壁件、复杂…...

端口映射配置后连不上?别慌!按这4步排查,一学就会

一、什么是端口映射监控端口映射监控是指对端口映射规则的状态、流量及连通性进行全面监测,确保映射规则正常生效,及时发现并排查故障。它涵盖两个层面:本机端口监听状态检测和网络层端口映射连通性验证。二、本机端口监控(服务端…...

网关端口映射和路由器端口转发有什么区别?配置要点全解析

一、什么是网关端口映射网关端口映射是指通过路由器、防火墙等网关设备,建立“公网IP:外部端口”与“内网设备IP:内部端口”之间的一对一映射通道,让外网用户能够访问内网中的特定服务。‍形象理解:网关相当于“小区保安”,公网IP…...

仅限本周开放|Lovable高阶工程化实践内部培训课件(含模块化架构图、依赖注入容器源码注释版)

更多请点击: https://codechina.net 第一章:Lovable应用开发完整教程 Lovable 是一个面向现代 Web 应用的轻量级响应式框架,专为构建高交互性、可访问性强且易于维护的单页应用(SPA)而设计。它采用声明式组件模型与响…...

伺服电机电流环PI参数整定:从数学模型到工程实践

1. 项目概述:高带宽电流环设计的核心价值在伺服电机控制领域,追求极致的动态响应和稳态精度,是所有工程师的终极目标。上一期我们聊透了EtherCAT如何通过精准的同步信号(Sync)为整个控制系统打下坚实的时间基准&#x…...

第八篇:《软件测试的经济学:投入与回报》

在商业环境中,测试不是“免费”的——它需要人力、工具、时间。但缺陷也不是免费的——它可能导致损失、赔偿、用户流失。如何让管理者理解“投入测试是投资,而不是成本”?本文将从经济学角度分析测试的投资回报率(ROI&#xff09…...