从零构建企业级员工管理系统:RuoYi-Cloud微服务实战指南

第一次接触微服务架构时,面对Nacos、Gateway、Sentinel这些组件,很多开发者会陷入"每个工具都会用,但不知道如何串联"的困境。RuoYi-Cloud作为国内流行的企业级开发框架,其价值不仅在于提供现成的技术栈,更在于展示了这些组件如何协同工作。本文将从一个具体业务场景——员工管理系统出发,带您体验从数据库设计到前后端联调的完整流程。

1. 环境准备与框架初始化

1.1 基础环境配置

在开始前确保已安装以下组件(版本需严格匹配):

# 验证Java版本
java -version  # 要求JDK 1.8+
# 检查Nacos运行状态
curl http://localhost:8848/nacos/  # 需返回登录页面

推荐使用Docker快速搭建依赖服务:

# docker-compose.yml示例
version: '3'
services:
  nacos:
    image: nacos/nacos-server:2.0.3
    ports:
      - "8848:8848"
  redis:
    image: redis:6.2-alpine
    ports:
      - "6379:6379"

1.2 项目初始化

从GitHub获取最新代码:

git clone https://github.com/ruoyi-vue-pro/ruoyi-cloud.git
cd ruoyi-cloud && mvn clean install

关键目录结构说明:

ruoyi-cloud
├── ruoyi-auth       # 认证中心
├── ruoyi-gateway    # API网关
├── ruoyi-system     # 系统模块(业务主模块)
├── ruoyi-gen        # 代码生成器
└── ruoyi-modules    # 自定义模块目录

2. 数据库设计与代码生成

2.1 员工表结构设计

在ry-cloud数据库执行以下SQL:

CREATE TABLE `sys_employee` (
  `employee_id` bigint NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL COMMENT '姓名',
  `gender` char(1) DEFAULT '0' COMMENT '性别(0男 1女)',
  `mobile` varchar(11) COMMENT '手机号',
  `dept_id` bigint COMMENT '所属部门',
  `position` varchar(50) COMMENT '职位',
  `entry_date` datetime COMMENT '入职日期',
  `status` char(1) DEFAULT '0' COMMENT '状态(0在职 1离职)',
  PRIMARY KEY (`employee_id`)
) ENGINE=InnoDB COMMENT='员工信息表';

注意:字段命名需遵循框架规范,系统表以 sys_ 前缀开头

2.2 使用代码生成器

  1. 启动 ruoyi-gen 模块
  2. 访问 http://localhost:80/dev-api/code 进入生成界面
  3. 导入刚创建的表后,关键配置项如下:
配置项 示例值 说明
生成包路径 com.ruoyi.system 对应system模块
生成模块名 system 路由前缀
生成业务名 employee 形成/employee/**路由
上级菜单 系统管理 菜单归属位置

生成后的代码结构:

src/main/java/com/ruoyi/system
├── domain      # 实体类
├── mapper      # MyBatis接口
├── service     # 服务层
└── controller  # 控制器

3. 微服务组件集成实战

3.1 网关路由配置

ruoyi-gateway 的application.yml中添加:

spring:
  cloud:
    gateway:
      routes:
        - id: ruoyi-employee
          uri: lb://ruoyi-system
          predicates:
            - Path=/employee/**
          filters:
            - StripPrefix=1

3.2 权限控制实现

框架默认采用JWT鉴权,员工管理接口需添加权限注解:

@RestController
@RequestMapping("/employee")
public class EmployeeController {
    
    @PreAuthorize("@ss.hasPermi('system:employee:list')")
    @GetMapping("/list")
    public TableDataInfo list(Employee employee) {
        // 查询逻辑
    }
}

权限标识与数据库 sys_menu 表中 perms 字段对应:

INSERT INTO sys_menu VALUES 
(10600, '员工管理', 1, 1, 'employee', null, 0, 0, 'C', '0', '0', 'system:employee:list', '#', 'admin', NOW(), '', NULL);

3.3 熔断保护配置

ruoyi-system 模块集成Sentinel:

  1. 添加依赖:
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
  1. 配置降级规则:
@GetMapping("/info/{employeeId}")
@SentinelResource(value = "employeeInfo", 
                  blockHandler = "handleBlock",
                  fallback = "handleFallback")
public AjaxResult getInfo(@PathVariable Long employeeId) {
    // ...
}

// 熔断处理
public AjaxResult handleBlock(Long employeeId, BlockException ex) {
    return AjaxResult.error("请求过于频繁");
}

4. 前端联调与功能优化

4.1 Vue组件开发

生成的前端代码位于 src/views/system/employee

<template>
  <div class="app-container">
    <el-table :data="list" v-loading="loading">
      <el-table-column prop="name" label="姓名" width="120" />
      <el-table-column prop="mobile" label="手机号" width="150" />
      <el-table-column label="操作">
        <template #default="scope">
          <el-button size="mini" @click="handleEdit(scope.row)">编辑</el-button>
        </template>
      </el-table-column>
    </el-table>
  </div>
</template>

4.2 API接口封装

src/api/system/employee.js 中扩展自定义方法:

import request from '@/utils/request'

export function searchEmployee(params) {
  return request({
    url: '/employee/search',
    method: 'get',
    params
  })
}

4.3 性能优化技巧

  1. 启用MyBatis二级缓存:
<!-- 在mapper.xml中添加 -->
<cache eviction="LRU" flushInterval="60000"/>
  1. 添加Redis缓存:
@Cacheable(key = "'employee:' + #employeeId", 
           value = "employeeCache")
public Employee selectEmployeeById(Long employeeId) {
    return employeeMapper.selectById(employeeId);
}

5. 生产环境部署建议

5.1 容器化部署方案

构建Docker镜像示例:

FROM openjdk:8-jdk-alpine
COPY target/ruoyi-system.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

使用Kubernetes部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: ruoyi-system
spec:
  replicas: 3
  selector:
    matchLabels:
      app: system
  template:
    spec:
      containers:
      - name: system
        image: registry.example.com/ruoyi-system:v1.0
        ports:
        - containerPort: 8080

5.2 监控配置

集成Prometheus监控:

  1. 添加依赖:
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
  1. 配置端点暴露:
management:
  endpoints:
    web:
      exposure:
        include: health,info,prometheus

在项目开发过程中,发现RuoYi-Cloud的代码生成器对复杂关联关系的支持有限,对于多表联查场景需要手动扩展Mapper文件。建议在生成基础代码后,根据业务需求进行二次开发,特别是涉及复杂查询时,可以结合QueryDSL等工具提升开发效率。

更多推荐