.net core實踐系列之短信服務-Sikiro.SMS.Bus服務的實現 .net core實踐系列之短信服務-Sikiro.SMS.Api服務的實現 .net core實踐系列之短信服務-Api

前言

前兩篇《.net core實踐系列之短信服務-Sikiro.SMS.Api服務的實現》、《.net core實踐系列之短信服務-Api的SDK的實現與測試》分別講解了API提供服務與SDK調用API實現。html

本篇會繼續講解Sikiro.SMS.Bus的服務實現,此實現是基於開篇的架構設計的擁有調度任務服務,在最後一篇會給架構優化的,拋棄了調度任務服務使用MQ代替。git

源碼地址:https://github.com/SkyChenSky/Sikiro.SMSgithub

功能流程描述

如上圖所示,消費者訂閱到消費消息後,經過工廠類建立出對應的短信運營商類,經過調用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應該會很熟悉。post

優點主要體現下面三點:測試

  • 基於控制檯應用
  • 調試方便
  • 易於安裝部署

很多人認爲,Core的出現,跨平臺加命令行的優點,能夠輕易的在Linux部署守護進程。難道還須要宿主框架?優化

然而並非全部公司選用了Linux系統的服務器,就像咱們公司。既然使用了Windows服務器應該將他部署爲Windows服務使其可視化方便管理,另外沒有等待到TopShelf的Core版本,所以我選擇了另外一款宿主框架:PeterKottas.DotNetCore.WindowsServiceurl

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實踐系列之短信服務-架構設計》看看做個補充,若是有任何建議,能夠在下方評論反饋給我。

相關文章
相關標籤/搜索