.net core实践系列之短信服务-Sikiro.SMS.Bus服务的实现

简介: .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


功能流程描述


image.png



如上图所示,消费者订阅到消费消息后,通过工厂类创建出对应的短信运营商类,通过调用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


目录
相关文章
|
1月前
|
开发框架 .NET C#
ASP.NET Core Blazor 路由配置和导航
大家好,我是码农刚子。本文系统介绍Blazor单页应用的路由机制,涵盖基础配置、路由参数、编程式导航及高级功能。通过@page指令定义路由,支持参数约束、可选参数与通配符捕获,结合NavigationManager实现页面跳转与参数传递,并演示用户管理、产品展示等典型场景,全面掌握Blazor路由从入门到实战的完整方案。
214 6
|
11月前
|
开发框架 .NET 开发者
简化 ASP.NET Core 依赖注入(DI)注册-Scrutor
Scrutor 是一个简化 ASP.NET Core 应用程序中依赖注入(DI)注册过程的开源库,支持自动扫描和注册服务。通过简单的配置,开发者可以轻松地从指定程序集中筛选、注册服务,并设置其生命周期,同时支持服务装饰等高级功能。适用于大型项目,提高代码的可维护性和简洁性。仓库地址:&lt;https://github.com/khellang/Scrutor&gt;
288 5
|
7月前
|
中间件 Go
Golang | Gin:net/http与Gin启动web服务的简单比较
总的来说,`net/http`和 `Gin`都是优秀的库,它们各有优缺点。你应该根据你的需求和经验来选择最适合你的工具。希望这个比较可以帮助你做出决策。
330 35
|
5月前
|
存储 缓存
.NET 6中Startup.cs文件注入本地缓存策略与服务生命周期管理实践:AddTransient, AddScoped, AddSingleton。
记住,选择正确的服务生命周期并妥善管理它们是至关重要的,因为它们直接影响你的应用程序的性能和行为。就像一个成功的建筑工地,工具箱如果整理得当,工具选择和使用得当,工地的整体效率将会大大提高。
226 0
|
开发框架 .NET C#
在 ASP.NET Core 中创建 gRPC 客户端和服务器
本文介绍了如何使用 gRPC 框架搭建一个简单的“Hello World”示例。首先创建了一个名为 GrpcDemo 的解决方案,其中包含一个 gRPC 服务端项目 GrpcServer 和一个客户端项目 GrpcClient。服务端通过定义 `greeter.proto` 文件中的服务和消息类型,实现了一个简单的问候服务 `GreeterService`。客户端则通过 gRPC 客户端库连接到服务端并调用其 `SayHello` 方法,展示了 gRPC 在 C# 中的基本使用方法。
258 5
在 ASP.NET Core 中创建 gRPC 客户端和服务器
|
11月前
|
开发框架 算法 中间件
ASP.NET Core 中的速率限制中间件
在ASP.NET Core中,速率限制中间件用于控制客户端请求速率,防止服务器过载并提高安全性。通过`AddRateLimiter`注册服务,并配置不同策略如固定窗口、滑动窗口、令牌桶和并发限制。这些策略可在全局、控制器或动作级别应用,支持自定义响应处理。使用中间件`UseRateLimiter`启用限流功能,并可通过属性禁用特定控制器或动作的限流。这有助于有效保护API免受滥用和过载。 欢迎关注我的公众号:Net分享 (239字符)
262 1
|
11月前
|
开发框架 缓存 .NET
GraphQL 与 ASP.NET Core 集成:从入门到精通
本文详细介绍了如何在ASP.NET Core中集成GraphQL,包括安装必要的NuGet包、创建GraphQL Schema、配置GraphQL服务等步骤。同时,文章还探讨了常见问题及其解决方法,如处理复杂查询、错误处理、性能优化和实现认证授权等,旨在帮助开发者构建灵活且高效的API。
324 3
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
Android远程连接和登录FTPS服务代码(commons.net库)
285 1
|
开发框架 JavaScript 前端开发
一个适用于 ASP.NET Core 的轻量级插件框架
一个适用于 ASP.NET Core 的轻量级插件框架
205 0
|
开发框架 前端开发 .NET
ASP.NET Core 核心特性学习笔记「下」
ASP.NET Core 核心特性学习笔记「下」

热门文章

最新文章