Files
BuYuHouDuan/docs/07-公共基础设施-Infrastructure.md
T
2026-10-12 16:22:04 +08:00

48 KiB
Raw Blame History

公共基础设施(Infrastructure 等)—— 功能与代码目录文档

本文档为「公共基础设施层(Infrastructure / RedisService / ApiLogService / Tools / nlog.config)」的完整上下文说明,供其他对话或开发者作为该模块的上下文直接使用。文中所有路径均相对解决方案根目录 d:\BUYUHouDuanNet\BuYu,所有描述均以实际代码为准;未在代码中确认的内容不写入。


一、平台背景与模块位置

  • 本平台是「捕鱼 + 棋牌」游戏运营平台的后端,解决方案文件为 Template0524.sln。
  • 技术栈:.NET 8 + MongoDB + Redis + RabbitMQ(业务上层使用 DotNetCore.CAP,本层的通用消息封装使用 EasyNetQ)+ SignalR + Ocelot 网关 + NLog + Autofac。
  • 网关监听 http://localhost:8001(Gateway/appsettings.json 中 "urls": "http://*:8001")。
  • 各服务端口由 Ocelot 网关 Gateway/ocelot.json 配置(与代码一致):
    • AdminHost = 5241(管理后台)
    • UserHost = 5245(用户)
    • CustomerHost = 5247(客服)
    • ChessGameHost = 5242(棋牌游戏)
    • FishRoomHost = 5244(捕鱼房间)
    • FishGameHost = 5248(捕鱼游戏)
  • 本模块中的项目(除 Tools/RenameUploads 为独立可执行工具外)全部是没有独立进程的类库,被打包进上述各业务 Host / Service / Domain / Api 项目运行。

二、模块简介

公共基础设施层是整个后端的技术底座,为 Admin(管理后台)、User(用户)、Customer(客服)、ChessGame(棋牌)、FishGame(捕鱼)等全部业务模块提供横切能力:

  • 通用基础设施(Infrastructure/Common):统一响应模型、业务异常、系统枚举、通用工具扩展、拼音/脱敏/时间戳转换、敏感词过滤、微信 API 帮助类、跨域、HTTP 请求封装、Redis Key 命名约定。
  • Web 基础设施(Infrastructure/CommonInfrastructure、Infrastructure/SharpAbp.Infrastructure.Api):Autofac 自动注册模块、统一 BaseController(解析登录用户 / 客户端 IP)、Controller 结果扩展、全局异常中间件、配置与连接串帮助类、熔断器。
  • 数据与中间件封装:MongoDB 通用仓储(MongoRepository)、Redis 缓存与分布式锁封装(RedisHelper)、RabbitMQ 消息发布/订阅封装(RabbitMQHelper)。
  • 认证:JWT 生成/校验与 ASP.NET Core 认证接线(JWTHelper)。
  • 定时任务:基于 Cronos 的后台定时任务基类(ScheduledService)。
  • 领域级 Redis 服务:面向前述业务域的 Redis 读写封装(RedisService)。
  • API 日志:把每次 API 请求落库到 MongoDB 的日志服务(ApiLogService,实际使用实现位于 CommonService,详见第七节说明)。
  • 运维工具与日志:上传文件批量改名工具(Tools/RenameUploads)与全服务共用的 NLog 配置(nlog.config)。

三、功能清单(按子项目分组)

3.1 Infrastructure/Common(通用基础库,命名空间 Common)

能力 关键类 / 文件 说明
统一响应模型 BaseResponse.cs BaseCommonResponse(Code + Info)、BaseResponse<T>、ListResponse<T>、PageResponse<T>(含 Count)、PageDataResponse<T>。所有接口统一以该结构返回
业务异常 BusinessException.cs 继承 Exception,带 ErrorCode,供全局异常中间件识别并转成业务错误响应
响应码枚举 SystemEnum.cs CommonResponseCodeEnum:Success=0、Error=-1、Exception=500、NoAuth=401、NoRole=403、TokenExpire=1000、NoLogin=401、TokenInvalid=12、ParamError=13、SignError=14、ResultNull=15、LowVersion=16、ResultFail=-1
实例标识 AppInstanceId.cs 仅含 string Id,用于区分同一服务的多个实例
Redis Key 生成 Redis/RedisKeyGenerator.cs 按服务前缀生成 Key;ServicePrefixes:user→user-service、admin→admin-service、game/fish/chess→game-service、customer→customer-service、common→app-shared(未匹配时兜底 app-shared)。提供 UserKey/AdminKey/GameKey/CustomerKey/CommonKey/GetKey
Redis Key 常量 Redis/RedisKey.cs 基于 RedisKeyGenerator 的业务 Key 常量,如 MatchingRoom、UserCIDGID(user-service:uid:{0})、LoginCIDUser/CIDUser(user-service:cid:{0})、VerificationCode(user-service:verification_code:{0})、ProductRedis、WeiXin_AccessToken(app-shared:wx_access_token)、WeiXinUser_AccessToken、GameConfig、ActivityConfig、GameRoomIdKey(game-service:room:model:{0}_{1})、DistributedLockPrefix(app-shared🔒)、ChessRoomList、ChessRoomKey、SystemGoldDayKey、CUSTOMER_ONLINE_KEY(customer-service:online)、FishingKillConfig、FishSpawnConfig、访问/流量统计 Key(app-shared:stats:*)。同文件还保留一套旧版常量 RedisKeyConstants(前缀 redis0524:,其中客户在线为 game0524:customer:online)
通用数据模型 CommonModel/BaseIdName.cs、CommonModel/BaseListPageParam.cs BaseIdName(Id/Name);BaseListPageParam(KeyWord/PageIndex/PageSize,带默认值与去空格逻辑)
跨域 Cors/CorsExtension.cs AddCustomCors() 注册名为 Cors 的策略(允许任意来源、任意 Header/Method、允许凭据);UseCustomCors() 启用
敏感词过滤 BlockWord/BlockWord.cs、BlockWord/BlockWordHelper.cs BlockWord.BlockWordValue 为超大型敏感词表(逗号分隔,含政治/色情/毒品等);BlockWordHelper 基于 ToolGood.Words.StringSearch 提供 IsHaveBlockWord、ReplaceBlockWord、GetBlockWord
HTTP 请求封装 Request/IRequestApi.cs、Request/RequestApi.cs 基于 RestSharp,IRequestApi:GetAsync、PostAsync、PostFormDataAsync、DownloadFile。构造时从 IHttpContextAccessor 取请求头 token 作为默认头;响应统一提取 code 做日志判断
微信帮助类 WX/WXBaseHelper.cs 读取配置 WXConfig:AppId/Secret/Url;GetAccessToken() 走 /cgi-bin/token(client_credential)并缓存 3600s;GetAccessTokenByCode(js_code) 走 /sns/jscode2session(authorization_code)并缓存 6000s
微信响应模型 WX/Response/WXBaseResponse.cs、AccessTokenResponse.cs、GZHUserInfoResponse.cs、TicketResponse.cs 分别对应微信基础响应(errCode/errmsg)、access_token、公众号用户信息、jsapi_ticket
通用工具 Utils/* 见下
表达式扩展 LinqExtensions.cs 提供 And/Or/True/False 等动态组合 Expression<Func<T,bool>> 的能力(含 ParameterRebinder)

Utils 目录关键工具:

  • ConvertExtension.cs:大量类型转换与业务扩展——ObjToInt/Long/Money/String/Decimal/Date/Bool、时间戳互转(ToTimeStamp/ConvertToDateTime/ToDateTime)、ToJson/ToObject<T>、Clone<T>、Base64、ToHidMobile、IsHandset、ConvertToPinyin(NPinyin)、ToSHA1Encrypt、金额向上/向下取两位(ToCeilingFixed2/ToFloorFixed2/ToCeilingInt)、集合 ContainsAll/RemoveRange 等。
  • Tool.cs:LockKey(object)(序列化后 MD5,前缀 HSCW:RedisLock:)、GetSerialNumber、GetTimeStringRandom、ReplaceWithSpecialChar(脱敏)、SubStringText、PickupImgUrl、NoHTML、RegexSubstring(供 MongoRepository 解析集合名占位符用)、CheckIsUrl、IsIdCard。
  • DateTimeTools.cs:GetDateTimeNow()(把本地时间标记为 UTC)、GetTimeDiffDays、内部 DatetimeJsonConverter(yyyy-MM-dd HH:mm:ss 序列化)。
  • DateTimeConverterUtf.cs:JsonConverter<DateTime>,写入时把 UTC 转成 Asia/Shanghai 时区格式化输出。
  • Md5Helper.cs:GetMD5(string)(小写十六进制)。
  • RandomHelper.cs:RandomNumbers、RandomChars、RandomNoRepeatNumber/Chars、GetRandomCode(长度被限制在 4~8)。
  • ValidationHelper.cs:IsValidMobile、IsValidIdCard(含校验位)、IsValidUserName、IsValidPassword、IsPositiveAmount、IsInRange、IsValidLength。
  • ConstValues.cs:LockSecond=5、LockNotice="业务正在处理中,请稍后"、DevModel="dev"。

3.2 Infrastructure/CommonInfrastructure(Web 基础设施,命名空间 CommonInfrastructure)

  • Middleware/AutofacModule.cs:Module 子类,注册泛型 MongoBaseRepository<> → IMongoBaseRepository<>、RedisService.RedisService → IRedisService(均 InstancePerLifetimeScope);静态方法 RegisterServices(builder, serviceAssemblyType) 扫描程序集中以 Service 结尾的类型按接口注册。
  • Controllers/BaseController.cs:继承 MVC Controller,在 OnActionExecuting 中解析 JWT Claims:uid→UserId、uname→UserName、dname→DisplayName、avatar→Icon、number→Number,并从请求头 X-Forwarded-For(取第一个)或 Connection.RemoteIpAddress 得到 Ip。
  • Response/LoginUser.cs:UserId、UserName、Number、DisplayName、Icon、Source、Ip、Token。
  • Extension/ControllerExtension.cs:Controller 结果扩展——ToResult/ToListResult/ToPageResult(成功)与 ToFailResult/ToListFailResult/ToPageFailResult/ToNoLoginResult/ToTokenInvalidResult/ToParamErrorResult(失败)。

3.3 Infrastructure/SharpAbp.Infrastructure.Api(Web/API 基础设施,命名空间 SharpAbp.Infrastructure.Api)

  • Autofac/ApplicationModule.cs:抽象 Autofac Module。注册 MongoBaseRepository<> → IMongoBaseRepository<>;当 RegisterMongoBaseService=true(默认)时注册 MongoBaseService<> → IMongoBaseService<>;注册 RedisService.RedisService → IRedisService;扫描 GetServiceAssemblies() 中以 Service 结尾、以 Repository 结尾的类型按接口注册。子类通过重写 CurrentAssembly/GetServiceAssemblies() 指定程序集。
  • Controllers/BaseController.cs:[ApiController] 抽象控制器;loginUser 从 User.Claims 解析(ClaimTypes.NameIdentifier→userId、ClaimTypes.Name→userName、ClaimTypes.Role→role);GetClientIp() 取 X-Forwarded-For 或远端 IP。同文件含轻量 LoginUser(userId/userName/role)。
  • Extensions/ControllerExtensions.cs:与 CommonInfrastructure 同款的 Controller 结果扩展(ToResult 系列 / ToFailResult 系列),额外 ToParamErrorResult 带默认文案。
  • Middleware/GlobalExceptionMiddleware.cs:全局异常中间件,UseGlobalExceptionHandler() 扩展。按异常类型返回统一 JSON(HTTP 200,结构 {code, info, data}):BusinessException→Error、UnauthorizedAccessException→NoAuth、ArgumentException→ParamError、TimeoutException/OperationCanceledException→Error,其它→Exception 并记录 LogError。
  • Resilience/CircuitBreaker.cs:手写熔断器(Closed/Open/HalfOpen 三态),CircuitBreakerOptions(失败阈值 5、断开时长 30s、半开尝试 3、成功阈值 2),CircuitBreakerFactory 用 ConcurrentDictionary 按名缓存;熔断打开时抛 CircuitBreakerOpenException。
  • Configuration/ConfigurationHelper.cs:从环境变量读取并拼装连接串。GetConnectionString("mongodb"/"redis"/"rabbitmq"/"mysql"),对应读取 MONGODB_*、REDIS_*、RABBITMQ_*、MYSQL_* 环境变量;另提供 GetString/GetInt/GetBool。
  • Configuration/AppSettings.cs:强类型配置聚合——JwtConfig、CapConfig、RedisConfig、WXConfig、MongoDbSettings、PgSqlConnection。注意其 RedisConfig/MongoDbSettings/JwtConfig 为独立于其它子项目的简化定义(默认值 localhost/6379 等)。

3.4 Infrastructure/JWTHelper(JWT,命名空间 JWTHelper)

  • JWTConfig.cs:TokenKey、Issuer、Audience、SecretKey、ValidateIssuer/Audience/IssuerSigningKey/Lifetime。
  • JwtTools.cs:ValidateToken(token)(HmacSha256,要求 Claims 同时含 uid、uname)、CreateToken(Claim[])(有效期 60 分钟)、静态 GetTokenContent、GetTokenReverseContent(把 uid 反转读取,用于校验)、GetTokenClaim。
  • JWTExtension.cs:AddCustomJwt(services, configuration) 与 AddJwt(...)。绑定 JwtConfig 节点;认证事件:SignalR 的 /hubs/、/fishinghub、/fishingroomhub 允许从 query access_token 取 token,其余从 Header(jwtSettings.TokenKey)取;OnMessageReceived 中会校验 uid 非空(AddCustomJwt 版本);OnChallenge 统一返回 {code=401,msg="fail",info="很抱歉,您无权访问该接口"} 且 HTTP 200。
  • Md5Helper.cs:sealed 内部工具,Encode(取 MD5 摘要第 4 段 8 字节),用于 token 附加校验(在 JWTExtension 相关逻辑中引用,当前校验逻辑注释保留)。

3.5 Infrastructure/MongoRepository(MongoDB 仓储,命名空间 MongoRepository / MongoRepository.Attributes / MongoRepository.Config)

  • MongoBaseEntity.cs:基类实体,Id(_id,Guid.NewGuid("N"))、IsDelete(isdelete)、CreateInfo(OptionUserInfo?)。OptionUserInfo:UserId、UserName、OptionTime(Unix 时间戳,[BsonIgnoreExtraElements])。
  • BsonCollectionAttribute.cs:标注在实体类上,含 CollectionName、DataBaseName;集合名支持 {yyyyMM} 之类日期占位符。
  • Config/MongoDbSettings.cs:IMongoDbSettings/MongoDbSettings(ServerUrl、Username、Password、Database 默认 data_0524);ServiceDatabases 常量:data_0524_user、data_0524_admin、data_0524_fish、data_0524_chess、data_0524_customer。
  • IMongoBaseRepository.cs:通用仓储接口(查询、分页、增删改、聚合等)。
  • MongoBaseRepository.cs:泛型实现 MongoBaseRepository<TDocument> where TDocument : MongoBaseEntity。构造时按 IMongoDbSettings 拼 MongoUrl(用户名/密码/库名来自实体的 BsonCollectionAttribute.DataBaseName),并 EnsureDatabaseAndUser(库不存在则插入并删除一条 temp 文档触发建库)、EnsureIndexes(针对 user 集合创建 BaseInfo.Mobile 与 RealName.IDCard 唯一稀疏索引,用静态集合去重、异常只记警告)。主要公开方法:
    • 查询:AsQueryable、GetCollection、FilterBy(表达式/FilterDefinition/投影)、FindOne/FindOneAsync(表达式或 FilterDefinition,可带排序)、FindById/FindByIdAsync、Count/CountAsync。
    • 分页:QueryPage、QueryPageAsync(多种重载,含带 skipCount 版本)、QueryPageTwoOrderAsync(双排序)。
    • 写入:InsertOne/InsertMany、UpdateById、UpdateMany、ReplaceOne(均含同步/异步,返回 (bool ok, string message))。
    • 删除:DeleteOne/DeleteById/DeleteMany(含异步)。
    • 聚合/随机:Aggregate(FilterDefinition, ProjectionDefinition<...,BsonDocument>)、RandomData(expression, count)(AsQueryable().Sample())。

3.6 Infrastructure/RedisHelper(Redis 缓存与分布式锁,命名空间 RedisHelper)

  • ICache.cs / RedisCache.cs:基于 NewLife.Redis(FullRedis)的缓存封装。RedisCache 用 FullRedis.Create(config.url),MaxMessageSize=16MB;简单类型(string/long/int/bool/double)直存,复杂对象走 System.Text.Json 序列化。核心能力:
    • 基础:Get<T>、GetAll<T>(keys)、Insert<T>(可带 int/TimeSpan 过期)、Remove、Exists、Clear()、Clear(pattern)、GetPatternKey/GetPatternList<T>、IncrBy、StartPipeline、GetFullRedis。
    • Set:SetAdd/SetContains/SetRemove/SetCount/SetMembers<T>。
    • List:GetList、AddToList、InitDataToList、UpdateDataToList、RemoveFromList。
    • Dictionary:InitDataToDictionary、UpdateDataToDictionary、RemoveFromDictionary、GetFromDictionary、GetListFromDictionary(ByFilter)、GetListCountFromDictionaryByFilter、分页查询(GetPageDescendingListFromDictionary、GetPageListFromDictionary、GetListFromDictionary、GetDescendingListFromDictionary)。
    • 临时内容:AddTempContent/GetTempContent(Key 模板 HS:Temp:{0})。
  • IDistributedLock.cs / DistributedLock.cs:Redis 分布式锁。TryExecute(Action/Func<T>) 与异步版本,参数 expiry=30s、retry、retryDelay=100ms;用 FullRedis.Add(key, value, expiry) 抢锁,值为 Guid,finally 中「校验值相等再删除」释放;GetLockKey 目前原样返回 key。
  • RedisConfig.cs:Host/Port/Password/UserName/Database,ToString() 输出 Server=..;Password=..;UserName=..;Db=..。
  • RedisUrl.cs:仅 string url(承载连接串)。
  • RedisServiceExtension.cs:DI 扩展 AddRedisCache(IConfiguration)(Scoped 注册 ICache/IDistributedLock)、AddRedisCacheSingleton(IConfiguration)(Singleton)、AddRedisCache(string url)(Singleton)。均先绑定 RedisConfig 节点生成 RedisUrl。

3.7 Infrastructure/RabbitMQHelper(消息封装,命名空间 RabbitMQHelper 等)

  • RabbitConfig.cs:IRabbitConfig/RabbitConfig——Host(默认 49.233.122.91)、VirtualHost(/)、UserName/Password(guest)、ListSubscribe(订阅者类型列表)、MongoDatabaseName、MongoConnectionString、DefaultExchange(hscw.default.topic)、DefaultRegisterWay(singleton)。
  • InitRabbitMQSetup.cs:AddInitMQ(services, Action<RabbitConfig>, logger)——注册 IHttpContextAccessor;用 RabbitHutch.CreateBus 创建 EasyNetQ IBus 并注册为单例(连接/断开事件打日志);注册 IRabbitConfig、ISendMQMessage(Scoped)、MQHostedService(HostedService);按 DefaultRegisterWay(singleton/scoped/transient)用 TryAdd* 注册 ListSubscribe 中的订阅者类型。
  • ISendMQMessage.cs / SendMQMessage.cs:Send(topic, value)。未连接返回 false;从当前 HTTP 请求头取 token 放入消息头;构造 RabbitMessage,以 ExchangeType.Topic 向 DefaultExchange 发布,并把 PublishRecord 写入 Mongo 集合 mq_publish_record。
  • MQHostedService.cs:BackgroundService。遍历 ListSubscribe 类型的 [RabbitMQAttribute] 方法生成 ConsumerExecutorDescriptor;声明 topic exchange,为每个方法声明队列(名 {类名小写}.{方法名小写})并 BindAsync 到 topic;Advanced.Consume<RabbitMessage> 中写 ReceiveRecord 到 mq_receive_record,再用 MethodInfo.Invoke(obj, new object[]{ msg.Body.Data, msg.Body.Headers }) 反射调用订阅方法。
  • IRabbitSubscribe.cs:空标记接口(RabbitMQHelper.Attributes)。
  • Attributes/RabbitMQAttribute.cs:[RabbitMQAttribute(topic)],用于标注订阅方法。
  • RabbitMessage.cs:RecordId(Guid)、Data、Headers。
  • ConsumerExecutorDescriptor.cs:订阅执行描述(MethodInfo、ImplTypeInfo、Attribute、ClassName)。
  • Models/PublishRecord.cs:PublishRecord(发布记录)与 ReceiveRecord(接收记录)。
  • Properties/launchSettings.json:IDE 调试用的启动配置(类库本身不独立运行)。

说明:RabbitMQHelper.csproj 引入了 DotNetCore.CAP 8.3.4 包,但该类的通用消息发布/订阅实现走 EasyNetQ;CAP 主要用于业务 Host 层(配合 nlog.config 中的 capFile 输出),此处不展开。

3.8 Infrastructure/ScheduledService(定时任务,命名空间 ScheduledService)

  • ScheduleConfig.cs:IScheduleConfig<T>/ScheduleConfig<T>——CronExpression(默认 * * * * *)、TimeZoneInfo(默认本地)。
  • CronJobService.cs:实现 IHostedService, IDisposable。用 Cronos 的 CronExpression.Parse(cron, CronFormat.IncludeSeconds);ScheduleJob 计算下次触发时间并用 System.Timers.Timer 延迟触发 DoWork,完成后递归排下一次;DoWork 为可重写空方法,异常只记日志。
  • ScheduledServiceExtensions.cs:AddCronJob<T>(options)(T : CronJobService)——校验配置、注册 IScheduleConfig<T> 单例并 AddHostedService<T>()。

3.9 RedisService(领域级 Redis 服务,命名空间 RedisService / RedisService.Param)

  • IRedisService.cs / RedisService.cs:构造注入 ICache。功能分组:
    • 用户/CID 映射:GetRedisUserCId/SetRedisUserCId/RemoveRedisUserCId(Key user-service:uid:{0});GetLoginUserId/SetLoginUserId/RemoveLoginUserId、GetAllLoginUserIds(Key user-service:cid:{0});另有纯内存 ConcurrentDictionary 实现的 GetUserId/SetUserId/RemoveUserId。
    • 验证码:SetVerificationCode(5 分钟过期)/GetVerificationCode/RemoveVerificationCode。
    • 配置:GameConfig、ActivityConfig、FishingKillConfig、FishSpawnConfig(字符串,读写下 Redis)。
    • 房间:SetGameRoom/GetGameRoom/GetGameRoomList/GetGameRoomAllList/RemoveGameRoom/RemoveGameRoomAll(Key game-service:room:model:{分区}_{房号},另用进程内 ConcurrentDictionary 做 3 秒读缓存 RoomCacheEntry);GetPendingFishRoomId(找用户所在未结束房间)。
    • 棋牌房间:SetChessRoom/GetChessRoom/GetAllChessRooms/GetAllPlayingChessRooms(state==2)/GetPendingChessRoomId/RemoveChessRoom,及清理方法 ClearAllChessRooms/ClearAllGameRooms/ClearAllUserMappings/ClearAllLoginUserIds。
    • 捕鱼运行时(Key 直接拼接,无服务前缀):玩家金币 gold:{roomId}:{userId}、子弹集合 bullets:{roomId}:{userId}、玩家因子 factor:{roomId}:{userId}、房间击杀鱼 killfish:{roomId}(Set)、任务进度 fishing:tasks:{roomId}:{userId}:{taskEvent}、消耗进度 fishing:consume:runtime:...、经验进度 fishing:exp:runtime:...;相关方法 GetPlayerGold/SetPlayerGold、AddBulletId/ExistsBulletId/RemoveBulletId/GetBulletCount/ClearBulletIds、GetPlayerFactor/SetPlayerFactor/RemovePlayerFactor、GetKillFishIds/AddKillFishId/ContainsKillFishId、AddFishingTaskProgress/GetFishingTaskProgress/ClearFishingTaskProgress、AddFishingConsumeProgress/GetFishingConsumeProgress、AddFishingExpProgress/GetFishingExpProgress、ClearFishingRuntimeProgress、ClearPlayerRuntimeData。
    • 系统金币日累计:SetSystemGoldDay/AddSystemGoldDay/GetSystemGoldDay(Key game-service:fish:gamestatic)。
    • 通用:IncrBy、GetString、SetString。
  • Param/RedisUserCid.cs:CId、FishRoomCId、UserId、UserName、RoomId、PartitionId、LoginCId。
  • Param/RedisGameRoom.cs:房间模型(RoomId、RoomName、GameType(默认 GameTypeEnum.风雷之渊)、RoomLevel、RoomPartition、RoomNumber、MaxPlayerCount(4)、CurrentOnlinePlayerCount、RobotCount、Players、CreateUserId、SystemFactor)。
  • Param/RedisGamePlayer.cs:玩家模型(UserId、UserName、UserNumber、Avatar、IsRedName、Level、Exp、MaxExp、VipLevel、CId、Gold、Diamond、Position、CannonId、WingsId、WarGodId、CannonMultiple、BeginCoin、MaxGold、BeginTime、State、PlayerFactor、TotalRechargeGold、SafeBoxGold、IsBot、IsAfk)。
  • Param/RoomBotFactory.cs:机器人工厂。CreateBot(position, roomConfig, gameConfig, botProfiles) 从 BotProfileEntity 随机取档案生成机器人(金币按最大炮倍 ×100~500 随机、等级/钻石/炮台/翅膀/战神随机);FixedBotSeats 当前为空数组(FixedBotSeatsEnabled=false),CreateFixedSeatBots 仅在配置固定座位时生效。

3.10 ApiLogService(API 日志类库)

  • ApiLogService.cs:namespace ApiLogService,ApiLogService : MongoBaseService<ApiLog>, IApiLogService,构造注入 IMongoBaseRepository<ApiLog>。
  • ApiLogService.csproj:仅含 net8.0(无任何 Package/Project 引用)。

重要事实(务必注意):该目录下的 ApiLogService.cs 依赖的 MongoBaseService<>、ApiLog、IApiLogService 均不在本项目中定义,而 ApiLogService.csproj 也没有任何引用,且该工程未加入 Template0524.sln,因此它无法单独编译,属于历史遗留/重复副本。 实际在运行的 API 日志服务实现位于 CommonService/ApiLogService.cs(命名空间 CommonService),接口 CommonService/IApiLogService.cs,实体 CommonDomain/ApiLog.cs。各 Host 的 Middleware/ApiLoggingMiddleware.cs 通过 CommonService.IApiLogService 记录日志(详见第七节)。

3.11 Tools/RenameUploads(上传文件批量改名工具)

  • Program.cs:独立控制台程序(OutputType=Exe)。目标目录写死为 F:\Temp\Template0524\AdminSrc\AdminHost\wwwroot\uploads;用「中文道具名 → 数字编号」映射表(propMapping,如 改名卡→40001、Vip1专属炮台→40100、雷电之翼→40201、鸿运招财喵→40301、碎片 50001、充值档位 70000+、钻石档位 80001+ 等)批量把上传图片重命名为编号文件名,遇到目标已存在则跳过,最后打印成功/跳过数量。
  • RenameUploads.csproj:net8.0、OutputType=Exe、关闭隐式 using 与可空引用。

3.12 nlog.config(全服务共用日志配置)

  • 变量:service(环境变量 SERVICE_NAME)、instance(环境变量 INSTANCE_ID,区分同服务多容器)、logDirectory=logs/${shortdate};日志 layout 形如 ${longdate}|service=..|instance=..|级别|logger|message|异常。
  • 开关(改文件后 NLog 自动重载):enableDebug/Info/Warn/Error/Cap/Socket/FishSpawn/Console 均默认 true。
  • targets(async=true):按级别分文件 debugFile/infoFile/warnFile/errorFile、CAP 专用 capFile、Socket/SignalR 专用 socketFile、出鱼数据专用 fishSpawnFile、console,以及 blackhole(Null)。
  • rules 要点:
    • 屏蔽 Microsoft.AspNetCore.* 的 Info 及以下流水日志(maxlevel=Info → blackhole, final)。
    • DotNetCore.CAP.*(minlevel=Debug)单独输出到 capFile。
    • 消息含 [Socket] 或 logger 为 *.Hubs.*、*MovementFilter 输出到 socketFile。
    • 消息含 [FishSpawnData] 输出到 fishSpawnFile。
    • Debug/Info/Warn/Error 分别落对应文件,minlevel=Error 同时接收 Critical/Fatal;全量 minlevel=Info 进 console。
  • 文件名格式:{service}-{instance}-{级别}.log;内部日志 logs/nlog-internal.log(internalLogLevel=Warn)。

四、项目结构与技术要点(各 csproj 依赖与关键 NuGet)

所有项目目标框架均为 net8.0(ImplicitUsings=enable、Nullable=enable,RenameUploads 除外)。

项目(相对路径) 关键 NuGet / Framework 引用 项目引用(ProjectReference)
Infrastructure/Common/Common.csproj Microsoft.AspNetCore.Cors 2.3.0、Microsoft.Extensions.Hosting.Abstractions 9.0.7、Newtonsoft.Json 13.0.3、NPinyin 0.2.6321.26573、RestSharp 112.1.0、ToolGood.Words 3.1.0.3、XAct.Core.PCL 0.0.5014 Infrastructure/RedisHelper
Infrastructure/CommonInfrastructure/CommonInfrastructure.csproj FrameworkReference Microsoft.AspNetCore.App、Autofac 8.3.0 RedisService、Infrastructure/Common
Infrastructure/JWTHelper/JWTHelper.csproj Microsoft.AspNetCore.Authentication.JwtBearer 8.0.15、Microsoft.Extensions.Hosting.Abstractions 9.0.7、Newtonsoft.Json 13.0.3 无
Infrastructure/MongoRepository/MongoRepository.csproj MongoDB.Bson 3.6.0、MongoDB.Driver 3.6.0、MongoDB.Driver.Core 2.30.0 Infrastructure/Common
Infrastructure/RabbitMQHelper/RabbitMQHelper.csproj DotNetCore.CAP 8.3.4、EasyNetQ 7.8.0、Microsoft.AspNetCore.Http 2.3.0、Microsoft.Extensions.Hosting.Abstractions 9.0.7、Microsoft.Extensions.Logging 9.0.4、MongoDB.Driver 3.6.0 无
Infrastructure/RedisHelper/RedisHelper.csproj Microsoft.Extensions.Configuration.Binder 8.0.2、Microsoft.Extensions.Hosting.Abstractions 9.0.7、Microsoft.Extensions.Logging.Abstractions 9.0.7、NewLife.Redis 6.2.2025.503 无
Infrastructure/SharpAbp.Infrastructure.Api/SharpAbp.Infrastructure.Api.csproj FrameworkReference Microsoft.AspNetCore.App、Autofac 8.3.0 CommonService、RedisService、Infrastructure/Common
Infrastructure/ScheduledService/ScheduledService.csproj Cronos 0.8.4、Microsoft.Extensions.Hosting.Abstractions 9.0.7 无
RedisService/RedisService.csproj 无第三方包 ChessGameSrc/ChessGameDomain、CommonDomain、Infrastructure/RedisHelper、UserSrc/UserDomain
ApiLogService/ApiLogService.csproj 无(仅 net8.0) 无(未加入 sln)
Tools/RenameUploads/RenameUploads.csproj 无 无(独立 Exe)

依赖要点:

  1. 依赖树根:RedisHelper(最底层,无项目引用)→ 被 Common、MongoRepository(间接)、RedisService 等使用;Common → 被 MongoRepository、CommonInfrastructure、SharpAbp.Infrastructure.Api 等使用。
  2. CommonInfrastructure 与 SharpAbp.Infrastructure.Api 是两套并行的 Web 基础设施,都提供 BaseController + Controller 结果扩展 + Autofac 注册;不同 Host 按需引用(见第七节)。
  3. SharpAbp.Infrastructure.Api 依赖 CommonService(含 MongoBaseService<> 与真正在用的 ApiLogService),其 ApplicationModule 会自动注册业务 Service/Repository。
  4. RedisService 属于领域级库,直接反向依赖 ChessGameDomain、UserDomain、CommonDomain,因此被各业务 Service/Host 引用。

五、代码目录说明(完整目录树)

说明:以下为本次模块范围内实际存在的全部文件;每个目录/关键文件均带中文注释。

5.1 Infrastructure/Common

Infrastructure/Common/
├── Common.csproj                       # 通用基础库工程文件(引用 RedisHelper)
├── AppInstanceId.cs                    # 实例标识模型(string Id)
├── BaseResponse.cs                     # 统一响应:BaseCommonResponse/BaseResponse<T>/ListResponse<T>/PageResponse<T>/PageDataResponse<T>
├── BusinessException.cs                # 业务异常(含 int ErrorCode)
├── LinqExtensions.cs                   # 表达式树组合扩展(And/Or/True/False 等)
├── SystemEnum.cs                       # CommonResponseCodeEnum 响应码枚举
├── BlockWord/
│   ├── BlockWord.cs                    # 超大型敏感词表常量 BlockWordValue
│   └── BlockWordHelper.cs              # 敏感词检测/替换/提取(ToolGood.Words)
├── CommonModel/
│   ├── BaseIdName.cs                   # 通用 Id/Name 模型
│   └── BaseListPageParam.cs            # 通用分页参数(KeyWord/PageIndex/PageSize)
├── Cors/
│   └── CorsExtension.cs                # 跨域策略 AddCustomCors / UseCustomCors
├── Redis/
│   ├── RedisKey.cs                     # 业务 Redis Key 常量(含旧版 RedisKeyConstants)
│   └── RedisKeyGenerator.cs            # 按服务前缀生成 Redis Key
├── Request/
│   ├── IRequestApi.cs                  # HTTP 请求接口(RestSharp)
│   └── RequestApi.cs                   # HTTP 请求实现(带 token 默认头)
├── Utils/
│   ├── ConstValues.cs                  # 常量(锁时长/提示语/环境标识)
│   ├── ConvertExtension.cs             # 类型转换/时间戳/序列化/脱敏/拼音等扩展
│   ├── DateTimeConverterUtf.cs         # UTC→Asia/Shanghai 的 JSON 时间转换器
│   ├── DateTimeTools.cs                # 时间工具 + DatetimeJsonConverter
│   ├── Md5Helper.cs                    # MD5 工具
│   ├── RandomHelper.cs                 # 随机数/随机串工具
│   ├── Tool.cs                         # 通用工具(锁 Key/脱敏/正则/身份证等)
│   └── ValidationHelper.cs             # 校验工具(手机号/身份证/用户名/密码等)
└── WX/
    ├── WXBaseHelper.cs                 # 微信 access_token / code2session 获取与缓存
    └── Response/
        ├── AccessTokenResponse.cs      # access_token 响应
        ├── GZHUserInfoResponse.cs      # 公众号用户信息响应
        ├── TicketResponse.cs           # jsapi_ticket 响应
        └── WXBaseResponse.cs           # 微信基础响应(errcode/errmsg)

5.2 Infrastructure/CommonInfrastructure

Infrastructure/CommonInfrastructure/
├── CommonInfrastructure.csproj         # Web 基础设施工程(AspNetCore.App + Autofac)
├── Controllers/
│   └── BaseController.cs               # MVC 控制器基类:解析登录用户与客户端 IP
├── Extension/
│   └── ControllerExtension.cs          # Controller 结果扩展(成功/失败/未登录等)
├── Middleware/
│   └── AutofacModule.cs                # Autofac 注册:Mongo 仓储、RedisService、按名注册 Service
└── Response/
    └── LoginUser.cs                    # 登录用户模型(UserId/UserName/.../Ip/Token)

5.3 Infrastructure/JWTHelper

Infrastructure/JWTHelper/
├── JWTHelper.csproj                    # JWT 工程(JwtBearer + Newtonsoft.Json)
├── JWTConfig.cs                        # JWT 配置模型
├── JWTExtension.cs                     # AddCustomJwt / AddJwt 认证接线
├── JwtTools.cs                         # Token 生成/校验/解析
└── Md5Helper.cs                        # 内部 MD5 工具(token 校验用)

5.4 Infrastructure/MongoRepository

Infrastructure/MongoRepository/
├── MongoRepository.csproj              # MongoDB 仓储工程(MongoDB.Driver 等)
├── BsonCollectionAttribute.cs          # 标注集合名与库名(支持 {yyyyMM} 占位)
├── IMongoBaseRepository.cs             # 通用仓储接口
├── MongoBaseEntity.cs                  # 实体基类 + OptionUserInfo
├── MongoBaseRepository.cs              # 通用仓储实现(查询/分页/增改删/聚合)
└── Config/
    └── MongoDbSettings.cs              # Mongo 连接配置 + ServiceDatabases 库名常量

5.5 Infrastructure/RabbitMQHelper

Infrastructure/RabbitMQHelper/
├── RabbitMQHelper.csproj               # 消息封装工程(EasyNetQ + DotNetCore.CAP + MongoDB.Driver)
├── RabbitConfig.cs                     # 消息配置 IRabbitConfig/RabbitConfig
├── InitRabbitMQSetup.cs                # AddInitMQ:注册 Bus、订阅者、后台服务
├── ISendMQMessage.cs                   # 消息发送接口
├── SendMQMessage.cs                    # 消息发送实现(含发布记录落库)
├── MQHostedService.cs                  # 后台订阅服务(反射调用 [RabbitMQ] 方法)
├── IRabbitSubscribe.cs                 # 订阅者标记接口
├── RabbitMessage.cs                    # 消息体(RecordId/Data/Headers)
├── ConsumerExecutorDescriptor.cs       # 订阅执行描述
├── Attributes/
│   └── RabbitMQAttribute.cs            # [RabbitMQ(topic)] 订阅特性
├── Models/
│   └── PublishRecord.cs                # PublishRecord / ReceiveRecord 记录模型
└── Properties/
    └── launchSettings.json             # IDE 调试启动配置

5.6 Infrastructure/RedisHelper

Infrastructure/RedisHelper/
├── RedisHelper.csproj                  # Redis 封装工程(NewLife.Redis)
├── ICache.cs                           # 缓存接口
├── RedisCache.cs                       # 缓存实现(FullRedis)
├── IDistributedLock.cs                 # 分布式锁接口
├── DistributedLock.cs                  # 分布式锁实现
├── RedisConfig.cs                      # Redis 配置(Host/Port/Password/...)
├── RedisUrl.cs                         # Redis 连接串载体
└── RedisServiceExtension.cs            # DI 扩展 AddRedisCache / AddRedisCacheSingleton

5.7 Infrastructure/SharpAbp.Infrastructure.Api

Infrastructure/SharpAbp.Infrastructure.Api/
├── SharpAbp.Infrastructure.Api.csproj   # API 基础设施工程(AspNetCore.App + Autofac)
├── Autofac/
│   └── ApplicationModule.cs             # 抽象 Autofac 模块:仓储/服务/RedisService 自动注册
├── Configuration/
│   ├── AppSettings.cs                   # 强类型配置聚合(JwtConfig/CapConfig/RedisConfig/WXConfig/MongoDbSettings)
│   └── ConfigurationHelper.cs           # 环境变量读取与连接串拼装
├── Controllers/
│   └── BaseController.cs                # [ApiController] 基类:loginUser / GetClientIp
├── Extensions/
│   └── ControllerExtensions.cs          # Controller 结果扩展
├── Middleware/
│   └── GlobalExceptionMiddleware.cs     # 全局异常中间件 + UseGlobalExceptionHandler
└── Resilience/
    └── CircuitBreaker.cs                # 熔断器(Closed/Open/HalfOpen)+ 工厂

5.8 Infrastructure/ScheduledService

Infrastructure/ScheduledService/
├── ScheduledService.csproj              # 定时任务工程(Cronos)
├── CronJobService.cs                    # 定时任务基类(IHostedService)
├── ScheduleConfig.cs                    # 调度配置(CronExpression/TimeZoneInfo)
└── ScheduledServiceExtensions.cs        # AddCronJob<T> 扩展

5.9 RedisService

RedisService/
├── RedisService.csproj                  # 领域级 Redis 服务工程
├── IRedisService.cs                     # 服务接口(缓存/登录态/验证码/房间/捕鱼运行时等)
├── RedisService.cs                      # 服务实现(基于 ICache)
└── Param/
    ├── RedisGamePlayer.cs               # 捕鱼房间玩家模型
    ├── RedisGameRoom.cs                 # 捕鱼房间模型
    ├── RedisUserCid.cs                  # 用户/CID 映射模型
    └── RoomBotFactory.cs                # 机器人生成工厂

5.10 ApiLogService

ApiLogService/
├── ApiLogService.csproj                 # 仅 net8.0,无引用;未加入 sln(历史遗留)
└── ApiLogService.cs                     # namespace ApiLogService(未实际使用,实际实现在 CommonService)

5.11 Tools/RenameUploads

Tools/RenameUploads/
├── RenameUploads.csproj                 # 独立控制台工具工程(net8.0 Exe)
└── Program.cs                           # 按道具名→编号映射批量重命名上传图片

5.12 根目录日志配置

nlog.config                              # 全服务共用 NLog 配置(按级别/CAP/Socket/出鱼分文件)

六、关键文件索引

文件相对路径 职责
Infrastructure/Common/BaseResponse.cs 定义统一响应结构与响应码封装基类
Infrastructure/Common/BusinessException.cs 业务异常类型,供全局异常中间件识别
Infrastructure/Common/SystemEnum.cs CommonResponseCodeEnum 全局响应码
Infrastructure/Common/Redis/RedisKeyGenerator.cs 按服务前缀生成 Redis Key(含前缀映射表)
Infrastructure/Common/Redis/RedisKey.cs 业务 Redis Key 常量集合
Infrastructure/Common/Utils/ConvertExtension.cs 类型转换/时间戳/序列化/脱敏/拼音等通用扩展
Infrastructure/Common/Utils/Tool.cs 通用工具(锁 Key、脱敏、正则、身份证校验)
Infrastructure/Common/BlockWord/BlockWordHelper.cs 敏感词检测与替换
Infrastructure/Common/WX/WXBaseHelper.cs 微信 access_token / code2session 获取与缓存
Infrastructure/Common/Request/RequestApi.cs 基于 RestSharp 的 HTTP 请求封装
Infrastructure/Common/Cors/CorsExtension.cs 跨域策略注册与启用
Infrastructure/CommonInfrastructure/Controllers/BaseController.cs MVC 基类,解析登录用户与 IP
Infrastructure/CommonInfrastructure/Extension/ControllerExtension.cs Controller 统一结果扩展
Infrastructure/CommonInfrastructure/Middleware/AutofacModule.cs Autofac 服务注册模块
Infrastructure/CommonInfrastructure/Response/LoginUser.cs 登录用户模型
Infrastructure/SharpAbp.Infrastructure.Api/Autofac/ApplicationModule.cs 抽象 Autofac 模块(仓储/服务自动注册)
Infrastructure/SharpAbp.Infrastructure.Api/Middleware/GlobalExceptionMiddleware.cs 全局异常中间件
Infrastructure/SharpAbp.Infrastructure.Api/Controllers/BaseController.cs API 基类(loginUser / GetClientIp)
Infrastructure/SharpAbp.Infrastructure.Api/Extensions/ControllerExtensions.cs Controller 结果扩展
Infrastructure/SharpAbp.Infrastructure.Api/Resilience/CircuitBreaker.cs 熔断器实现与工厂
Infrastructure/SharpAbp.Infrastructure.Api/Configuration/ConfigurationHelper.cs 环境变量读取与连接串拼装
Infrastructure/SharpAbp.Infrastructure.Api/Configuration/AppSettings.cs 强类型配置聚合模型
Infrastructure/JWTHelper/JWTExtension.cs ASP.NET Core JWT 认证接线
Infrastructure/JWTHelper/JwtTools.cs Token 生成/校验/解析
Infrastructure/JWTHelper/JWTConfig.cs JWT 配置模型
Infrastructure/MongoRepository/MongoBaseRepository.cs 通用 MongoDB 仓储实现
Infrastructure/MongoRepository/MongoBaseEntity.cs Mongo 实体基类
Infrastructure/MongoRepository/BsonCollectionAttribute.cs 集合/库名标注特性
Infrastructure/MongoRepository/Config/MongoDbSettings.cs Mongo 配置与各服务库名常量
Infrastructure/RedisHelper/RedisCache.cs Redis 缓存实现
Infrastructure/RedisHelper/DistributedLock.cs Redis 分布式锁实现
Infrastructure/RedisHelper/RedisServiceExtension.cs Redis DI 扩展
Infrastructure/RabbitMQHelper/InitRabbitMQSetup.cs MQ 初始化(Bus/订阅者注册)
Infrastructure/RabbitMQHelper/MQHostedService.cs MQ 后台订阅服务
Infrastructure/RabbitMQHelper/SendMQMessage.cs MQ 发送实现
Infrastructure/RabbitMQHelper/Attributes/RabbitMQAttribute.cs 订阅方法特性
Infrastructure/ScheduledService/CronJobService.cs 定时任务基类
Infrastructure/ScheduledService/ScheduledServiceExtensions.cs AddCronJob<T> 扩展
RedisService/IRedisService.cs 领域级 Redis 服务接口
RedisService/RedisService.cs 领域级 Redis 服务实现
RedisService/Param/RoomBotFactory.cs 捕鱼机器人生成工厂
ApiLogService/ApiLogService.cs API 日志服务(历史副本,实际使用版本在 CommonService)
Tools/RenameUploads/Program.cs 上传图片按道具编号批量重命名工具
nlog.config 全服务共用日志配置

七、与其他模块的交互

7.1 各基础设施项目被哪些业务项目引用

(以下基于各 *.csproj 的 ProjectReference 实际统计)

  • Infrastructure/Common(直接引用):CustomerSrc/CustomerService、AdminSrc/AdminService、UserSrc/UserApi、CustomerSrc/CustomerApi;同时被 MongoRepository、CommonInfrastructure、SharpAbp.Infrastructure.Api 项目引用(传递到各 Host)。
  • Infrastructure/CommonInfrastructure:ChessGameHost、UserSrc/UserService、CustomerSrc/CustomerService、AdminSrc/AdminService、UserSrc/UserApi、FishGameSrc/FishGameHost、FishGameSrc/FishRoomHost、CustomerSrc/CustomerApi。
  • Infrastructure/SharpAbp.Infrastructure.Api:AdminSrc/AdminHost、UserSrc/UserHost、UserSrc/UserApi、CustomerSrc/CustomerHost、CustomerSrc/CustomerApi、ChessGameHost、FishGameSrc/FishGameHost、FishGameSrc/FishRoomHost。
  • Infrastructure/JWTHelper:AdminSrc/AdminHost、AdminSrc/AdminService、UserSrc/UserService、CustomerSrc/CustomerService、CustomerSrc/CustomerApi(认证入口由各 Host 用 AddCustomJwt/AddJwt 接线)。
  • Infrastructure/MongoRepository:CommonDomain、ChessGameSrc/ChessGameDomain、AdminSrc/AdminDomain、UserSrc/UserDomain、CustomerSrc/CustomerService.Domain、CommonService、AdminSrc/AdminService、AdminSrc/AdminHost、UserSrc/UserService、CustomerSrc/CustomerService、UserSrc/UserApi、CustomerSrc/CustomerApi(几乎全部数据访问层)。
  • Infrastructure/RedisHelper:Infrastructure/Common、RedisService,以及各业务工程通过 Common/RedisService 间接使用(AdminHost、UserHost 等直接引用)。
  • Infrastructure/RabbitMQHelper:AdminSrc/AdminHost、AdminSrc/AdminService、CustomerSrc/CustomerService、CustomerSrc/CustomerApi。
  • Infrastructure/ScheduledService:AdminSrc/AdminHost、UserSrc/UserHost、UserSrc/UserService。
  • RedisService:Infrastructure/SharpAbp.Infrastructure.Api、Infrastructure/CommonInfrastructure、CommonService、AdminSrc/AdminService、UserSrc/UserHost、UserSrc/UserApi、CustomerSrc/CustomerHost、CustomerSrc/CustomerService、CustomerSrc/CustomerApi、FishGameSrc/FishGameService、FishRoomService、ChessGameSrc/ChessGameService。
  • ApiLogService(顶层目录):未被任何 csproj 引用,且未加入解决方案(见 7.3)。
  • Tools/RenameUploads:未被任何项目引用,是独立可执行工具。

7.2 RabbitMQ / CAP 封装的使用方式

  • 本层封装(EasyNetQ):
    1. 宿主在启动时调用 services.AddInitMQ(config => { config.Host=...; config.ListSubscribe = new List<Type>{ typeof(XxxSubscriber) }; ... }) 完成 Bus 创建与订阅服务注册。
    2. 发送方注入 ISendMQMessage,调用 Send(topic, value) 发布到 DefaultExchange(hscw.default.topic,Topic 类型);发布记录写入 Mongo mq_publish_record。
    3. 订阅方在类的方法上标注 [RabbitMQ("topic")] 并实现 IRabbitSubscribe,把该类注册进 ListSubscribe;MQHostedService 反射调用,方法签名为 (object data, Dictionary<string,string> headers);接收记录写入 Mongo mq_receive_record。
  • CAP:RabbitMQHelper.csproj 引入了 DotNetCore.CAP 8.3.4 包;平台整体以 CAP 作为业务级消息(nlog.config 中单独输出 capFile)。本类库自身实现并不依赖 CAP API。

7.3 Redis Key 约定

  • 新约定(RedisKeyGenerator,实际被 RedisService 大量使用):{服务前缀}:{业务键},前缀映射为 user → user-service、admin → admin-service、game/fish/chess → game-service、customer → customer-service、common → app-shared。 例如登录态 user-service:cid:{cid}、用户映射 user-service:uid:{userId}、验证码 user-service:verification_code:{phone}、微信 access_token app-shared:wx_access_token、房间 game-service:room:model:{分区}_{房号}、棋牌房间 game-service:chess:room:{roomId}、分布式锁前缀 app-shared:lock:。
  • 旧约定(RedisKeyConstants):统一前缀 redis0524:,客户在线为 game0524:customer:online;属历史定义,保留兼容。
  • 捕鱼运行时 Key 由 RedisService 直接拼接(无服务前缀),用于高频读写的房间内数据。

7.4 日志配置

  • 全服务共用根目录 nlog.config,以环境变量 SERVICE_NAME、INSTANCE_ID 区分服务与实例,输出到 logs/{日期}/{服务}-{实例}-{级别}.log。
  • 分级文件:-debug/-info/-warn/-error.log;另有 CAP 专用 -cap.log、Socket/SignalR 专用 -socket.log、出鱼数据专用 -fishspawn.log;各类开关在配置中以 enableXxx 变量控制,autoReload=true 支持改文件热生效。
  • ASP.NET Core 框架自身的 Info 及以下请求流水日志被屏蔽(仅保留 Warn 及以上)。

7.5 API 日志交互(重要)

  • API 日志的实际使用链路:各 Host(AdminHost、UserHost、CustomerHost、ChessGameHost、FishGameHost、FishRoomHost)的 Middleware/ApiLoggingMiddleware.cs 注入 CommonService.IApiLogService,对 /api 下的非 OPTIONS 请求做请求/响应体缓存与脱敏,构造 CommonDomain.ApiLog 并 InsertOneAsync 落库。
  • ApiLog(CommonDomain/ApiLog.cs)集合名 api_log_{yyyyMM}(按月份分集合)、库 data_0524,含 IP、token、耗时、URL、方法、Query、Body、Header、状态码、响应体、UA、来源、设备等字段。
  • 顶层 ApiLogService/ 目录为历史副本(ApiLogService.csproj 空引用、未入 sln、无法独立编译),不应作为该能力的引用来源;类库实现位于 CommonService/ApiLogService.cs,接口 CommonService/IApiLogService.cs。

(完)