.NET 使用 RabbitMQ 实现短信密码重置

170 阅读3分钟

前言

在 C# 中使用 RabbitMQ 通过短信发送重置后的密码到用户的手机号上,你可以按照以下步骤进行。

正文

1、安装 RabbitMQ 客户端库

首先,确保你已经安装了 RabbitMQ 客户端库。你可以通过 NuGet 包管理器来安装:

dotnet add package RabbitMQ.Client

2、创建 RabbitMQ 连接和通道

创建一个 RabbitMQ 连接和通道,用于发送消息。

using RabbitMQ.Client;
using System;
using System.Text;

public class RabbitMQHelper
{
    private readonly string _hostName;
    private readonly string _userName;
    private readonly string _password;
    private readonly string _queueName;

    public RabbitMQHelper(string hostName, string userName, string password, string queueName)
    {
        _hostName = hostName;
        _userName = userName;
        _password = password;
        _queueName = queueName;
    }

    public void SendMessage(string message)
    {
        var factory = new ConnectionFactory()
        {
            HostName = _hostName,
            UserName = _userName,
            Password = _password
        };

        using (var connection = factory.CreateConnection())
        using (var channel = connection.CreateModel())
        {
            channel.QueueDeclare(queue: _queueName,
                                 durable: false,
                                 exclusive: false,
                                 autoDelete: false,
                                 arguments: null);

            var body = Encoding.UTF8.GetBytes(message);

            channel.BasicPublish(exchange: "",
                                 routingKey: _queueName,
                                 basicProperties: null,
                                 body: body);

            Console.WriteLine($" [x] Sent {message}");
        }
    }
}

3、创建短信发送服务

创建一个短信发送服务,用于处理从 RabbitMQ 接收到的消息并发送短信。

public class SmsService
{
    public void SendSms(string phoneNumber, string message)
    {
        // 在这里实现短信发送逻辑
        Console.WriteLine($"Sending SMS to {phoneNumber}: {message}");
    }
}

4、创建 RabbitMQ 消费者

创建一个 RabbitMQ 消费者,用于从队列中接收消息并调用短信发送服务。

using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Text;

public class RabbitMQConsumer
{
    private readonly string _hostName;
    private readonly string _userName;
    private readonly string _password;
    private readonly string _queueName;
    private readonly SmsService _smsService;

    public RabbitMQConsumer(string hostName, string userName, string password, string queueName, SmsService smsService)
    {
        _hostName = hostName;
        _userName = userName;
        _password = password;
        _queueName = queueName;
        _smsService = smsService;
    }

    public void StartConsuming()
    {
        var factory = new ConnectionFactory()
        {
            HostName = _hostName,
            UserName = _userName,
            Password = _password
        };

        using (var connection = factory.CreateConnection())
        using (var channel = connection.CreateModel())
        {
            channel.QueueDeclare(queue: _queueName,
                                 durable: false,
                                 exclusive: false,
                                 autoDelete: false,
                                 arguments: null);

            var consumer = new EventingBasicConsumer(channel);
            consumer.Received += (model, ea) =>
            {
                var body = ea.Body.ToArray();
                var message = Encoding.UTF8.GetString(body);
                var phoneNumber = "user_phone_number"; // 从消息中解析出手机号
                _smsService.SendSms(phoneNumber, message);
            };

            channel.BasicConsume(queue: _queueName,
                                 autoAck: true,
                                 consumer: consumer);

            Console.WriteLine(" Press [enter] to exit.");
            Console.ReadLine();
        }
    }
}

5、集成到用户密码重置流程

在你的用户密码重置流程中,生成新的密码并将其发送到 RabbitMQ 队列。

public class UserService
{
    private readonly RabbitMQHelper _rabbitMQHelper;

    public UserService(RabbitMQHelper rabbitMQHelper)
    {
        _rabbitMQHelper = rabbitMQHelper;
    }

    public void ResetPassword(Guid userId)
    {
        // 生成新的密码
        string newPassword = GeneratePassword();

        // 将新密码发送到 RabbitMQ 队列
        string message = $"Your new password is: {newPassword}";
        _rabbitMQHelper.SendMessage(message);

        // 其他逻辑,例如更新数据库中的密码
    }

    private string GeneratePassword()
    {
        // 生成随机密码的逻辑
        return "random_password";
    }
}

6、启动 RabbitMQ 消费者

在应用程序启动时,启动 RabbitMQ 消费者以处理消息。

public class Program
{
    public static void Main(string[] args)
    {
        string hostName = "localhost";
        string userName = "guest";
        string password = "guest";
        string queueName = "sms_queue";

        var smsService = new SmsService();
        var rabbitMQConsumer = new RabbitMQConsumer(hostName, userName, password, queueName, smsService);

        // 启动消费者
        rabbitMQConsumer.StartConsuming();
    }
}

7、配置 RabbitMQ 连接信息

确保你的 RabbitMQ 连接信息(主机名、用户名、密码、队列名)是正确的,并且 RabbitMQ 服务器正在运行。

示例代码

以下是一个完整的示例代码,展示如何使用 RabbitMQ 通过短信发送重置后的密码到用户的手机号上:

using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Text;

public class RabbitMQHelper
{
    private readonly string _hostName;
    private readonly string _userName;
    private readonly string _password;
    private readonly string _queueName;

    public RabbitMQHelper(string hostName, string userName, string password, string queueName)
    {
        _hostName = hostName;
        _userName = userName;
        _password = password;
        _queueName = queueName;
    }

    public void SendMessage(string message)
    {
        var factory = new ConnectionFactory()
        {
            HostName = _hostName,
            UserName = _userName,
            Password = _password
        };

        using (var connection = factory.CreateConnection())
        using (var channel = connection.CreateModel())
        {
            channel.QueueDeclare(queue: _queueName,
                                 durable: false,
                                 exclusive: false,
                                 autoDelete: false,
                                 arguments: null);

            var body = Encoding.UTF8.GetBytes(message);

            channel.BasicPublish(exchange: "",
                                 routingKey: _queueName,
                                 basicProperties: null,
                                 body: body);

            Console.WriteLine($" [x] Sent {message}");
        }
    }
}

public class SmsService
{
    public void SendSms(string phoneNumber, string message)
    {
        // 在这里实现短信发送逻辑
        Console.WriteLine($"Sending SMS to {phoneNumber}: {message}");
    }
}

public class RabbitMQConsumer
{
    private readonly string _hostName;
    private readonly string _userName;
    private readonly string _password;
    private readonly string _queueName;
    private readonly SmsService _smsService;

    public RabbitMQConsumer(string hostName, string userName, string password, string queueName, SmsService smsService)
    {
        _hostName = hostName;
        _userName = userName;
        _password = password;
        _queueName = queueName;
        _smsService = smsService;
    }

    public void StartConsuming()
    {
        var factory = new ConnectionFactory()
        {
            HostName = _hostName,
            UserName = _userName,
            Password = _password
        };

        using (var connection = factory.CreateConnection())
        using (var channel = connection.CreateModel())
        {
            channel.QueueDeclare(queue: _queueName,
                                 durable: false,
                                 exclusive: false,
                                 autoDelete: false,
                                 arguments: null);

            var consumer = new EventingBasicConsumer(channel);
            consumer.Received += (model, ea) =>
            {
                var body = ea.Body.ToArray();
                var message = Encoding.UTF8.GetString(body);
                var phoneNumber = "user_phone_number"; // 从消息中解析出手机号
                _smsService.SendSms(phoneNumber, message);
            };

            channel.BasicConsume(queue: _queueName,
                                 autoAck: true,
                                 consumer: consumer);

            Console.WriteLine(" Press [enter] to exit.");
            Console.ReadLine();
        }
    }
}

public class UserService
{
    private readonly RabbitMQHelper _rabbitMQHelper;

    public UserService(RabbitMQHelper rabbitMQHelper)
    {
        _rabbitMQHelper = rabbitMQHelper;
    }

    public void ResetPassword(Guid userId)
    {
        // 生成新的密码
        string newPassword = GeneratePassword();

        // 将新密码发送到 RabbitMQ 队列
        string message = $"Your new password is: {newPassword}";
        _rabbitMQHelper.SendMessage(message);

        // 其他逻辑,例如更新数据库中的密码
    }

    private string GeneratePassword()
    {
        // 生成随机密码的逻辑
        return "random_password";
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        string hostName = "localhost";
        string userName = "guest";
        string password = "guest";
        string queueName = "sms_queue";

        var smsService = new SmsService();
        var rabbitMQConsumer = new RabbitMQConsumer(hostName, userName, password, queueName, smsService);

        // 启动消费者
        rabbitMQConsumer.StartConsuming();
    }
}

总结

本文详细介绍了如何使用 .NET 和 RabbitMQ 实现短信密码重置功能。通过结合消息队列的优势,我们不仅增强了系统的解耦能力,还提高了处理短信验证码请求的可靠性和效率。

希望本文能为大家在构建类似功能时提供有益的参考与启示。

最后

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。

也可以加入微信公众号 [DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!

优秀是一种习惯,欢迎大家留言学习!

作者:似梦亦非梦

出处:cnblogs.com/chenshibao/p/18402707

声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!