Wolverine项目教程:基于TCP协议的Ping/Pong消息交互实现
介绍
本文将介绍如何使用Wolverine框架实现基于TCP协议的Ping/Pong消息交互模式。这种模式是分布式系统中常见的基础通信模式,非常适合用来演示消息传递的基本原理。
项目准备
首先我们需要定义两个简单的消息类,它们将被用作Ping和Pong消息的载体:
public class Ping
{
public int Number { get; set; }
}
public class Pong
{
public int Number { get; set; }
}
这两个类非常简单,只包含一个Number属性用于标识消息序号。在实际应用中,消息类可以包含更多业务相关的属性。
Pinger服务实现
Pinger服务负责定期发送Ping消息并接收Pong响应。我们使用Worker Service模板创建这个服务。
服务配置
return await Host.CreateDefaultBuilder(args)
.UseWolverine(opts =>
{
// 监听5580端口接收Pong消息
opts.ListenAtPort(5580);
// 将所有Ping消息路由到5581端口
opts.PublishMessage<Ping>().ToPort(5581);
// 添加后台服务
opts.Services.AddHostedService<Worker>();
})
.RunJasperFxCommands(args);
这段配置代码做了三件事:
- 设置服务监听5580端口接收消息
- 配置所有Ping消息发送到5581端口
- 注册后台Worker服务
Worker服务实现
public class Worker : BackgroundService
{
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
var pingNumber = 1;
await using var scope= _serviceProvider.CreateAsyncScope();
var bus = scope.ServiceProvider.GetRequiredService<IMessageBus>();
while (!stoppingToken.IsCancellationRequested)
{
await Task.Delay(1000, stoppingToken);
_logger.LogInformation("Sending Ping #{Number}", pingNumber);
await bus.PublishAsync(new Ping { Number = pingNumber });
pingNumber++;
}
}
}
Worker服务每隔1秒发送一个Ping消息,并递增消息序号。这里使用了Wolverine的IMessageBus接口来发布消息。
Pong消息处理
public class PongHandler
{
public void Handle(Pong pong, ILogger<PongHandler> logger)
{
logger.LogInformation("Received Pong #{Number}", pong.Number);
}
}
PongHandler负责处理从Ponger服务返回的Pong消息,简单记录日志即可。
Ponger服务实现
Ponger服务负责接收Ping消息并返回Pong响应。
服务配置
return await Host.CreateDefaultBuilder(args)
.UseWolverine(opts =>
{
opts.ApplicationAssembly = typeof(Program).Assembly;
opts.ListenAtPort(5581);
})
.RunJasperFxCommands(args);
Ponger服务配置更简单,只需要监听5581端口即可。
Ping消息处理
public class PingHandler
{
public ValueTask Handle(Ping ping, ILogger<PingHandler> logger, IMessageContext context)
{
logger.LogInformation("Got Ping #{Number}", ping.Number);
return context.RespondToSenderAsync(new Pong { Number = ping.Number });
}
}
PingHandler接收到Ping消息后,会立即通过context.RespondToSenderAsync方法返回一个Pong响应。这里的关键点是响应会被自动发送回消息的原始发送者,而不需要显式指定目标地址。
运行效果
启动两个服务后,可以看到如下输出:
Pinger服务输出:
Sending Ping #1
Received Pong #1
Sending Ping #2
Received Pong #2
...
Ponger服务输出:
Got Ping #1
Got Ping #2
...
技术要点
-
TCP传输:Wolverine内置了TCP传输支持,可以轻松配置端口监听和消息路由。
-
消息路由:通过PublishMessage方法可以配置特定消息类型的路由规则。
-
请求-响应模式:使用RespondToSenderAsync方法可以轻松实现请求-响应模式。
-
依赖注入:消息处理器支持依赖注入,可以方便地获取Logger等服务。
-
异步处理:整个消息处理流程都是异步的,确保高性能。
扩展思考
这个简单的Ping/Pong示例展示了Wolverine的基本消息处理能力。在实际应用中,可以考虑:
- 添加消息序列化支持
- 实现消息重试机制
- 添加消息验证
- 实现更复杂的路由规则
- 集成其他传输协议如RabbitMQ、Kafka等
通过这个教程,读者可以快速掌握Wolverine的基本使用方法,为构建更复杂的分布式系统打下基础。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考