微服务模块的请求链路分析
在这个微服务模块中,我们可以识别出几个核心的请求链路:
- 菜单管理相关的请求链路
- 菜单权限相关的请求链路
- 角色管理相关的请求链路
下面我们将针对这三个请求链路进行详细分析。
1. 菜单管理的请求链路
1.1 获取路由菜单
scss
MenuController.route()
-> MenuService.listBySysType()
-> MenuMapper.listBySysType()
- 用户访问
/menu/route
接口 MenuController.route()
方法被调用MenuService.listBySysType()
方法查询出当前用户有权限访问的菜单列表MenuMapper.listBySysType()
方法从数据库中查询菜单数据
1.2 获取单个菜单
scss
MenuController.getByMenuId()
-> MenuService.getByMenuId()
-> MenuMapper.getByMenuId()
- 用户访问
/menu?menuId={id}
接口 MenuController.getByMenuId()
方法被调用MenuService.getByMenuId()
方法查询指定菜单ID的菜单详情MenuMapper.getByMenuId()
方法从数据库中查询菜单数据
1.3 保存菜单
scss
MenuController.save()
-> MenuService.save()
-> MenuMapper.save()
- 用户访问
/menu
接口发起保存菜单请求 MenuController.save()
方法被调用MenuService.save()
方法保存菜单数据MenuMapper.save()
方法将菜单数据插入数据库
1.4 更新菜单
scss
MenuController.update()
-> MenuService.update()
-> MenuMapper.update()
- 用户访问
/menu
接口发起更新菜单请求 MenuController.update()
方法被调用MenuService.update()
方法更新菜单数据MenuMapper.update()
方法将菜单数据更新到数据库
1.5 删除菜单
scss
MenuController.delete()
-> MenuService.deleteById()
-> MenuMapper.deleteById()
- 用户访问
/menu?menuId={id}
接口发起删除菜单请求 MenuController.delete()
方法被调用MenuService.deleteById()
方法删除指定菜单ID的菜单MenuMapper.deleteById()
方法从数据库中删除该菜单数据
2. 菜单权限的请求链路
2.1 获取菜单下的权限列表
scss
MenuPermissionController.listByMenuId()
-> MenuPermissionService.listByMenuId()
-> MenuPermissionMapper.listByMenuId()
- 用户访问
/menu_permission/list_by_menu?menuId={id}
接口 MenuPermissionController.listByMenuId()
方法被调用MenuPermissionService.listByMenuId()
方法查询指定菜单ID下的权限列表MenuPermissionMapper.listByMenuId()
方法从数据库中查询该菜单下的权限数据
2.2 获取单个菜单权限
scss
MenuPermissionController.getByMenuPermissionId()
-> MenuPermissionService.getByMenuPermissionId()
-> MenuPermissionMapper.getByMenuPermissionId()
- 用户访问
/menu_permission?menuPermissionId={id}
接口 MenuPermissionController.getByMenuPermissionId()
方法被调用MenuPermissionService.getByMenuPermissionId()
方法查询指定菜单权限ID的权限详情MenuPermissionMapper.getByMenuPermissionId()
方法从数据库中查询该权限数据
2.3 保存菜单权限
scss
MenuPermissionController.save()
-> MenuPermissionService.save()
-> MenuPermissionMapper.save()
- 用户访问
/menu_permission
接口发起保存菜单权限请求 MenuPermissionController.save()
方法被调用MenuPermissionService.save()
方法保存菜单权限数据MenuPermissionMapper.save()
方法将菜单权限数据插入数据库
2.4 更新菜单权限
scss
MenuPermissionController.update()
-> MenuPermissionService.update()
-> MenuPermissionMapper.update()
- 用户访问
/menu_permission
接口发起更新菜单权限请求 MenuPermissionController.update()
方法被调用MenuPermissionService.update()
方法更新菜单权限数据MenuPermissionMapper.update()
方法将菜单权限数据更新到数据库
2.5 删除菜单权限
scss
MenuPermissionController.delete()
-> MenuPermissionService.deleteById()
-> MenuPermissionMapper.deleteById()
- 用户访问
/menu_permission?menuPermissionId={id}
接口发起删除菜单权限请求 MenuPermissionController.delete()
方法被调用MenuPermissionService.deleteById()
方法删除指定菜单权限ID的权限MenuPermissionMapper.deleteById()
方法从数据库中删除该菜单权限数据
3. 角色管理的请求链路
3.1 分页获取角色列表
scss
RoleController.page()
-> RoleService.page()
-> RoleMapper.list()
- 用户访问
/role/page
接口 RoleController.page()
方法被调用RoleService.page()
方法查询角色分页数据RoleMapper.list()
方法从数据库中查询角色列表数据
3.2 获取单个角色
scss
RoleController.getByRoleId()
-> RoleService.getByRoleId()
-> RoleMapper.getByRoleId()
-> RoleMenuMapper.getByRoleId()
- 用户访问
/role?roleId={id}
接口 RoleController.getByRoleId()
方法被调用RoleService.getByRoleId()
方法查询指定角色ID的角色详情RoleMapper.getByRoleId()
方法从数据库中查询角色数据RoleMenuMapper.getByRoleId()
方法查询该角色关联的菜单和权限ID
3.3 保存角色
scss
RoleController.save()
-> RoleService.save()
-> RoleMapper.save()
-> RoleMenuMapper.insertBatch()
- 用户访问
/role
接口发起保存角色请求 RoleController.save()
方法被调用RoleService.save()
方法保存角色数据RoleMapper.save()
方法将角色数据插入数据库RoleMenuMapper.insertBatch()
方法保存角色与菜单/权限的关联关系
3.4 更新角色
scss
RoleController.update()
-> RoleService.update()
-> RoleMapper.update()
-> RoleMenuMapper.deleteByRoleId()
-> RoleMenuMapper.insertBatch()
- 用户访问
/role
接口发起更新角色请求 RoleController.update()
方法被调用RoleService.update()
方法更新角色数据RoleMapper.update()
方法将角色数据更新到数据库RoleMenuMapper.deleteByRoleId()
方法删除该角色之前的菜单/权限关联关系RoleMenuMapper.insertBatch()
方法保存角色与菜单/权限的新关联关系
3.5 删除角色
scss
RoleController.delete()
-> RoleService.deleteById()
-> RoleMapper.deleteById()
-> RoleMenuMapper.deleteByRoleId()
-> UserRoleMapper.deleteByRoleId()
- 用户访问
/role?roleId={id}
接口发起删除角色请求 RoleController.delete()
方法被调用RoleService.deleteById()
方法删除指定角色ID的角色RoleMapper.deleteById()
方法从数据库中删除该角色数据RoleMenuMapper.deleteByRoleId()
方法删除该角色与菜单/权限的关联关系UserRoleMapper.deleteByRoleId()
方法删除用户与该角色的关联关系
通过以上对微服务模块的请求链路分析,我们可以清楚地了解各个功能的实现细节。下面我们用时序图的方式总结一下整个模块的核心请求链路:
sequenceDiagram
participant Client
participant MenuController
participant MenuService
participant MenuMapper
participant MenuPermissionController
participant MenuPermissionService
participant MenuPermissionMapper
participant RoleController
participant RoleService
participant RoleMapper
participant RoleMenuMapper
participant UserRoleMapper
Client->>MenuController: GET /menu/route
MenuController->>MenuService: listBySysType()
MenuService->>MenuMapper: listBySysType()
MenuMapper-->>MenuService: 菜单列表
MenuService-->>MenuController: 菜单列表
Client->>MenuPermissionController: GET /menu_permission/list_by_menu
MenuPermissionController->>MenuPermissionService: listByMenuId()
MenuPermissionService->>MenuPermissionMapper: listByMenuId()
MenuPermissionMapper-->>MenuPermissionService: 权限列表
MenuPermissionService-->>MenuPermissionController: 权限列表
Client->>RoleController: GET /role/page
RoleController->>RoleService: page()
RoleService->>RoleMapper: list()
RoleMapper-->>RoleService: 角色分页列表
RoleService-->>RoleController: 角色分页列表
Client->>RoleController: GET /role
RoleController->>RoleService: getByRoleId()
RoleService->>RoleMapper: getByRoleId()
RoleMapper-->>RoleService: 角色详情
RoleService->>RoleMenuMapper: getByRoleId()
RoleMenuMapper-->>RoleService: 关联菜单权限ID
RoleService-->>RoleController: 角色详情
Client->>RoleController: POST /role
RoleController->>RoleService: save()
RoleService->>RoleMapper: save()
RoleMapper-->>RoleService: 保存角色
RoleService->>RoleMenuMapper: insertBatch()
RoleMenuMapper-->>RoleService: 保存角色菜单权限关系
Client->>RoleController: PUT /role
RoleController->>RoleService: update()
RoleService->>RoleMapper: update()
RoleMapper-->>RoleService: 更新角色
RoleService->>RoleMenuMapper: deleteByRoleId()
RoleMenuMapper-->>RoleService: 删除旧菜单权限关系
RoleService->>RoleMenuMapper: insertBatch()
RoleMenuMapper-->>RoleService: 保存新菜单权限关系
Client->>RoleController: DELETE /role
RoleController->>RoleService: deleteById()
RoleService->>RoleMapper: deleteById()
RoleMapper-->>RoleService: 删除角色
RoleService->>RoleMenuMapper: deleteByRoleId()
RoleMenuMapper-->>RoleService: 删除角色菜单权限关系
RoleService->>UserRoleMapper: deleteByRoleId()
UserRoleMapper-->>RoleService: 删除用户角色关系
通过这个时序图,我们可以清楚地看到整个微服务模块中各个功能的实现流程。每个请求都经过 Controller -> Service -> Mapper 的调用链路,Controller 负责接收和响应请求,Service 负责实现业务逻辑,Mapper 负责数据库操作。这种清晰的职责划分有助于代码的可读性和可维护性。
同时我们还发现,在一些关键的操作中,比如保存/更新角色时,涉及到多个表的数据变更,Service 层会采用事务控制来保证数据一致性。这种设计模式可以很好地避免因并发操作导致的数据不一致问题。
总之,通过对这个微服务模块的请求链路分析,我们对其整体架构和实现细节有了更深入的理解,为后续的功能扩展和性能优化奠定了基础。