10bet
  咨询电话:15110761028

10BET登录

.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:installdotnet Sikiro.SMS.BUS.dll action:uninstall

结尾

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

 

, 1, 0, 9);