微服务模块的请求链路分析
在这个微服务模块中,我们可以识别出几个核心的请求链路:
- 菜单管理相关的请求链路
 - 菜单权限相关的请求链路
 - 角色管理相关的请求链路
 
下面我们将针对这三个请求链路进行详细分析。
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 层会采用事务控制来保证数据一致性。这种设计模式可以很好地避免因并发操作导致的数据不一致问题。
总之,通过对这个微服务模块的请求链路分析,我们对其整体架构和实现细节有了更深入的理解,为后续的功能扩展和性能优化奠定了基础。