.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当然也可以,但就发 ...
随机推荐
- screen mac linux下一种让程序后台运行的方法
1: screen 场景的意思.字面意思就是软件运行在不同场景 (1)创建会话 使用命令“screen -S RunWork”来创建一个screen会话,命令执行之后,就会得到一个新的shell窗口, ...
- NB-IOT模块 M5310-A接入百度开放云IOT Hub MQTT
目录 1.登陆百度开放云,在产品服务中选择IOT HUB 2 2.选择 创建计费套餐,目前1百万条/每月是免费的 2 3.点击管理控制台进入项目列表 4 4. 点击创建项目,项目类型选择数据型 4 5 ...
- tkinter学习系列(四)之Button 控件
目录 目录 前言 (一)基本用法和可选属性 ==1.基本用法== ==2.可选属性== (二)属性的具体实现和案例 ==1.常用属性== ==案例一== ==2.按钮里的图片== ==案例二== == ...
- Centos7.2中安装pip
CentOS安装python-pip 在使用Python时,需要导入一些第三方工具包,一般情况下,鼓励使用pip来安装管理这些第三方的包, 这里我们来看一下如何在CentOS 7.2上安装Python ...
- C++基础算法学习——逆波兰表达式问题
例题:逆波兰表达式逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 ...
- VRS生成的虚拟观测值存在的问题
目前生成的虚拟观测值. 天津的版本,如果有数据库中有天线类型,那么会对天线类型改正了两次. 解决方法:在生成虚拟观测值编码的部分,注释掉天线改正的部分. 对结果的影响:错误版本生成的虚拟观测值,移动站 ...
- beta版本汇总
deta版本五天汇总 day1 day2 day3 day4 day5 GitHub地址 前端代码github地址 后端代码github地址 这里说明一下我们队伍的安排风格: 第一天:明确安排前后端的 ...
- IOS - 执行时 (经常使用函数)
能够通过NSObject的一些方法获取运行时信息或动态运行一些消息: /*Returns a Boolean value that indicates whether the receiving cl ...
- Eclipse字体最好
改变字体 windows->Preferences->General->Appearance->Colors and Fonts 右边选择Java ->Java Edit ...
- luogu P2000 拯救世界
嘟嘟嘟 题目有点坑,要你求的多少大阵指的是召唤kkk的大阵数 * lzn的大阵数,不是相加. 看到这个限制条件,显然要用生成函数推一推. 比如第一个条件"金神石的块数必须是6的倍数" ...