21.【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--身份认证服务拆分规划
从这篇文章开始我们将开始一步一步的拆分现有的单体应用孢子记账项目。按照上一篇文章中的介绍,我们首先把身份认证服务拆分出来。
一、功能分析
在当前的单体应用中,身份认证服务主要负责用户认证、授权以及角色权限管理等核心功能。
在拆分之前,我们需要对现有的身份认证服务进行全面的功能分析,明确其核心职责和依赖关系。以下是身份认证服务的主要功能模块:
- 用户认证:处理用户的登录、注册、密码重置等操作。
- 用户信息管理:维护用户的基本信息,包括个人资料和联系方式。
- 角色权限管理:管理用户角色的分配和权限控制。
- 访问控制:验证用户权限并授权访问资源。
- 日志审计:记录用户操作日志,支持后续的审计和分析。
- 安全策略:制定并执行安全策略,如密码复杂度要求和登录失败限制。
- 辅助功能:包括验证码生成和用户在线状态管理等。
在这些功能中,用户认证、用户信息管理和角色权限管理模块已经存在于现有的单体应用中,而访问控制、日志审计和安全策略等功能需要在拆分后进一步完善。同时,现有模块也需要扩展,以支持后续Ocelot网关的认证功能。
在拆分过程中,需要重点关注以下几个方面:
- 数据库设计:为身份认证服务设计独立的数据库,用于存储用户信息和角色权限等数据。
- API设计:设计RESTful API接口,供其他服务调用。
- 拆分步骤:制定合理的拆分计划,确保过程平稳。
- 非业务功能:考虑服务间通信延迟、分布式事务处理和服务依赖关系等(前述文章已讲解)。
- 运维复杂度:关注服务监控、日志管理和自动化部署等运维需求(前述文章已讲解)。
拆分过程中需确保功能完整性和数据一致性,避免对现有系统造成影响。同时,还需考虑未来的扩展性和可维护性,以支持后续的服务拆分和功能扩展。
完成拆分后,身份认证服务将成为一个独立的微服务,其他服务可通过RESTful API与其交互。我们还需实现服务注册与发现机制,以便其他服务动态获取身份认证服务的地址和端口。
二、数据库设计
在拆分身份认证服务之前,需要对现有数据库进行全面分析,明确与身份认证相关的表和字段。根据功能需求,身份认证服务的数据库设计可划分为以下模块:
- 用户表:存储用户基本信息,如用户名、密码、邮箱、手机号等。
- 角色表:存储角色信息,包括角色名称和描述。
- 权限表:存储权限信息,包括权限名称和描述。
- 用户角色关联表:记录用户与角色的关联关系。
- 角色权限关联表:记录角色与权限的关联关系。
- 操作日志表:记录用户操作日志,包括操作时间、类型和结果。
- 安全策略表:存储安全策略信息,如密码复杂度要求和登录失败限制。
- 辅助表:包括验证码表、在线用户表等。
目前系统中已有 SysUser、SysRole、SysUrl 和 SysRoleUrl 四个表与身份认证相关。需要对这些表进行字段扩展,并新增部分表以满足拆分后的需求。
在迁移过程中,应将上述表和字段转移至新的身份认证服务数据库,并确保数据的一致性和完整性。以下是数据库设计的关键考虑点:
- 数据库类型:选择适合的数据库类型,如关系型数据库(MySQL、PostgreSQL)或非关系型数据库(MongoDB、Redis)。
- 数据库架构:合理设计表结构、索引和数据分区。
- 数据库安全:确保数据加密、访问控制和备份恢复机制到位。
- 数据库性能:优化查询性能,采用缓存机制和负载均衡。
- 数据库监控:实现性能监控、异常报警和日志分析。
为满足业务需求并兼顾性能与安全性,建议采用以下方案:
- 关系型数据库 MySQL:存储用户表、角色表、权限表、用户角色关联表和角色权限关联表等结构化数据。
- 非关系型数据库 MongoDB:存储操作日志表和安全策略表等非结构化数据。
- 缓存数据库 Redis:存储验证码表和在线用户表等高频访问数据。
Tip:原计划将安全策略存储为 Nacos 配置项,但考虑到使用者可能缺乏技术背景,且 Nacos 管理界面不宜暴露在公网,为提升安全性,决定将安全策略存储在数据库中。
通过合理的数据库设计,确保身份认证服务具备高性能、高安全性和良好的扩展性,为后续服务拆分和功能扩展奠定基础。
三、API设计
在拆分身份认证服务时,需要设计RESTful API接口,以便其他服务通过HTTP协议与其交互。以下是身份认证服务的API设计方案:
-
用户认证接口
- 登录:
POST /api/auth/login
- 登出:
POST /api/auth/logout
- 注册:
POST /api/auth/register
- 重置密码:
POST /api/auth/reset-password
- 刷新Token:
POST /api/auth/refresh-token
- 登录:
-
用户信息管理接口
- 获取用户信息:
GET /api/auth/user/{userId}
- 更新用户信息:
PUT /api/auth/user/{userId}
- 删除用户:
DELETE /api/auth/user/{userId}
- 获取用户列表:
GET /api/auth/users
- 创建用户:
POST /api/auth/user
- 更新用户状态:
PUT /api/auth/user/{userId}/status
- 获取用户信息:
-
角色权限管理接口
- 获取角色列表:
GET /api/auth/roles
- 获取权限列表:
GET /api/auth/permissions
- 创建权限:
POST /api/auth/permissions
- 更新权限:
PUT /api/auth/permissions/{permissionId}
- 删除权限:
DELETE /api/auth/permissions/{permissionId}
- 获取角色权限:
GET /api/auth/roles/{roleId}/permissions
- 更新角色权限:
PUT /api/auth/roles/{roleId}/permissions
- 删除角色权限:
DELETE /api/auth/roles/{roleId}/permissions/{permissionId}
- 获取角色列表:
-
用户角色关联接口
- 获取用户角色列表:
GET /api/auth/user/{userId}/roles
- 更新用户角色:
PUT /api/auth/user/{userId}/roles
- 删除用户角色:
DELETE /api/auth/user/{userId}/roles/{roleId}
- 创建用户角色:
POST /api/auth/user/{userId}/roles
- 获取用户角色列表:
-
操作日志接口
- 获取操作日志列表:
GET /api/auth/logs
- 获取操作日志详情:
GET /api/auth/logs/{logId}
- 获取操作日志列表:
-
安全策略接口
- 获取安全策略:
GET /api/auth/security-policy
- 更新安全策略:
PUT /api/auth/security-policy
- 删除安全策略:
DELETE /api/auth/security-policy/{policyId}
- 创建安全策略:
POST /api/auth/security-policy
- 获取安全策略:
-
辅助功能接口
- 获取验证码:
GET /api/auth/captcha
- 获取在线用户列表:
GET /api/auth/online-users
- 获取在线用户详情:
GET /api/auth/online-users/{userId}
- 更新在线用户状态:
PUT /api/auth/online-users/{userId}
- 获取在线用户统计:
GET /api/auth/online-users/statistics
- 获取验证码:
通过以上API设计,确保身份认证服务具备清晰的功能划分和高效的交互能力,同时为后续的扩展和维护提供便利。
在API设计中,需要综合考虑高效性和安全性。通过遵循RESTful API设计规范,使用URI表示资源、HTTP方法表示操作,并采用状态码表示结果,同时实现API版本控制以支持未来扩展。为方便其他服务调用和测试,可使用Swagger生成详细的API文档。API性能优化至关重要,应着力提升请求响应速度和并发处理能力,并引入数据缓存机制。为保障系统稳定性,应设计完善的API监控和日志管理方案,包括记录请求日志、错误日志及性能指标。此外,统一的异常处理机制能够返回标准化的错误码和错误信息,从而提升用户体验。
四、非业务功能
4.1 安全性
在微服务架构中,安全性是至关重要的。为了防止未授权访问和数据泄露,身份认证服务的API接口需要具备以下安全设计:
- 数据传输加密:使用HTTPS协议加密数据传输,确保网络传输过程中的数据安全。
- 身份认证机制:采用JWT(JSON Web Token)认证,验证用户身份的合法性。
- 敏感数据保护:对用户密码、访问令牌等敏感数据进行加密存储。
- 访问控制:实现IP白名单和黑名单机制,限制特定IP地址的访问权限。
- 日志审计:定期审查和监控API访问日志,快速发现异常访问行为。
- 频率限制:设置API访问频率限制,防止恶意攻击和滥用。
- 漏洞管理:定期更新系统,修复已知安全漏洞,提升整体安全性。
通过以上措施,可以有效保障用户数据的安全性和系统的稳定性。此外,需定期开展安全测试和漏洞扫描,及时发现并修复潜在的安全隐患。
4.2 性能优化
在微服务架构中,性能优化是提升用户体验和系统稳定性的关键。针对身份认证服务,可以通过引入 Redis 缓存用户登录状态和权限信息来减少对数据库的频繁访问,从而降低数据库压力。同时,对于短信发送、邮件发送等耗时操作,可以采用异步处理方式,将任务放入消息队列中执行,以避免阻塞主线程并提高系统响应速度。此外,通过合理使用异步方法优化 API 接口性能,可以进一步提升并发处理能力。
五、总结
通过以上分析和设计,我们为身份认证服务的拆分奠定了基础。接下来,我们将按照设计方案逐步实施拆分工作,并在过程中不断优化和完善服务功能。拆分完成后,身份认证服务将成为一个独立的微服务,具备高性能、高安全性和良好的扩展性,为整个微服务架构的稳定运行提供有力支持。
在下一篇文章中,我们将按照本文所述的内容拆分身份认证服务,并进行详细的代码实现和测试验证。