首页 > 其他分享 >第18篇 .net使用RabbitMQ实现短信密码重置

第18篇 .net使用RabbitMQ实现短信密码重置

时间:2024-09-08 11:51:33浏览次数:11  
标签:string 18 RabbitMQ public var net password queueName

在 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();
}
}

标签:string,18,RabbitMQ,public,var,net,password,queueName
From: https://www.cnblogs.com/chenshibao/p/18402707

相关文章

  • Network Policy使用场景
    Kubernetes中的NetworkPolicy是一种用于控制Pod之间网络通信的机制。它允许用户定义哪些Pod可以相互通信,从而提高集群的安全性和管理性。以下是一些常见的NetworkPolicy使用场景:1.微服务架构中的流量控制在微服务架构中,不同的服务可能需要限制对彼此的访问。通过NetworkPoli......
  • javase复习day18API
    游戏打包exeMathabs方法的小bug:以int类型为例,取值范围:-2147483648~2147483647如果没有正数与之对应,那么传递负数结果有误-2147483648没有正数对应则结果还是 -2147483648可以使用JDK15后的新方法absExact如果结果有误则会报错packageMathDemo1;publiccla......
  • Netty核心组件详解
    目录一、Netty使用和常用组件Netty的优势为什么不用Netty5为什么Netty使用NIO而不是AIO?为什么不用Mina?Bootstrap、EventLoop(Group)、Channel事件和ChannelHandler、ChannelPipelineChannelFuture第一个Netty程序二、Netty组件了解EventLoop和Eve......
  • YOLOv8改进实战 | 注意力篇 | 引入ICCV2023顶会LSKNet:大选择性卷积注意力模块LSKA,助力
    YOLOv8专栏导航:点击此处跳转前言YOLOv8是由YOLOv5的发布者Ultralytics发布的最新版本的YOLO。它可用于对象检测、分割、分类任务以及大型数据集的学习,并且可以在包括CPU和GPU在内的各种硬件上执行。YOLOv8是一种尖端的、最先进的(SOTA)模型,它建立在以前......
  • 【Kubernetes知识点问答题】Service 发现
    目录 1.Kubernetes如何在集群的Pod之间提供网络服务?2.解释iptables和IPVS代理模式Service的区别。3.举例说明ClusterIP类型Service的用法。4.举例说明NodePort类型Service的用法。5.举例说明Headless类型Service的用法。6.详细说明Ingress......
  • [2400-] ARC 171-180
    我好像还没写完所有题解。已经补/口胡到\(177\)。有的题写了也没价值啊??我真的有资格说没价值吗???你在这里看不到所有橙色以及以上的题的口胡,也许吧。\(\textbf{ARC171}\)\(\textbf{A-NoAttacking}\)\(\text{AT600,maths,brute.}\)车在对角线一个隔一个,剩下的兵看着......
  • CP AUTOSAR标准之EthernetInterface(AUTOSAR_SWS_EthernetInterface)(更新中……)
    1简介和功能概述  该规范指定了AUTOSAR基础软件模块以太网接口的功能、API和配置。  在AUTOSAR分层软件架构[1]中,以太网接口属于ECU抽象层,或者更准确地说,属于通信硬件抽象。  这表明了以太网接口的主要任务:  为上层提供独立于硬件的以太网通信系统接口,该系统由......
  • Mininet MAC地址学习:通过Mininet模拟二层交换机和两个主机,通过两个主机通信来了解交换
    一.MAC地址学习1.登录我们创建mininet的虚拟机,创建一个线型拓扑,控制器设置为无。2.查看全部节点,查看链路信息,然后查看节点信息3.再打开一个终端(Terminal窗口2),然后打开交换机s1和交换机s2的二层(因为交换机s1和交换机s2是两个SDN交换机,在启动Mininet时没有指定任何控制器,交......
  • k8s中Network Policy的实现原理
    Kubernetes中的NetworkPolicy是一种用于控制Pod之间网络流量的机制,主要用于增强安全性和隔离性。其实现原理可以从以下几个方面进行理解:1.定义和目标NetworkPolicy定义了一组规则,这些规则决定了哪些Pod可以与其他Pod进行通信。其主要目标是:限制Pod之间的流量。增强服务的......
  • 在OpenEuler(欧拉)系统上用kubeadm部署(k8s)Kubernetes集群
    一、OpenEuler(欧拉)系统简介openEuler 是开放原子开源基金会(OpenAtomFoundation)孵化及运营的开源项目;openEuler作为一个操作系统发行版平台,每两年推出一个LTS版本。该版本为企业级用户提供一个安全稳定可靠的操作系统。具体的介绍可以参考官网https://www.openeuler.org/......