Files
tnb.server/common/Tnb.Common/Security/SnowflakeIdHelper.cs
pofi a4ed390e82 1. 雪花ID使用配置项
2. 使用自定义日志格式
3. 修复数据模型和新建流程的bug
2023-03-14 20:36:51 +08:00

66 lines
2.6 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System.Runtime.InteropServices;
using JNPF.Common.Cache;
using JNPF.Common.Const;
using JNPF.FriendlyException;
using Yitter.IdGenerator;
namespace JNPF.Common.Security;
/// <summary>
/// 分布式雪花ID帮助类.
/// </summary>
public class SnowflakeIdHelper
{
// 定义dll路径
public const string RegWorkerId_DLL_NAME = "lib\\regworkerid_lib_v1.3.1\\yitidgengo.dll";
// 根据文档定义三个接口
// 注册一个 WorkerId会先注销所有本机已注册的记录
// ip: redis 服务器地址
// port: redis 端口
// password: redis 访问密码,可为空字符串“”
// maxWorkerId: 最大 WorkerId
[DllImport(RegWorkerId_DLL_NAME, EntryPoint = "RegisterOne", CallingConvention = CallingConvention.Cdecl, ExactSpelling = false)]
private static extern ushort RegisterOne(string ip, int port, string password, int maxWorkerId);
// 注销本机已注册的 WorkerId
[DllImport(RegWorkerId_DLL_NAME, EntryPoint = "UnRegister", CallingConvention = CallingConvention.Cdecl, ExactSpelling = false)]
private static extern void UnRegister();
// 检查本地WorkerId是否有效0-有效,其它-无效)
[DllImport(RegWorkerId_DLL_NAME, EntryPoint = "Validate", CallingConvention = CallingConvention.Cdecl, ExactSpelling = false)]
private static extern int Validate(int workerId);
/// <summary>
/// 初始化YitId配置
/// </summary>
public static void InitYitIdWorker()
{
//var option = new IdGeneratorOptions
//{
// WorkerId = 1, //必须 全局唯一,必须 程序设定,理论最大值 2^WorkerIdBitLength-1
// //BaseTime = new DateTime(2023, 1, 1, 0, 0, 0, DateTimeKind.Utc), //用生成ID时的系统时间与基础时间的差值(毫秒数)作为生成ID的时间戳
// WorkerIdBitLength = 16, //机器码位长,决定 WorkerId 的最大值,默认值6,取值范围 [1, 16]
// //SeqBitLength = 4, //序列数位长,默认值6,取值范围 [3, 21](建议不小于4),决定每毫秒基础生成的ID个数
// //MinSeqNumber = 5, //最小序列数,默认值5,取值范围 [5, MaxSeqNumber]
// //MaxSeqNumber 最大序列数,设置范围 [MinSeqNumber, 2^SeqBitLength-1]默认值0
//};
var option = App.GetConfig<IdGeneratorOptions>("YitId");
if (option.WorkerId == 0)
{
CacheOptions _cacheOptions = App.GetConfig<CacheOptions>("Cache", true);
option.WorkerId = RegisterOne(_cacheOptions.ip, _cacheOptions.port, _cacheOptions.password, 63);
}
YitIdHelper.SetIdGenerator(option);
}
/// <summary>
/// 生成ID.
/// </summary>
/// <returns></returns>
public static string NextId()
{
return YitIdHelper.NextId().ToString();
}
}