Net6新平台设计

Net6 平台

用于快点开发webapi设计的框架,含有日志、缓存、Camstar接口(XMLClient)、分布式锁、异常记录、数据仓库、数据分析功能。

其中数据仓库使用的是大数据存储方案为数据分析准备的处理以亿级别以上的数据。
整体框架图

image.png

CI/CD:持续集成、持续交付和持续部署。 用于快速发布、管理代码、管理应用服务器。

GitLab 提升开发人员代码发布的时间90%。

编写代码数据仓库整理 :用于提升数据分析与报表的速度。

框架设计图

预定义的数据源。

CamstarWip, CamstarODS, CamstarInt, ORADW,JDE

定义名称空间。

Multek.Applications.Services.Impl.Entity.FirstCode

定义类与数据库存放地址

 [SugarTable(TableName = "SYS_Audit")]
    [SqlSugar.ClickHouse.CKTable(@"engine = MergeTree PARTITION BY toYYYYMM(UpdatedAt)  ORDER BY (UpdatedAt) SETTINGS index_granularity = 8192;")]
    [Tenant(DataNameEnum.ClickHouse)]

定义字段

/// <summary>
        /// 主键
        /// </summary>
        public DateTime UpdatedAt { get; set; }
        /// <summary>
        /// 表名
        /// </summary>
        public string TableName { get; set; }
        /// <summary>
        /// 原始值
        /// </summary>
        public string? OriginalValues { get; set; }
        /// <summary>
        /// 新值
        /// </summary>
        public string? NewValues { get; set; }
        /// <summary>
        /// 主键
        /// </summary>
        public string? KeyValues { get; set; }
        /// <summary>
        /// 操作状态
        /// </summary>
        public DataOperationEnum OperationType { get; set; }

        public string Properties { get; set; }

        public string? UpdatedBy { get; set; }

定义业务执行方法

public Paraments InitData(DateTime startTime, DateTime endTime, Paraments key)
        {
            // 存在的主键是否更新数据
            bool _isUpdate = false;
            if (key == null)
            {
                key = new Paraments() { SystemDate = new DateTime(2023, 8, 1, 0, 0, 0) };
            }
            //获取数据
            var _initData = DataORMMain.Db.GetConnection(DataNameEnum.Quest).Queryable<QuestAuditEntry>().Where(x => x.UpdatedAt > key.SystemDate).ToList();
            // 保存数据
            if (_initData.Count > 0)
            {
                DataORMMain.Save(_initData, DataNameEnum.ClickHouse, _isUpdate);
                key.SystemDate = _initData.Max(x => x.UpdatedAt);
            }
            return key;
        }

业务获取数据方法

//获取数据
            var _initData = DataORMMain.Db.GetConnection(DataNameEnum.Quest).Queryable<QuestAuditEntry>().Where(x => x.UpdatedAt > key.SystemDate).ToList();

业务数据保存方法

// 保存数据
            if (_initData.Count > 0)
            {
                DataORMMain.Save(_initData, DataNameEnum.ClickHouse, _isUpdate);
                key.SystemDate = _initData.Max(x => x.UpdatedAt);
            }

业务数据是否更新

bool _isUpdate = false;

设置下自定义参数列表

 /// <summary>
        /// 参数列表
        /// </summary>
        public class Paraments
        {
            public DateTime SystemDate;
        }

设置下一执行的参数

// 保存数据
            if (_initData.Count > 0)
            {
                DataORMMain.Save(_initData, DataNameEnum.ClickHouse, _isUpdate);
                key.SystemDate = _initData.Max(x => x.UpdatedAt);
            }

整个类

using Multek.Applications.Services.Impl.DataWarehouse;
using Multek.Library_Core.Audit;
using Multek.Library_Core.COM.Enum;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Multek.Applications.Services.Impl.Entity.FirstCode
{
    /// <summary>
    /// 变更记录
    /// </summary>
    [SugarTable(TableName = "SYS_Audit")]
    [SqlSugar.ClickHouse.CKTable(@"engine = MergeTree PARTITION BY toYYYYMM(UpdatedAt)  ORDER BY (UpdatedAt) SETTINGS index_granularity = 8192;")]
    [Tenant(DataNameEnum.ClickHouse)]
    public class QuestAuditEntry
    {
        /// <summary>
        /// 主键
        /// </summary>
        public DateTime UpdatedAt { get; set; }
        /// <summary>
        /// 表名
        /// </summary>
        public string TableName { get; set; }
        /// <summary>
        /// 原始值
        /// </summary>
        public string? OriginalValues { get; set; }
        /// <summary>
        /// 新值
        /// </summary>
        public string? NewValues { get; set; }
        /// <summary>
        /// 主键
        /// </summary>
        public string? KeyValues { get; set; }
        /// <summary>
        /// 操作状态
        /// </summary>
        public DataOperationEnum OperationType { get; set; }

        public string Properties { get; set; }

        public string? UpdatedBy { get; set; }

        public Paraments InitData(DateTime startTime, DateTime endTime, Paraments key)
        {
            // 存在的主键是否更新数据
            bool _isUpdate = false;
            if (key == null)
            {
                key = new Paraments() { SystemDate = new DateTime(2023, 8, 1, 0, 0, 0) };
            }
            //获取数据
            var _initData = DataORMMain.Db.GetConnection(DataNameEnum.Quest).Queryable<QuestAuditEntry>().Where(x => x.UpdatedAt > key.SystemDate).ToList();
            // 保存数据
            if (_initData.Count > 0)
            {
                DataORMMain.Save(_initData, DataNameEnum.ClickHouse, _isUpdate);
                key.SystemDate = _initData.Max(x => x.UpdatedAt);
            }
            return key;
        }
        /// <summary>
        /// 参数列表
        /// </summary>
        public class Paraments
        {
            public DateTime SystemDate;
        }
    }
}

通过实体类自动生成同步数据代码

不必写如何的代码,减少编码逻辑

定义迁移代码

程序启动时,通过特性定义为:DataWarehouseAttribute,才会进行生成迁移的代码,

[DataWarehouse(DataNameEnum.CamstarWip)]

并且需要继承CommEntityBase这个基础类,

 public class CodePNLLog : CommEntityBase

才能将数据存入到数据库中,通过DataWarehoues项目完成代码的动态生成。执行InitData 将数据迁移的另外的数据库中。

设置是否执行数据同步

数据仓库停用、启动 使用的是IDistributedCache 键为 DataWarehouse

配置迁移任务

定义SYS_DW_JOB, 与类名一样
image.png

客制化类型转化

暂时不支持的属性的特性 [Key] [Column(“cod_d”)]

// 类型的客制化
                Type _underlyingType = Nullable.GetUnderlyingType(property.PropertyType);
                string _typeName = property.PropertyType.Name;
                if (property.PropertyType.IsEnum)
                {
                    _typeName = "int";
                }else if (property.PropertyType.IsClass&&  _typeName.ToUpper()!="STRING")
                {
                    _typeName = "string";
                    _propertyName += "ID";
                }
                else if (_underlyingType != null && (_underlyingType == typeof(DateTime) || _underlyingType == typeof(DateTimeOffset)))
                {
                    _typeName = "DateTime";

                }

NET6平台监控。

用系统分析,为系统优化提供优化方向。

请求日志

请求的时间、请求参数、响应参数、响应时间
image.png

异常日志

image.png
image.png

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值