前言
前兩篇《.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實踐系列之短信服務-架構設計》看看作個補充,如果有任何建議,可以在下方評論反饋給我。
