Spring Integration接收TCP与UDP请求
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
1. 简介
Spring Integration 是一个开源的项目它是 Spring 生态系统的一部分旨在简化企业集成Enterprise Integration的开发。它提供了一种构建消息驱动的、松散耦合的、可扩展的企业应用集成解决方案的方式。Spring Integration 基于 Spring Framework 构建使开发者能够更容易地将不同的系统、应用程序和服务整合到一个协调的整体中。
Spring Integration 主要有以下作用
- 消息驱动的集成Spring Integration 基于消息传递的模式允许系统和应用程序通过消息进行通信。这种模式可以用于异步集成以确保系统能够松散耦合以及在高负载和大规模情况下具有良好的性能。
- 模块化和可扩展Spring Integration 提供了一组模块每个模块都用于处理特定类型的集成需求。这些模块可以按需组合和扩展使开发者能够根据应用程序的需要选择合适的模块并自定义它们。
- 集成各种传输协议和数据格式Spring Integration 支持各种传输协议例如HTTP、JMS、FTP、SMTP等和数据格式例如JSON、XML、CSV等以便实现不同系统之间的数据传输和转换。
- 企业模式的集成Spring Integration 提供了一些企业集成模式的实现例如消息路由、消息转换、消息过滤、消息聚合等以帮助解决不同场景下的集成挑战。
- 与 Spring 生态系统的集成Spring Integration 与 Spring Framework 和 Spring Boot 紧密集成开发者可以轻松整合已有的 Spring 应用程序同时利用 Spring 的依赖注入和 AOP面向切面编程等功能。
2. 代码实战
本文主要介绍 Spring Integration 接收TCP与UDP请求的示例。在项目中我们偶尔需要接收其他服务的TCP与UDP请求此时使用Netty可能会过度设计想要一个轻量级nio的TCP、UDP服务端的话我们可以选择 Spring Integration。
环境
- JDK21
- SpringBoot 3.1.4
- Spring Integration 6.1.3
2.1 导入依赖
<!-- 父工程主要用作版本管控 --> | |
<parent> | |
<groupId>org.springframework.boot</groupId> | |
<artifactId>spring-boot-starter-parent</artifactId> | |
<version>3.1.4</version> | |
<relativePath /> | |
</parent> | |
<!-- springboot-web --> | |
<dependency> | |
<groupId>org.springframework.boot</groupId> | |
<artifactId>spring-boot-starter-web</artifactId> | |
</dependency> | |
<!-- spring-integration --> | |
<dependency> | |
<groupId>org.springframework.integration</groupId> | |
<artifactId>spring-integration-ip</artifactId> | |
</dependency> |
注意如果你的SpringBoot版本是2.x版本那么你需要使用JDK21以下的版本因为JDK中的包名有所更改。
2.2 建立TCP服务端
新建配置类TcpServerConfig
其中tcp.server.port
需要到application.yml
或者application.properties
中进行配置。或者你也可以直接填写端口。
import lombok.extern.slf4j.Slf4j; | |
import org.springframework.beans.factory.annotation.Autowired; | |
import org.springframework.beans.factory.annotation.Value; | |
import org.springframework.context.annotation.Bean; | |
import org.springframework.context.annotation.Configuration; | |
import org.springframework.integration.annotation.ServiceActivator; | |
import org.springframework.integration.channel.DirectChannel; | |
import org.springframework.integration.ip.tcp.TcpReceivingChannelAdapter; | |
import org.springframework.integration.ip.tcp.connection.AbstractServerConnectionFactory; | |
import org.springframework.integration.ip.tcp.connection.TcpNioServerConnectionFactory; | |
@Slf4j | |
@Configuration | |
public class TcpServerConfig { | |
@Value("${tcp.server.port}") | |
private int PORT; | |
/** | |
* 创建连接工厂 | |
* @return | |
*/ | |
@Bean | |
public AbstractServerConnectionFactory serverConnectionFactory() { | |
TcpNioServerConnectionFactory tcpNioServerConnectionFactory = new TcpNioServerConnectionFactory(PORT); | |
tcpNioServerConnectionFactory.setUsingDirectBuffers(true); | |
return tcpNioServerConnectionFactory; | |
} | |
/** | |
* 创建消息通道 | |
* @return | |
*/ | |
@Bean | |
public DirectChannel tcpReceiveChannel() { | |
return new DirectChannel(); | |
} | |
/** | |
* 创建tcp接收通道适配器 | |
* @return | |
*/ | |
@Bean | |
public TcpReceivingChannelAdapter inboundAdapter() { | |
TcpReceivingChannelAdapter adapter = new TcpReceivingChannelAdapter(); | |
adapter.setConnectionFactory(serverConnectionFactory()); | |
adapter.setOutputChannelName("tcpReceiveChannel"); | |
return adapter; | |
} | |
/** | |
* 处理请求器 | |
* @param message | |
*/ | |
@ServiceActivator(inputChannel = "tcpReceiveChannel") | |
public void messageReceiver(byte[] message) { | |
// 处理接收到的TCP消息 | |
log.info("处理TCP请求"); | |
} | |
} |
注意在发送tcp报文的时候tcp报文需要以
\r\n
结尾否则无法正常接收报文。
2.3 建立UDP服务端
新建配置类UdpServerConfig
其中udp.server.port
需要到application.yml
或者application.properties
中进行配置。或者你也可以直接填写端口。
import lombok.extern.slf4j.Slf4j; | |
import org.springframework.beans.factory.annotation.Autowired; | |
import org.springframework.beans.factory.annotation.Value; | |
import org.springframework.context.annotation.Bean; | |
import org.springframework.context.annotation.Configuration; | |
import org.springframework.integration.annotation.ServiceActivator; | |
import org.springframework.integration.channel.DirectChannel; | |
import org.springframework.integration.dsl.IntegrationFlow; | |
import org.springframework.integration.ip.dsl.Udp; | |
import org.springframework.messaging.Message; | |
@Slf4j | |
@Configuration | |
public class UdpServerConfig { | |
@Value("${udp.server.port}") | |
private int PORT; | |
/** | |
* 创建UDP服务器接收通道适配器 | |
* @return | |
*/ | |
@Bean | |
public IntegrationFlow udpIn() { | |
return IntegrationFlow.from(Udp.inboundAdapter(PORT)) | |
.channel("udpReceiveChannel") | |
.get(); | |
} | |
/** | |
* 创建消息接收通道 | |
* @return | |
*/ | |
@Bean | |
public DirectChannel udpReceiveChannel() { | |
return new DirectChannel(); | |
} | |
/** | |
* 处理接收到的UDP消息 | |
* @param message | |
*/ | |
@ServiceActivator(inputChannel = "udpReceiveChannel") | |
public void udpHandleMessage(Message<byte[]> message) { | |
// 处理接收到的UDP消息 | |
byte[] payload = message.getPayload(); | |
log.info("处理UDP请求"); | |
} | |
} |
3. 总结
对比NettySpring Integration比较轻量级也更容易集成到 SpringBoot 中但是性能肯定不如Netty。这里也只是给接收TCP、UDP请求设计方面多一个选择。