ruoyi-cloud的执行流程分析

文章详细阐述了一个前端登录请求从Vue框架发出,经过本地代理到后端Gateway,再由Gateway依据Nacos配置转发至相应微服务的过程。涉及Feign客户端在不同微服务间的通信,以及请求路径的匹配和处理规则。

前端登录的时候,会发出

localhost:1024/dev-api/auth/login

的请求,该请求经过vue框架的proxy后,其实是去访问localhost:8080,这个要看一下ruoyi-ui中的vue.config.js中的proxy模块是咋写的。

然后再看后台代码ruoyi-gateway的bootstrap.yml文件中的server.port=8080,说明这个前端请求是先到了gateway模块的。

 然后在gateway模块的配置中发现/auth/**的请求应该发送到lb://ruoyi-auth模块,于是该请求被转发到了ruoyi-auth模块。

去ruoyi-auth模块,果然看到了有处理/login的方法。

接着我们需要重点看一下这个login方法的处理流程。

 下面ruoyi-auth模块中TokenController的login方法的源代码:

可以看到login方法调用了remoteUserService对象的getUserInfo方法。那么remoteUserService对象是怎么来的呢?

 我们看一下RemoteUserService的源代码,发现RemoteUserService有一个@FeignClient的注释,说明其实在调用remoteUserService的方法时,会被feign自动转发到ruoyi-system模块中去,比如刚才login方法中调用的getUserInfo方法,其实是去调用了ruoyi-system的/user/info/{username}方法了

 所以一个简单的/login方法,是先第一步请求了gateway模块,然后gateway模块根据nacos中的配置知道要把这个/auth/**开头的请求转发给auth模块,auth模块交给了login方法去处理,然后login方法其实是调用了ruoyi-system中的方法去实际处理的。

-------------------------------

同理,分析一下http://localhost:1024/dev-api/system/menu/getRouters这个请求的转发路径。

首先localhost:1024是先去访问vue的,vue前端框架自带的proxy转发到了localhost:8080

于是请求变成了http://localhost:8080/system/menu/getRouters

8080是后台的gateway模块监听的地址,该模块会读取nacos中的路径规则来转发请求,我们去nacos中的gateway的配置中可以看到如下内容:

 这个predicates会去预判path是不是符合/system/**的规则,匹配的话就会把请求转发给lb://ruoyi-system,而lb://ruoyi-system代表的含义就是均衡地将请求发送给注册中心的名为ruoyi-system的服务。

由于ruoyi-system这个名字的微服务是由后台代码ruoyi-system模块启动带来的,所以请求会被转发给这个模块的controller去处理。

所以下一步就是去看ruoyi-system模块的SysMenuController.java的代码,应该能看到处理/getRouters的方法

 不出所料,果然是在SysMenuController.java文件的getRouters的方法中看到了如何处理的。

---------------------

至于http://localhost:1024/dev-api/system/user/getInfo这个请求,和上面分析的一样一样的,就不具体展开讲了。

后续的其他所有的请求其实也都是类似的一个处理过程。

总结一下:

就是浏览器发起的请求先到vue框架,vue框架自带的proxy会把1024端口或者80端口转为后台的端口,所以我们在浏览器看到的地址是前端的地址而看不到后端具体请求的地址的。

然后vue框架代为请求经过转换后的地址,在这篇文章中是localhost:8080地址。

8080是gateway模块监听的地址,gateway模块中再去nacos获取spring.cloud.gateway对应的路径映射规则。如下图所示,nacos的配置是如何被读取到gateway中来的:

 

紧接着就是到auth或者直接到system模块,到auth模块的,其实后续auth也会通过feign来访问system或者其他模块的微服务的。

<think> 我们正在处理一个基于RuoYi-Cloud项目的Docker镜像制作问题。项目目录结构包含bin、docker、ruoyi-api、package-lock.json等。根据之前的讨论,用户已经了解了两种制作镜像的方法(Dockerfile和docker commit),现在需要针对这个特定项目给出制作镜像的方法。 分析项目结构: - RuoYi-Cloud是一个微服务项目,包含多个模块(如ruoyi-gateway, ruoyi-auth, ruoyi-system等) - 每个微服务模块都是一个独立的Spring Boot应用,需要单独构建镜像 - 项目根目录下的docker目录通常包含Dockerfile模板或相关脚本 制作步骤: 1. 准备环境:确保项目已编译,生成可执行的jar包(通常在各个模块的target目录下) 2. 为每个微服务模块编写Dockerfile 3. 使用docker build命令构建每个模块的镜像 以ruoyi-gateway模块为例,展示具体步骤: 步骤1:编写Dockerfile 通常在模块目录(如ruoyi-gateway)下创建Dockerfile,或者统一放在docker目录下。这里以模块目录为例: 在ruoyi-gateway目录下创建Dockerfile,内容如下: ```dockerfile # 基础镜像 FROM openjdk:11-jre-slim # 维护者信息 LABEL maintainer="ruoyi" # 设置时区 ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone # 将target目录下的jar包复制到容器中,并重命名为app.jar # 注意:这里假设Dockerfile位于ruoyi-gateway目录,且构建上下文也是该目录,因此可以找到target/ruoyi-gateway.jar COPY target/ruoyi-gateway.jar app.jar # 暴露端口 EXPOSE 8080 # 启动命令 ENTRYPOINT ["java", "-jar", "app.jar"] ``` 步骤2:构建镜像 在ruoyi-gateway目录下执行: ```bash docker build -t ruoyi-gateway:latest . ``` 步骤3:其他模块类似 按照同样的方法,为ruoyi-auth、ruoyi-system等模块编写Dockerfile并构建镜像。 但是,以上方法需要为每个模块重复编写相似的Dockerfile。我们可以优化: 优化方案1:使用统一的Dockerfile模板 我们可以将Dockerfile放在项目根目录的docker目录下,然后通过构建参数指定模块名。 例如,在docker目录下创建Dockerfile-template: ```dockerfile FROM openjdk:11-jre-slim LABEL maintainer="ruoyi" ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone # 使用构建参数指定jar包路径和名称 ARG JAR_FILE COPY ${JAR_FILE} app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.jar"] ``` 然后通过脚本循环构建各个模块: ```bash #!/bin/bash # 构建所有微服务镜像 modules=("ruoyi-gateway" "ruoyi-auth" "ruoyi-system") for module in "${modules[@]}" do # 进入模块目录 cd ${module} # 构建,指定jar文件路径 docker build -t ${module}:latest --build-arg JAR_FILE=target/${module}.jar -f ../docker/Dockerfile-template . cd .. done ``` 优化方案2:使用Maven插件(推荐) 在pom.xml中加入docker-maven-plugin,通过maven直接构建镜像。这样可以在构建Java项目的同时构建镜像。 示例配置: ```xml <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.2.0</version> <configuration> <imageName>ruoyi/${project.artifactId}</imageName> <baseImage>openjdk:11-jre-slim</baseImage> <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin> ``` 然后在每个模块目录下执行: ```bash mvn docker:build ``` 注意:以上插件配置需要根据实际情况调整。 关于项目根目录下的其他文件/目录: - bin: 通常包含启动脚本,如果需要在Docker镜像中使用,可以在Dockerfile中COPY进去 - docker: 存放Docker相关文件,如Dockerfile、docker-compose.yml等 - ruoyi-api: 可能是前端项目?如果是前端项目,则需要使用Node.js基础镜像构建 如果是前端项目(如ruoyi-ui),则Dockerfile示例: ```dockerfile # 构建阶段 FROM node:14 as build-stage WORKDIR /app COPY package*.json ./ RUN npm install COPY . . RUN npm run build # 生产阶段 FROM nginx:stable-alpine COPY --from=build-stage /app/dist /usr/share/nginx/html EXPOSE 80 CMD ["nginx", "-g", "daemon off;"] ``` 总结: 1. 后端微服务模块:使用Java基础镜像,拷贝jar包运行 2. 前端模块:使用Node.js构建,然后使用Nginx提供静态文件服务 注意事项: 1. 确保在构建镜像之前已经通过maven或npm构建好可部署的文件(如jar包、dist目录) 2. 使用.dockerignore文件忽略不必要的文件(如.git, target目录下的中间文件等),以加速构建和减小镜像体积 最后,如果用户需要将镜像推送到私有仓库(如Harbor),可以使用docker tag和docker push命令。 参考之前的引用,用户提到了查询远程仓库镜像的方法。如果用户需要查询私有仓库中的镜像,可以使用类似以下命令: ```bash # 查询私有仓库中的镜像列表 curl -u username:password https://your-harbor-domain/api/v2.0/projects/{project_name}/repositories/{repository_name}/artifacts ``` 但这不是当前问题的重点,因此简要提及。 根据用户的问题,我们生成了制作镜像的方法,特别是针对RuoYi-Cloud项目。现在,我们可以生成相关问题供用户深入探索。 </think> ### 基于 RuoYi-Cloud 项目的 Docker 镜像制作方法 以下是针对 RuoYi-Cloud 项目结构(包含 bin/docker/ruoyi-api/package-lock.json 等)的镜像制作方案: --- #### **1. 项目目录结构解析** ``` ruoyi-cloud/ ├── bin/ # 启动脚本 ├── docker/ # Docker相关配置 ├── ruoyi-api/ # API服务模块(Spring Boot) │ ├── src/ │ └── pom.xml ├── ruoyi-gateway/ # 网关模块 ├── package-lock.json # Node依赖锁定文件 └── ... # 其他微服务模块 ``` --- #### **2. 核心镜像制作流程** ##### (1) **后端微服务镜像**(以 ruoyi-gateway 为例) ```dockerfile # docker/ruoyi-gateway/Dockerfile FROM maven:3.8-openjdk-11 AS builder # 复制源码并构建 WORKDIR /app COPY ruoyi-gateway/pom.xml . RUN mvn dependency:go-offline COPY ruoyi-gateway/src ./src RUN mvn package -DskipTests # 运行时镜像 FROM openjdk:11-jre-slim COPY --from=builder /app/target/ruoyi-gateway.jar /app.jar # 使用项目中的启动脚本 COPY bin/startup.sh /startup.sh RUN chmod +x /startup.sh EXPOSE 8080 ENTRYPOINT ["/startup.sh"] ``` ##### (2) **前端镜像**(若含Node项目) ```dockerfile # docker/ruoyi-ui/Dockerfile FROM node:14 AS build WORKDIR /app COPY package*.json ./ RUN npm ci # 使用package-lock.json COPY . . RUN npm run build FROM nginx:alpine COPY --from=build /app/dist /usr/share/nginx/html COPY docker/nginx.conf /etc/nginx/conf.d/default.conf ``` --- #### **3. 构建与调试命令** ```bash # 构建网关镜像 docker build -f docker/ruoyi-gateway/Dockerfile -t ruoyi-gateway:v1 . # 调试容器(查看文件结构) docker run -it --rm ruoyi-gateway:v1 ls /app # 使用compose启动(docker/docker-compose.yml) version: '3' services: gateway: image: ruoyi-gateway:v1 ports: - "8080:8080" ``` --- #### **4. 私有镜像仓库推送** ```bash # 标记镜像 docker tag ruoyi-gateway:v1 harbor.example.com/ruoyi/gateway:v1 # 登录仓库(引用[4]方法) docker login harbor.example.com -u admin -p password # 推送镜像 docker push harbor.example.com/ruoyi/gateway:v1 # 查询私有仓库镜像(引用[2][4]) curl -u admin:password https://harbor.example.com/v2/_catalog ``` --- #### **5. 最佳实践建议** 1. **分层优化** ```dockerfile # 依赖层单独构建(利用Docker缓存) COPY pom.xml . RUN mvn dependency:go-offline # 比install更快 ``` 2. **启动脚本定制**(bin/startup.sh) ```bash #!/bin/sh java -Dspring.profiles.active=prod -jar /app.jar ``` 3. **多模块统一构建** ```bash # build-all.sh for module in gateway auth system; do docker build -f docker/$module/Dockerfile -t ruoyi-$module:v1 . done ``` 4. **安全扫描** ```bash trivy image ruoyi-gateway:v1 # 扫描镜像漏洞 ``` > 提示:所有镜像应基于相同基础OS层(如 `openjdk:11-jre-slim`)保证兼容性[^1] --- ### 关键优势 1. **分层构建**:利用Docker缓存加速构建过程 2. **环境隔离**:每个微服务独立镜像 3. **版本控制**:Dockerfile与项目代码同步管理 4. **快速回滚**:通过镜像标签管理版本(v1/v2) 5. **云原生支持**:直接兼容Kubernetes部署
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值