Net6 平台
用于快点开发webapi设计的框架,含有日志、缓存、Camstar接口(XMLClient)、分布式锁、异常记录、数据仓库、数据分析功能。
其中数据仓库使用的是大数据存储方案为数据分析准备的处理以亿级别以上的数据。
整体框架图
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, 与类名一样
客制化类型转化
暂时不支持的属性的特性 [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平台监控。
用系统分析,为系统优化提供优化方向。
请求日志
请求的时间、请求参数、响应参数、响应时间
异常日志