zoukankan      html  css  js  c++  java
  • .net core实践系列之短信服务-Sikiro.SMS.Bus服务的实现

    前言

    前两篇《.net core实践系列之短信服务-Sikiro.SMS.Api服务的实现》、《.net core实践系列之短信服务-Api的SDK的实现与测试》分别讲解了API提供服务与SDK调用API实现。

    本篇会继续讲解Sikiro.SMS.Bus的服务实现,此实现是基于开篇的架构设计的拥有调度任务服务,在最后一篇会给架构优化的,抛弃了调度任务服务使用MQ代替。

    源码地址:https://github.com/SkyChenSky/Sikiro.SMS

    功能流程描述

    如上图所示,消费者订阅到消费消息后,通过工厂类创建出对应的短信运营商类,通过调用Send方法进行对短信运营商服务请求,得到响应结果后对持久化数据的状态进行更新。假如中途遇到异常则回滚数据状态,等待下一次调度任务进行调度。

    下面是MainService的代码示例:

      public class MainService : IMicroService
        {
            private readonly IBus _bus;
            private readonly SmsService _smsService;
    
            public MainService(IBus bus, SmsService smsService)
            {
                _bus = bus;
                _smsService = smsService;
            }
    
            public void Start()
            {
                Console.WriteLine("I started");
    
                _bus.Subscribe<SmsQueueModel>("", msg =>
                {
                    try
                    {
                        _smsService.Send(msg.MapTo<SmsQueueModel, SmsModel>());
                    }
                    catch (Exception e)
                    {
                        _smsService.RollBack();
                        e.WriteToFile();
                    }
                });
            }
    
            public void Stop()
            {
                ConfigServer.Container?.Dispose();
                Console.WriteLine("I stopped");
            }
        }

    下面是SmsService的代码示例:

    public void Send(SmsModel item)
            {
                Sms = item;
    
                var isSuccess = _smsFactory.Create(item.Type).SendSMS(item.Mobiles, item.Content, _configuration["Sms:SignName"]);
                if (isSuccess)
                    Success(item.Id);
                else
                    Fail(item.Id);
            }
    
            public void RollBack()
            {
                RollBack(Sms.Id);
            }
    
            public void RollBack(string id)
            {
                _mongoProxy.Update<SmsModel>(a => a.Id == id,
                    a => new SmsModel { Status = SmsEnums.SmsStatus.待处理 });
            }
    
            private void Success(string id)
            {
                _mongoProxy.Update<SmsModel>(a => a.Id == id,
                    a => new SmsModel { Status = SmsEnums.SmsStatus.成功 });
            }
    
            private void Fail(string id)
            {
                _mongoProxy.Update<SmsModel>(a => a.Id == id,
                    a => new SmsModel { Status = SmsEnums.SmsStatus.失败 });
            }

    组件选择

    宿主框架

    对于有在.Net Framework上开发Windows服务的朋友对TopShelf应该会很熟悉。

    优势主要体现下面三点:

    • 基于控制台应用
    • 调试方便
    • 易于安装部署

    不少人认为,Core的出现,跨平台加命令行的优势,可以轻易的在Linux部署守护进程。难道还需要宿主框架?

    然而并不是所有公司选用了Linux系统的服务器,就像我们公司。既然使用了Windows服务器应该将他部署为Windows服务使其可视化方便管理,另外没有等待到TopShelf的Core版本,因此我选择了另一款宿主框架:PeterKottas.DotNetCore.WindowsService

    PeterKottas.DotNetCore.WindowsService

    源码地址:https://github.com/PeterKottas/DotNetCore.WindowsService

    虽然比不起TopShelf的功能强大,但是对于一般的需求使用基本满足,而且使用方式也与TopShelf相似。下面是使用示例:

    class Program
        {
            static void Main(string[] args)
            {
                ServiceRunner<MainService>.Run(config =>
                {
                    config.SetServiceInfo();
    
                    config.Service(serviceConfig =>
                    {
                        serviceConfig.UseAutofac();
                        serviceConfig.UseServiceFactory();
    
                        serviceConfig.OnStart((service, extraParams) =>
                        {
                            service.Start();
                        });
                            
                        serviceConfig.OnStop(service =>
                        {
                            service.Stop();
                        });
    
                        serviceConfig.OnError(Console.WriteLine);
                    });
                });
            }
        }

    下面是安装卸载的命令示例:“

    dotnet Sikiro.SMS.BUS.dll action:install
    dotnet Sikiro.SMS.BUS.dll action:uninstall

    结尾

    这里就是本篇的内容,相比于前面几篇的内容相对少点,如果有中途来看的朋友可以把《.net core实践系列之短信服务-架构设计》看看作个补充,如果有任何建议,可以在下方评论反馈给我。

  • 相关阅读:
    python 多进程-03 进程池
    python 多进程-02 进程间数据共享
    python 多进程-01 基本使用
    python 多线程-02 线程池
    开发者入驻
    小程序组件 scroll-view 下拉加载更多,触底触发事件,容器高度设置
    Array.from在360浏览器和IE浏览器兼容问题
    获取cookie
    背景图左右居中
    uniapp使用uni.setStorageAsync刷新页面数据丢失问题
  • 原文地址:https://www.cnblogs.com/skychen1218/p/9621815.html
Copyright © 2011-2022 走看看