RuoYi-Cloud诺依微服务项目
从图中解析出RuoYi-Cloud 使用微服务技术栈网关:Gateway远程调用:Ribbon/Feign注册中心:Nacos Discovery熔断降级:Sentinel配置中心:Nacos Config链路追踪:Sleuth + ZipKin/SkyWalking(没有集成,需要自己加)
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
- 登录地址:http://127.0.0.1:18080/
- 用户名/口令:sentinel/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 外部鉴权
- 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 实现步骤
更多推荐
所有评论(0)