最近拿到一个rule-engine项目,这是一个采用前后端分离的规则引擎项目,包含前端Vue.js应用和后端Java Spring Boot服务,整体采用Maven多模块架构管理。初次接触下来,感觉这个项目整体结构比较凌乱,所以需要整理下,方便后面部署和使用的时候出现问题。因此在实践的时候把他稍微做下记录,方便后面进行回溯。
这个项目第一次打开是这样子的:
反正第一次看起来接触的时候看起来还是蛮凌乱的,项目里面虽然有部署文档,和操作手册,但是这些文档都比较简单,所以这里我们还是重新整理一下。使用ai对其项目进行分析,大概能看到这个项目的全貌,整体结构如下:
rule-engine/ ├── code/ # 主代码目录 │ ├── bod/ # 前端Vue.js应用 │ ├── bod-parent/ # 后端父模块(包含多个子模块) │ ├── main/ # 系统主入口模块 │ ├── framework/ # 框架通用组件 │ ├── platform-*/ # 平台基础模块 │ ├── report/ # 报表模块 │ └── charge/ # 计费模块 ├── ETL/ # 数据处理工具(Kettle) ├── libs/ # 第三方依赖库 ├── scripts/ # 构建和部署脚本 └── sql/ # 数据库脚本
所以这里的话,我们的初始目标是先把这个项目的后端代码先给他部署起来。
前置条件
这个项目依赖的部署组件有:
mysql rabbitmq jdk1.8 maven
所以这里的话我们需要对这些组件进行安装。
对应rabbitmq的部署,可参考:《rabbitmq部署》
这里mysql部署完成之后,需要使用如下的命令:
select @@global.sql_mode;
执行后,查看到有only_full_group的字样的话,需要给他删除掉
具体操作步骤是编辑mysql的my.cnf文件,在[mysqld]节点下添加下面的内容:
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
然后重启mysql即可,再查询刚才的sql,就可以看到only_full_group_by没有了
好了前置条件准备好了,下面正式开始。
一、导入mysql数据
这里我们在mysql中创建一个rule-engine的数据库
然后把rule-engine项目下面的两个sql文件导入进去:
先导入structure_init.sql,再导入data_init.sql
到此数据库这块就整理完了。
二、修改后端java项目的配置
这里我们使用idea打开这个rule-engine的项目,在main文件夹下,找到resources文件夹,可以看到有一些配置文件
经过我的尝试,发现这里只有修改application.yml信息才生效,修改其他的prod或者prod-slave或者test都不生效,并且我尝试在application.yml文件中配置:
spring: profiles: active: ${SPRING_PROFILES_ACTIVE:local}
也不生效,所以这里只能修改application.yml文件,如下图:
可以看到这个文件里面包含所有的配置信息,所以改这里就能完全覆盖到所有的配置,这里我们修改的信息主要有rabbitmq的信息和mysql的信息,修改完整示例如下:
server: port: 9000 spring: profiles: active: Swagger,MemoryQueue,IgnoreAuth,DevInternalDataSource,slave application: name: java-decision-engine rabbitmq: host: 192.168.32.105 username: guest password: "guest" management: security: enabled: false health: redis: enabled: false #mybatis: # configuration: # log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # spring.profiles.active=Swagger,MemoryQueue,IgnoreAuth,DevInternalDataSource,urlOpen // urlOpen 如果配置就会使用配置文件的数据中心地址,如果没有就用界面配置的地址 #bod: # decision-mode: delay # delay: 300 #mybatis: # configuration: # mapUnderscoreToCamelCase: true # log-impl: org.apache.ibatis.logging.stdout.StdOutImpl idworker: id: 1 region: 1 datacenter: datasource: driverClassName: com.mysql.jdbc.Driver url: jdbc:mysql://192.168.32.105:3306/rule-engine?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&autoReconnect=true&maxReconnects=5&useSSL=false username: root password: 123456 mysql: driverClassName: com.mysql.jdbc.Driver url: jdbc:mysql://192.168.32.105:3306/rule-engine?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&autoReconnect=true&maxReconnects=5&useSSL=false username: root password: 123456 schemaName: rule-engine report: datasource: driverClassName: com.mysql.jdbc.Driver url: jdbc:mysql://192.168.32.105:3306/rule-engine?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&autoReconnect=true&maxReconnects=5&useSSL=false username: root password: 123456 auth: act: '' token: '' datacenter: url: 'http://localhost:9000/api/datacenter' AutoUpdateReportSwitch: true ETL: file: path: 'ETL/'
三、启动后端项目
这里我们把整个后端项目启动起来,这个项目比较凌乱,我看到有非常多application类,尝试启动都失败了,最后找到main中的Boot.java,这才是整个项目的启动类,直接运行启动,就可以把项目启动起来了
四、测试访问后端9000接口看是否成功
接下来就进行一下测试,直接浏览器访问9000端口看能否访问通
没有问题,说明后端都启动起来了。
四、打包前端
接下来我们打包前端项目,准备把前端项目放到nginx上运行,这里前端项目的话,在整个项目的rule-engine/code/bod文件夹下,如下图:
直接运行npm 命令进行打包即可:
./build.sh
备注:
1、这里要求的node版本,一般为node14.20.1,其他版本我没有测试过。具体的版本安装可以使用nvm,详见《nvm安装node》。
2、这里我编写了一个dockerfile文件,内容如下:
# 直接使用Nginx部署(假设已在本地运行build.sh构建) FROM nginx:1.21-alpine # 复制本地构建好的静态文件到Nginx的html目录 COPY static /usr/share/nginx/html # 复制Nginx配置文件 COPY nginx.conf /etc/nginx/conf.d/default.conf # 暴露端口 EXPOSE 80 # 启动Nginx CMD ["nginx", "-g", "daemon off;"]
这样子方便把前端项目打包到docker镜像里面,方便直接docker启动起来,会更加方便一点。整个运行顺序是:
1、先执行code/bod文件夹下的build.sh文件进行本地打包。 2、再执行docker build -t bod-frontend . 打docker镜像 3、再执行docker run -d -p 8080:80 bod-frontend 命令运行前端镜像容器.
3、在打包之前,记得修改下对应的code/bod/nginx.conf文件,把后端的地址修改下:
我这里运行docker容器之后,是这样子的:
然后访问本地的8080端口,可以看到成功访问到前端项目了
此时如果后端项目启动起来了,那么直接输入对应的账号和密码:
账号:admin 密码:admin
就可以登录进去了
以上就是相关的项目踩坑记录。总算把这个项目成功的运行起来了。
上面是本地运行后端项目及前端docker打包相关的信息,后端java这块其实也可以打docker镜像,在scripts文件夹下有一个现成的dockerfile
但是我们一般不用他,我在跟目录下创建了一个dockerfile-backend的文件,内容是:
# 第一阶段:使用Maven构建项目 FROM maven:3.8.5-openjdk-8 AS builder # 设置工作目录 WORKDIR /app # 复制整个项目到工作目录 COPY . /app # 构建项目(按照正确的顺序构建所有模块) RUN mvn clean install -DskipTests -f code/framework/component/pom.xml \ && mvn clean install -DskipTests -f code/framework/component-common/pom.xml \ && mvn clean install -DskipTests -f code/framework/component-queue/pom.xml \ && mvn clean install -DskipTests -f code/framework/component-rest/pom.xml \ && mvn clean install -DskipTests -f code/framework/framework-server/pom.xml \ && mvn clean install -DskipTests -f code/platform-system/pom.xml \ && mvn clean install -DskipTests -f code/charge/pom.xml \ && mvn clean install -DskipTests -f code/platform-flow/pom.xml \ && mvn clean install -DskipTests -f code/field/pom.xml \ && mvn clean install -DskipTests -f code/bod-parent/pom.xml \ && mvn clean install -DskipTests -f code/report/pom.xml \ && mvn clean package -DskipTests -f code/main/pom.xml # 创建product目录并复制必要的文件 RUN mkdir -p /app/product \ && cp /app/code/main/target/rule-engine-main.jar /app/product/ \ && cp /app/code/main/src/main/resources/application.yml /app/product/ \ && cp -r /app/code/main/ETL /app/product/ETL # 第二阶段:使用OpenJDK运行应用 FROM openjdk:8u342-jre # 设置环境变量 ENV TZ=Asia/Shanghai ENV JAVA_OPTS="-Xms128m -Xmx512m" ENV JAVA_JVM_OPTS="-Djava.security.egd=file:/dev/./urandom" # 设置时区 RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone # 创建应用目录 RUN mkdir -p /rule WORKDIR /rule # 从第一阶段复制构建好的文件 COPY --from=builder /app/product /rule/ # 暴露端口(根据实际应用端口调整) EXPOSE 9000 # 启动应用 CMD java $JAVA_JVM_OPTS $JAVA_OPTS -jar /rule/rule-engine-main.jar
这样子,可以直接在rule-engine跟目录下执行下面的命令打后端的images镜像
docker build -t bod-backend -f Dockerfile-backend .
最后我们打包成功,可以直接使用
docker run -d -p 9000:9000 bod-backend
运行后端项目了,整个项目运行docker的效果如下:
最后登录前端访问也没有任何问题





















还没有评论,来说两句吧...