.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实践系列之短信服务-架构设计》看看作个补充,如果有任何建议,可以在下方评论反馈给我。
.net core实践系列之短信服务-Sikiro.SMS.Bus服务的实现的更多相关文章
- .net core实践系列之短信服务-目录
前言 经过两周多的业余时间,终于把该系列的文章写完了.第一次写系列,可能部分关键点并没有覆盖到,如果有疑问的朋友可以随时反馈给我.另外也感谢在我发布文章时给予我方案建议与反馈源码BUG的朋友们.下面是 ...
- .net core实践系列之短信服务-架构设计
前言 上篇<.net core实践系列之短信服务-为什么选择.net core(开篇)>简单的介绍了(水了一篇).net core.这次针对短信服务的架构设计和技术栈的简析. 源码地址:h ...
- .net core实践系列之短信服务-Sikiro.SMS.Api服务的实现
前言 上篇<.net core实践系列之短信服务-架构设计>介绍了我对短信服务的架构设计,同时针对场景解析了我的设计理念.本篇继续讲解Api服务的实现过程. 源码地址:https://gi ...
- .net core实践系列之短信服务-Api的SDK的实现与测试
前言 上一篇<.net core实践系列之短信服务-Sikiro.SMS.Api服务的实现>讲解了API的设计与实现,本篇主要讲解编写接口的SDK编写还有API的测试. 或许有些人会认为, ...
- .net core实践系列之短信服务-Sikiro.SMS.Job服务的实现
前言 本篇会继续讲解Sikiro.SMS.Job服务的实现,在我写第一篇的时候,我就发现我当时设计的架构里Sikiro.SMS.Job这个可以选择不需要,而使用MQ代替.但是为了说明调度任务使用实现也 ...
- .net core实践系列之短信服务-架构优化
前言 通过前面的几篇文章,讲解了一个短信服务的架构设计与实现.然而初始方案并非100%完美的,我们仍可以对该架构做一些优化与调整. 同时我也希望通过这篇文章与大家分享一下,我的架构设计理念. 源码地址 ...
- .net core实践系列之短信服务-为什么选择.net core(开篇)
前言 从今天我将会写.net core实战系列,以我最近完成的短信服务作为例子.该系列将会尽量以最短的时间全部发布出来.源码也将优先开源出来给大家. 源码地址:https://github.com/S ...
- .net core实践系列之SSO-跨域实现
前言 接着上篇的<.net core实践系列之SSO-同域实现>,这次来聊聊SSO跨域的实现方式.这次虽说是.net core实践,但是核心点使用jquery居多. 建议看这篇文章的朋友可 ...
- .net core 使用阿里云短信发送SMS
阿里云官方的skd(aliyun-net-sdk-core,aliyun-net-sdk-dysmsapi)在dnc中发送短信会出错,nuget上的包貌似也一样不管用.直接改下sdk当然也可以,但就发 ...
随机推荐
- word中从正文开始编码的方法
假如第1页和第2页是首页和目录,你想从第3页的正文开始设置页码 1. 将光标移到第二页的最后位置,点击插入“分隔符”,选择“分节类型”的“下一页”,确定.这时光标自动移到第三页. 2. 点击插入页码, ...
- Android中SELinux的TE简介【转】
转自:https://blog.csdn.net/murphykwu/article/details/52457667 selinux的概念如上一篇链接所示: http://www.cnblogs.c ...
- python 机器学习中模型评估和调参
在做数据处理时,需要用到不同的手法,如特征标准化,主成分分析,等等会重复用到某些参数,sklearn中提供了管道,可以一次性的解决该问题 先展示先通常的做法 import pandas as pd f ...
- Linux 小知识翻译 - 「X Window系统」
X Window System是给Unix系的OS提供的一套窗口管理软件或者说是组件.X Window System已经成为了在Linux上使用GUI环境的不可或缺的东西了. X Window Sys ...
- Unity Ulua1.03优化记录
现在项目的框架是在2015年设计的,那时候Ulua还处于1.03版本,现在回头再看,Ulua已经迭代到1.25版本,中间引入带有wraper的cstolua,而后转向现有的toLua#版本. 随着版本 ...
- account
Account Doc V3_ADD 1. 用户头像 用户头像今后会放在阿里云上,所以: dev: http(s)://pyserver.oss-cn-hangzhou.aliyuncs.com/DE ...
- 【WebLogic】weblogic调优
版权声明:本文为博主原创文章(原文:blog.csdn.net/clark_xu 徐长亮的专栏),未经博主同意不得转载. https://blog.csdn.net/u011538954/articl ...
- centos7下安装docker(12.2自定义网络)
通常默认的情况下我们使用的是docker的bridge的网络,用户也可以根据自己的业务需要,创建user-defined docker 提供三种user-defined网络驱动:bridge,over ...
- 生成条形码插件 条形码--JsBarcode
每天学习一点点 编程PDF电子书免费下载: http://www.shitanlife.com/code 介绍一下在GitHub生成条形码的js插件→JsBarcode 条码支持的有: CODE128 ...
- MATLAB中floor、round、ceil、fix区别
Matlab取整函数有: fix, floor, ceil, round.具体应用方法如下:fix朝零方向取整,如fix(-1.3)=-1; fix(1.3)=1;floor,顾名思义,就是地板,所以 ...