大数跨境
0
0

Spring Integration 轻松实现服务间消息传递,真香!

Spring Integration 轻松实现服务间消息传递,真香! Java技术图谱
2025-11-24
0

昨天晚上十二点多吧,我在公司楼下喝奶茶…不是,咖啡,奶茶太腻…结果手机突然震一下,群里有人问我:“东哥你之前不是说过 Spring Integration 很轻松能搞微服务之间传消息么?到底咋轻松?” 我当时哈,脑子已经半糊了,但还是忍不住嘴欠讲了半小时…现在说给你们听听…

我先喝口水…嗯继续…

你们知道吧,之前我们组那个小李,他就是写服务之间调用,每次都用 Feign,啥都 Feign,我说兄弟你不能啥都同步请求,对吧,你得异步啊。结果他死活嫌麻烦。后来我们搞一个库存系统和结算系统的对接,他一个同步链条啊…我靠,那延迟飙到两百多毫秒,像踩油门的三蹦子似的。

我那天就跟他说,“你用 Spring Integration 啊老弟,它这个…呃说简单点就是把消息在线程之间、服务之间…传一传,像你扔纸条一样,你不用管对面啥时候看,只管往管道里丢。” 他当时还说“难吧?”我直接让他看了示例代码,他当场闭麦。

我找下那个代码…等下…

@Bean
public MessageChannel orderChannel() {
    return new DirectChannel();  // 这个是直接通道,丢进去就走
}

@Bean
public IntegrationFlow orderFlow() {
    return IntegrationFlows.from("orderChannel")
            .handle(msg -> {
                System.out.println("收到订单消息: " + msg.getPayload());
            })
            .get();
}

你看,就这样…我靠是不是很简单… 你只要 orderChannel().send(new GenericMessage<>("hello")),它就啪一下跑到那个 handle 里了,你连 MQ 都不用连。 小李当时说:“东哥这不就是个本地异步?” 我说:“哎你别急,你把 Binder 换成 Kafka、RabbitMQ,那就是跨服务了兄弟。”

然后那天中午吃饭的时候,诶对了,我们那边食堂炸鸡腿真的巨干,你们千万别去…吃着吃着我跟他说 Spring Integration 的那个网关,他突然就开窍了。就是那个 Gateway,它能像方法调用一样,把消息丢到 Integration Flow 里,你代码看着还像同步,实际上里面是消息驱动。

@MessagingGateway(defaultRequestChannel = "payChannel")
public interface PayGateway {
    String callPay(String payload);
}

当时他愣住了说:“还能这样写?这不是比 Feign 还丝滑?” 我说是啊,但你别乱用,你要是把每条链路都改成异步你后面排查问题能找到你祖宗十八代。

我突然想起来我手机忘充电了…算了继续说…

你们记得我们有个业务是,每来一笔订单都要发短信、同时记账、同时写日志吧?以前我们三个线程池搞得跟菜市场似的,线程到处乱跑。 后来我用 Spring Integration 的 Publish-Subscribe flow,就是那个一进多出的。

就是这样——我打给你们看:

@Bean
public IntegrationFlow orderPubFlow() {
    return IntegrationFlows.from("orderIn")
            .publishSubscribeChannel(s -> s
                    .subscribe(f -> f.handle(msg -> sms(msg)))
                    .subscribe(f -> f.handle(msg -> billing(msg)))
                    .subscribe(f -> f.handle(msg -> audit(msg)))
            ).get();
}

一条消息,啪一下三份,省事得很。 我们那天在会议室调试,搞到十一点多,运维都要锁门了还催我们走…

不过这个东西我跟你们说噢,它好用是好用,但是你别…别以为它跟 Kafka 那种分布式消息一样能抗大流量。Spring Integration 更像是把你本地的消息流理顺,然后再配合 Spring Cloud Stream 去接 MQ。 你要拿它硬抗 10 万 TPS 我只能说你人没了。

哦对对我突然想到一个小坑,小李踩过: 他之前定义了一个 QueueChannel,然后疯狂丢消息进去不消费,结果内存直接爆了。 QueueChannel 默认是无界的,他不知道,你们千万别学他。

@Bean
public MessageChannel riskQueue() {
    return new QueueChannel(2000); // 指定容量!!!
}

一定要设容量,不然你排查 OOM 排到怀疑人生… 那天凌晨两点他电话打我,我还以为地震了。

啥…我刚讲到哪了…等一下我想想… 哦对,“轻松实现消息传递真香”这个事—— 其实真香的点不在于“会不会用”,而是你用了之后,你发现你原来代码里那种牵线木偶一样的依赖关系全没了。

有时候你一个请求到了服务 A,它丢给 Integration Flow,Flow 里异步跑三四个步骤,然后结果再给你返回…你压根不知道它里面搞了多大动静,代码却看着很干净。 就这点,小李天天说“东哥我悟了悟了”,我说悟你妹你把注释写清楚先。

哎我现在想喝冰美式…算了不说了我下楼买杯咖啡先,你要我继续讲怎么跟 MQ 接?还是讲它和 Spring Cloud Stream 的区别?你发我我回来继续说。

-END-

我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html


🔥东哥私藏精品🔥


东哥作为一名老码农,整理了全网最全《Java高级架构师资料合集》。总量高达650GB点击下方公众号回复关键字java 全部免费领取

【声明】内容源于网络
0
0
Java技术图谱
回复 java,领取Java面试题。分享AI编程,AI工具,Java教程,Java下载,Java技术栈,Java源码,Java课程,Java技术架构,Java基础教程,Java高级教程,idea教程,Java架构师,Java微服务架构。
内容 1111
粉丝 0
Java技术图谱 回复 java,领取Java面试题。分享AI编程,AI工具,Java教程,Java下载,Java技术栈,Java源码,Java课程,Java技术架构,Java基础教程,Java高级教程,idea教程,Java架构师,Java微服务架构。
总阅读36
粉丝0
内容1.1k