做网站需要准备的工具redis做网站统计
解决RuoYi-Cloud项目ruoyi-system模块启动失败问题
在使用RuoYi-Cloud微服务框架时,很多新手可能会遇到项目启动失败的问题。本文将详细分析一个常见的启动失败案例,并提供完整的解决方案,帮助大家快速上手RuoYi-Cloud框架。
Naco容器部署问题
RuoYi-Cloud项目ruoyi-system模块启动失败问题主要就是Nacos的部署问题,该文章看完后Nacos容器化部署自然就理解了。
问题描述
克隆RuoYi-Cloud项目后,按照下面图示的项目文档一步步执行,当你执行到第5步的时候可能会感觉到疑惑不解(如果你是第一次搞微服务和Nacos的话),所以你选择跳过了。
然后你去进行下面图示的项目启动时,前面的项目还好尤其到了这个RuoYiSystemApplication (系统模块 必须)时候。
项目输出日志会出现大量的配置问题如下:可能有Nacos没配置、Redis没配置、Mapper文件配置问题,总结都是配置问题,如果你去修改代码或添加配置文件,哈哈你将非常的痛苦,因为根本解决不了。
17:56:08.913 [main] ERROR o.s.b.SpringApplication - [reportFailure,818] - Application run failed
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sysConfigController': Unsatisfied dependency expressed through field 'configService'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sysConfigServiceImpl': Invocation of init method failed; nested exception is org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to localhost:6379at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:713)at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:693)at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119)at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:408)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1431)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:619)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:336)at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:334)at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:209)at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:955)at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:591)at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147)at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:732)at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:409)at org.springframework.boot.SpringApplication.run(SpringApplication.java:308)at org.springframework.boot.SpringApplication.run(SpringApplication.java:1300)at org.springframework.boot.SpringApplication.run(SpringApplication.java:1289)at com.ruoyi.system.RuoYiSystemApplication.main(RuoYiSystemApplication.java:20)
问题分析(所以根本问题如下分析)
RuoYi-Cloud作为一个成熟的微服务框架,采用了分布式配置中心(Nacos)来管理各个服务的配置信息,而不是将所有配置硬编码在项目的配置文件中。这也是很多微服务框架的常见做法。(下面举例说明了一下,你可以理解一下这个Nacos是啥。)
-
Redis连接失败的本质原因:
- 项目默认配置中Redis的连接信息(地址、端口等)存储在Nacos配置中心
- 如果Nacos配置中心未正确配置或未启动,项目将使用默认值(localhost:6379)连接Redis
- 当本地未启动Redis服务时,就会出现上述连接失败的错误
-
Nacos配置中心的重要性:
- RuoYi-Cloud将大部分配置信息(包括数据库、Redis、服务端口等)存储在Nacos中
- 项目启动时会从Nacos获取配置信息
- 开发者通常会将配置信息初始化到名为
ry-config
的数据库中
懂了没有,不懂你就打开数据库ry-config中的表(以config_info为例)
这里面包含很多的配置如:spring、redis、mybatis的等等。
解决方案(所以如何做呢?)
要解决这个问题,需要完成Nacos配置中心的搭建配置,具体步骤如下:
因为我自己是在电脑上按照了docker,所有该解决方案针对docker中去部署Nacos和Mysql。
Nacos是注册和配置中心,Mysql用来存放,因此要通过配置这两个才行。
配置Nacos服务
1、整体架构说明
通过Docker部署Nacos 3.0.1单机版,并连接Docker中的MySQL 8.0数据库,实现配置持久化。全程包含完整的命令注释、网络配置说明及问题排查,适合新手快速上手。
2、具体操作
2.1 Docker中的镜像准备
通过docker命令docker images查看docker中的镜像版本,如下图所示:
2.2 Docker网络规划
为了让Nacos与MySQL在Docker内部高效通信,建议创建自定义桥接网络(避免使用默认bridge
网络的端口映射复杂性):
# docker network create 创建网络命令(docker中的)
# --driver bridge:指定要创建的网络类型
# bridge 是 Docker 默认的网络驱动
# Nacos-Mysql-Network:这是你为网络指定的名称
docker network create --driver bridge Nacos-Mysql-Network
# 查看网络是否创建成功,如下图所示。
docker network ls
2.3 创建Mysql容器并加入网络
# docker run -d:以守护进程模式(后台)启动容器
# --name mysql:给容器指定一个名称(便于后续操作和网络访问)
# --network Nacos-Mysql-Network:将容器加入到之前创建的网络中
# -e MYSQL_ROOT_PASSWORD=root:设置 MySQL root 用户密码
# -e MYSQL_DATABASE=ry_config:自动创建一个名为 ry_config 的数据库(Nacos 需要用到)
# -p 3306:3306:将容器的 3306 端口映射到主机的 3306 端口(可选,便于外部工具连接)
# mysql:8.0:使用的 MySQL 镜像版本
docker run -d `--name mysql `--network Nacos-Mysql-Network `-e MYSQL_ROOT_PASSWORD=root `-e MYSQL_DATABASE=ry_config `-p 3306:3306 `mysql:8.0
# 查看mysql是否加入网络了
docker network inspect Nacos-Mysql-Network
2.4 Nacos容器部署
这个用于你理解:
docker run -d ` # 以守护进程模式(后台)启动容器--name nacos ` # 给容器指定名称为 "nacos",便于后续操作--add-host host.docker.internal:host-gateway ` # 添加主机映射,让容器能访问宿主机(解决跨平台网络问题)Windows的dockere使用这个,因为不能访问本地的localhost。-p 8848:8848 ` # 映射 Nacos 主服务端口(Web 控制台和 API 端口)-p 9848:9848 ` # 映射 Nacos 客户端 gRPC 通信端口(用于服务发现/配置推送)-p 8080:8080 ` # 额外映射 8080 端口(可选,根据实际需求使用)--privileged=true ` # 授予容器特权模式,允许容器内访问更多系统资源-e JVM_XMS=256m ` # 设置 JVM 初始堆内存为 256MB(优化内存占用)-e JVM_XMX=256m ` # 设置 JVM 最大堆内存为 256MB(避免内存溢出)-e MODE=standalone ` # 指定 Nacos 运行模式为单机模式(非集群)-e MYSQL_SERVICE_HOST=host.docker.internal ` # MySQL 主机地址(通过 host.docker.internal 访问宿主机的 MySQL)-e MYSQL_SERVICE_PORT=3306 ` # MySQL 端口号(默认 3306)-e MYSQL_SERVICE_DB_NAME=ry-config ` # Nacos 要连接的 MySQL 数据库名(这里是 ry-config)-e MYSQL_SERVICE_USER=root ` # MySQL 登录用户名-e MYSQL_SERVICE_PASSWORD=password ` # MySQL 登录密码(注意:需与实际 MySQL 密码一致)-e SPRING_DATASOURCE_PLATFORM=mysql ` # 指定数据源平台为 MySQL(Nacos 会使用 MySQL 存储数据)-e NACOS_AUTH_TOKEN="这个要替换成你自己的认证令牌我的另一篇文章有写" ` # Nacos 认证令牌(v3.x 强制要求,Base64 字符串)-e NACOS_AUTH_IDENTITY_KEY=nacos-identity ` # 身份认证密钥(固定值,用于安全校验,自己设置的,随便写)-e NACOS_AUTH_IDENTITY_VALUE=security ` # 身份认证值(固定值,用于安全校验,自己设置的,随便写)-v "D:/WSL/nacos/conf:/home/nacos/conf" ` # 挂载本地配置目录到容器内(持久化配置文件,可以运行一个临时容器,拷贝出来)-v "D:/WSL/nacos/logs:/home/nacos/logs" ` # 挂载本地日志目录到容器内(持久化日志文件,可以运行一个临时容器,拷贝出来)nacos/nacos-server:v3.0.1 # 指定使用的 Nacos 镜像及版本(v3.0.1)
这个命令用于你去使用,复制起来会方便一点没有注释
docker run -d --name nacos `
>> --add-host host.docker.internal:host-gateway `
>> -p 8848:8848 `
>> -p 9848:9848 `
>> -p 8080:8080 `
>> --privileged=true `
>> -e JVM_XMS=256m `
>> -e JVM_XMX=256m `
>> -e MODE=standalone `
>> -e MYSQL_SERVICE_HOST=host.docker.internal `
>> -e MYSQL_SERVICE_PORT=3306 `
>> -e MYSQL_SERVICE_DB_NAME=ry-config `
>> -e MYSQL_SERVICE_USER=root `
>> -e MYSQL_SERVICE_PASSWORD=password `
>> -e SPRING_DATASOURCE_PLATFORM=mysql `
>> -e NACOS_AUTH_TOKEN="需要获取,通过命令,看另一篇文章" `
>> -e NACOS_AUTH_IDENTITY_KEY=nacos-identity `
>> -e NACOS_AUTH_IDENTITY_VALUE=security `
>> -v "D:/WSL/nacos/conf:/home/nacos/conf" `
>> -v "D:/WSL/nacos/logs:/home/nacos/logs" `
>> nacos/nacos-server:v3.0.1
2.5 访问Nacos控制台
启动成功后,通过以下地址访问控制台:
http://localhost:8080
默认账号密码:nacos/nacos
(生产环境需及时修改)
2.5 启动项目(成功)
总结
总之记住一点,配置好Nacos,并且将Mysql数据库中的ry-config中的配置数据加载进去就成功了。(我的文章写的比较粗糙,并且每个人的环境不一样,利用AI完成Nacos配置就好。)