1、架构图

从图中解析出RuoYi-Cloud 使用微服务技术栈

  • 网关:Gateway
  • 远程调用:Ribbon/Feign
  • 注册中心:Nacos Discovery
  • 熔断降级:Sentinel
  • 配置中心:Nacos Config
  • 链路追踪:Sleuth + ZipKin/SkyWalking  (没有集成,需要自己加

2、系统模块

3、环境部署

  • java

  • redis

  • npm和node

  • Nocos环境

新建一个 启动的批处理文件

版本要求:

        若依要求 nacos2.0以上

访问Nocas的管理端, 浏览器输入:http://192.168.xxx.xxx:8848/nacos/idex.html

默认的用户名密码是:nocas/nocas

  • Sentinel环境
    • 启动命令:java -Dserver.port=18080 -Dcsp.sentinel.dashboard.server=localhost:18080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.5.jar
    • 比如默认的用户/口令是:sentinel/sentinel
    • 在使用java命令执行jar包时,一般会传入参数,官网提供参数常用如下:

-Dserver.port=18080,指定端口号。

-Dcsp.sentinel.dashboard.server=localhost:18080,指定ip和端口号。

-Dproject.name=sentinel-dashboard,指定项目名称。

-Dsentinel.dashboard.auth.username=sentinel,指定用户名称。

-Dsentinel.dashboard.auth.password=123456,指定登录密码。

-Dserver.servlet.session.timeout=7200,指定SpringBoot服务端session的过期时间,如7200表示7200秒;60m表示60分钟,默认为30分钟。

-Dauth.enabled=true,指定开启权限验证。

创建启动脚本,双击启动

登录Sentinel

 

4、Nacos配置

nacos持久化配置

重新启动nacos,使配置生效

5、项目启动

springboot 项目 一键启动管理

6、解读技巧

只要是java web项目,流程主干线永远不变:发起请求---处理请求---响应请求

响应大体流程图:

  • 前端
    • 客户端如何发起请求(路径/方式/参数),F12查看
  • 后端
    • 接口接收请求,处理请求,响应请求
      • 简单流程:网关---过滤器---拦截器--微服务
      • 复杂流程:网关---上游过滤器---上游拦截器---上游微服务---下游过滤器---下游拦截器---下游微服务

6.1 网关模块

        网关为项目的入库,若依(Ruoyi-Cloud)项目的可以简化为:

在Ruoyi-Gateway网关服务中配置了所有微服务路由映射

spring:
  redis:
    host: localhost
    port: 6379
    password:
  cloud:
    gateway:
      discovery:
        locator:
          lowerCaseServiceId: true
          enabled: true
      routes:
        # 认证中心
        - id: ruoyi-auth
          uri: lb://ruoyi-auth
          predicates:
            - Path=/auth/**
          filters:
            # 验证码处理
            - CacheRequestFilter
            - ValidateCodeFilter
            - StripPrefix=1
        # 代码生成
        - id: ruoyi-gen
          uri: lb://ruoyi-gen
          predicates:
            - Path=/code/**
          filters:
            - StripPrefix=1
        # 定时任务
        - id: ruoyi-job
          uri: lb://ruoyi-job
          predicates:
            - Path=/schedule/**
          filters:
            - StripPrefix=1
        # 系统模块
        - id: ruoyi-system
          uri: lb://ruoyi-system
          predicates:
            - Path=/system/**
          filters:
            - StripPrefix=1
        # 文件服务
        - id: ruoyi-file
          uri: lb://ruoyi-file
          predicates:
            - Path=/file/**
          filters:
            - StripPrefix=1

# 安全配置
security:
  # 验证码
  captcha:
    enabled: true
    type: math
  # 防止XSS攻击
  xss:
    enabled: true
    excludeUrls:
      - /system/notice
  # 不校验白名单
  ignore:
    whites:
      - /auth/logout
      - /auth/login
      - /auth/register
      - /*/v2/api-docs
      - /csrf

 前端发起的所有的请求都经过网关,再由网关路由统一转发

  • 访问ruoyi-file微服务路径规则:http://localhost:80/dev-api/file/**
  • 访问ruoyi-gen微服务路径规则:http://localhost:80/dev-api/code/**
  • 访问ruoyi-job微服务路径规则:http://localhost:80/dev-api/schedule/**
  • 访问ruoyi-system微服务路径规则:http://localhost:80/dev-api/system/**
  • 访问ruoyi-auth微服务路径规则:http://localhost:80/dev-api/auth/**
6.2 鉴权模块

若依(Ruoyi-Cloud)鉴权模块涉及到这几个模块:

登录鉴权的2种模式:

  • 外部鉴权:客户端访问服务端(微服务),已JWT令牌为判断依据,有且合法放行,没有或    不合法拒绝
  • 内部鉴权:上游微服务访问下游微服务,以请求头标记:from-source=inner有无为依据,有放行,没有拒绝
6.2.1 外部鉴权
  1. JWT获取

        登录页面点击登录发起:http://localhost/dev-api/auth/login请求

6.2.2 内部鉴权

    内部鉴权是微服务与微服务间鉴权,发生在上游服务访问下游服务,以请求头标记:

from-source=inner有无为依据,有就放行,没有拒绝,其目的是实现网络隔离。

 来自网关请求,以JWT进行鉴权,来自内部远程调用请求,已from-source=inner进行鉴权,其他非法请求直接拒绝。

6.3 代码生成模块

若依Ruoyi-Cloud代码生成模块是一个简单模块,用于构建若依体系的代码

 代码生成使用过程

6.3.1 步骤1:创建表

在ry-cloud库中创建一个Employee表

CREATE TABLE `sys_employee` (
    `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
    `name` varchar(255) DEFAULT NULL COMMENT '名称',
    `age` int DEFAULT NULL COMMENT '年龄',
    PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='员工表';

添加几条测试数据

 

6.3.2 步骤2:导入新建表

在代码生成界面导入新建表

 

6.3.3 步骤3:定制代码信息

  • 字段列名:表中列的名称
  • 字段描述:生成实体类属性注释
  • 物理类型:表中列的类型
  • java类型:生成实体类属性变量类型
  • java属性:生成实体类属性名
  • 插入:定义添加操作模态框表单控件,选中标识模态框有这个输入空间
  • 编辑:定义编辑操作模态框表单控件,选中标识模态框有这个输入空间
  • 列表:表中数据7在列表时,该列数据是否显示,选中为要显示
  • 查询:该列是否作为列表的查询条件,选中为需要作为查询条件
  • 查询方式:作为查询条件时,使用匹配方式
  • 显示类型:查询条件输入类型
  • 字典类型:查询条件显示类型如果是下拉框,使用字典类型,实现下拉选择

生成信息:

  • 生成模板:一般不动,以表单操作为主
  • 生成包路径:指定当前代码生成根包路径
  • 生成模块名:该功能所属模块,落地到代码就是所在微服务名称,ruoyi-gateway配置的路由映射路径名
  • 生成业务名:该功能英文名,落地到代码就是controller中操作资源名,比如:/employee
  • 生成功能名:该功能中文名
  • 上级菜单:该功能是页面展示菜单连接挂在到哪个上级菜单。

预览

 配置上面各种信息成功之后,点击预览,根据需要微调

 

生成代码

确定无误后,直接点生成代码

 

6.3.4 步骤4:使用代码

说明:

  • employeeMenu.sql:涉及要添加的菜单,菜单权限,在Navicat中执行
-- 菜单 SQL
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('员工', '1', '1', 'employee', 'system/employee/index', 1, 0, 'C', '0', '0', 'system:employee:list', '#', 'admin', sysdate(), '', null, '员工菜单');

-- 按钮父菜单ID
SELECT @parentId := LAST_INSERT_ID();

-- 按钮 SQL
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('员工查询', @parentId, '1',  '#', '', 1, 0, 'F', '0', '0', 'system:employee:query',        '#', 'admin', sysdate(), '', null, '');

insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('员工新增', @parentId, '2',  '#', '', 1, 0, 'F', '0', '0', 'system:employee:add',          '#', 'admin', sysdate(), '', null, '');

insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('员工修改', @parentId, '3',  '#', '', 1, 0, 'F', '0', '0', 'system:employee:edit',         '#', 'admin', sysdate(), '', null, '');

insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('员工删除', @parentId, '4',  '#', '', 1, 0, 'F', '0', '0', 'system:employee:remove',       '#', 'admin', sysdate(), '', null, '');

insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('员工导出', @parentId, '5',  '#', '', 1, 0, 'F', '0', '0', 'system:employee:export',       '#', 'admin', sysdate(), '', null, '');

执行成功后,刷新前端项目,可以看到菜单

  • vue

分别拷贝到前端项目中

 说明:全部复制后,找到src目录后,后自动复制到api、views文件夹下,不需要一个一个的复制

刷新之后,点击员工菜单,缺少后端接口

  • main

后端接口代码,将main代码拷贝到ruoyi-system main 目录中即可

 

然后,重启ruoyi-system服务,再访问

 7、定制微服务

7.1 需求
7.2 代码结构
7.3 实现步骤

Logo

基于 Vue 的企业级 UI 组件库和中后台系统解决方案,为数万开发者服务。

更多推荐