记录一下使用ruoyi-cloud过程中遇到的问题
开发工具 Intellij Idea Community、Visual Studio Code
Idea 建议安装插件:Free Mybatis plugin,这样可以从 mapper 接口直接跳转到对应的 mapper.xml 文件
vscode 建议安装插件:Vetur、vscode-element-helper、ESLint
更新时间: 2020-08-08 12:10
目录
1.启动
2.代码生成
3.协同开发一个模块
4.新建模块
新增以com.ruoyi开头的模块
新增不以 com.ruoyi 开头的模块
5.将模块抽取为单独的项目
6.服务接口的定义和服务间调用
7.部署运行
jar 包运行
Redis 只能 localhost 访问,本机 IP 访问报错
docker 运行 nacos
docker 运行 ruoyi 模块
开发环境 docker 部署注意事项
按照官网的步骤,
补充:vscode 打开 ruoyi-ui后,左侧目录会出现 NPM脚本,点击 dev 右侧的小三角就能启动前端了,简单省事。如下图:
使用代码生成的时候,数据库表一定要配置主键,不然可能会遇到一些一眼看过去很奇妙的问题,我遇到的是新增和修改调用的是同一个接口,表现出来就是有一个功能异常。后期熟悉了很容易找见问题,但刚接触的时候确实摸不着头脑。
多个人协同开发同一个模块的情况多少会遇到。如果不做修改的话,在 nacos 上看到的是一个服务有多个实例,nacos 会根据配置的权重自动做均衡。这种情况下调试就会变得很麻烦。我没采用的解决办法是:假设开发ruoyi-house 模块
proxy: {
// detail: https://cli.vuejs.org/config/#devserver-proxy
[process.env.VUE_APP_BASE_API + '/house']: {
target: `http://localhost:9204`,
changeOrigin: true,
pathRewrite: {
['^' + process.env.VUE_APP_BASE_API + '/house']: ''
}
},
[process.env.VUE_APP_BASE_API]: {
target: `http://localhost:8080`,
changeOrigin: true,
pathRewrite: {
['^' + process.env.VUE_APP_BASE_API]: ''
}
}
}
因为是从上到下顺序匹配的,所以顺序一定不能变。同样的也可以实现同一模块的某个接口继续走网关,剩下的走本地,如下
proxy: {
// detail: https://cli.vuejs.org/config/#devserver-proxy
[process.env.VUE_APP_BASE_API + '/house/bedroom']: {
target: `http://localhost:8080`,
changeOrigin: true,
pathRewrite: {
['^' + process.env.VUE_APP_BASE_API]: ''
}
},
[process.env.VUE_APP_BASE_API + '/house']: {
target: `http://localhost:9204`,
changeOrigin: true,
pathRewrite: {
['^' + process.env.VUE_APP_BASE_API + '/house']: ''
}
},
[process.env.VUE_APP_BASE_API]: {
target: `http://localhost:8080`,
changeOrigin: true,
pathRewrite: {
['^' + process.env.VUE_APP_BASE_API]: ''
}
}
}
在 ruoyi-modules 上右键,new=》module,Parent 选择 ruoyi-modules,name 以 ruoyi-my 为例。如下图:
新建模块接下来修改 ruoyi-my 的 pom 文件,直接复制 ruoyi-system 的 dependencies 节点和 build 节点。创建包结构,创建启动类(复制 system 模块的启动类修改名称),创建 bootstrap.yml(同样复制 system 模块,修改端口和服务名称)。如下图:
目录结构和bootstrap.yml接下来登陆 nacos,克隆 ruoyi-system-dev.yml ,命名为 ruoyi-my-dev.yml,修改 mybatis.typeAliasesPackage,改为 com.ruoyi.my,发布。如下图:
nacos上的配置文件然后修改 ruoyi-gateway-dev.yml,添加新增的模块,发布。如下图:
网关配置关于上图中出现的 myService 的说明:myService 是和 api 中的 url 关联的。api如下:
// 查询测试用列表
export function listTest(query) {
return request({
url: '/myService/test/list',
method: 'get',
params: query
})
}
启动新模块后就可以访问了。
在“新增 com.ruoyi 开头的模块”的基础上做以下修改:以 com.mypkg.my 为例
启动项目即可。
首先,运行 mvn install 命令,将 ruoyi 的包安装到本地仓库,因为之后会用到这些包。直接在 idea 里运行就可以。如下图:
install ruoyi 各模块以“新增不以 com.ruoyi 开头的模块” 为例。先将 ruoyi-my 文件夹复制到一个新的目录,然后用 idea打开。然后修改 pom.xml 文件,修改 parent 节点,指向 ruoyi。如下:
修改pom的parent节点运行启动类,结束。
如果是以“新增以 com.ruoyi开头的模块” 为基础,那么需要添加“新增不以 com.ruoyi 开头的模块”的第2步,迁移 EnableCustomConfig 类。
以“新增不以 com.ruoyi 开头的模块” 为例。在原项目里建两个模块:my-client 和 my-server 。my-clinet 里编写对外提供的远程调用接口。将原来的逻辑迁移进 my-server 。迁移的时候要修改两个地方:主 pom 的 build 节点和 my-server pom 的 build 节点。将原主 pom 的build 节点迁移至 my-server 的pom里。主pom改用 maven-compiler-plugin 。另外,建议指定3个pom的 groupId 、artifactId、version,这样别的模块引用的时候不会混乱。如下:
主pom和my-server的pom// 主pom
org.apache.maven.plugins
maven-compiler-plugin
${java.version}
${project.build.sourceEncoding}
${maven-compiler-plugin.version}
my-client 的创建参照 ruoyi-api 即可。有一点需要注意,新建的 fallbackFactory 接口要在 resource.META-INF.spring.factories 里注册,如下图:
重复“新增不以 com.ruoyi 开头的模块” ,新建一个项目 ruoyi-my2,ruoyi-my2 调用 ruoyi-my 创建的服务。
首先 mvn install ruoyi-my 项目。ruoyi-my2 的 pom 文件中添加 ruoyi-my 项目的 my-client 的引用,不需要整个引用 ruoyi-my。然后在 annotation 包中新建接口 EnableRyFeignClients,修改启动类对 EnableRyFeignClients 的引用,改引用自定义的 EnableRyFeignClients。接着修改 EnableRyFeignClients 的 basePackages。因为 OpenFeign 默认只扫描启动类所在目录及子目录,所以默认扫不到其他包里定义的远程调用接口。EnableRyFeignClients 内容如下:
import java.lang.annotation.*;
/**
* 自定义feign注解
* 添加basePackages路径
*
* @author ruoyi
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@EnableFeignClients
public @interface EnableRyFeignClients
{
String[] value() default {};
String[] basePackages() default { "com.ruoyi", "com.mypkg" };
Class>[] basePackageClasses() default {};
Class>[] defaultConfiguration() default {};
Class>[] clients() default {};
}
ruoyi-my2 的 pom 文件中添加对 my-client 的引用:
com.mypkg
my-client
1.0.0
然后就可以调用 RemoteMyService 服务了。
打包后直接 java -jar ***.jar 会报异常:
2020-08-01 22:04:19.429 ERROR 15556 --- [ main] c.a.c.n.c.NacosPropertySourceBuilder : parse data from Nacos error,dataId:application-dev.yml,data:#请求处理的超时时间
......
org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException: Input length = 1
参考文章NACOS MalformedInputException 无法读取中文配置问题,解决办法是运行时指定编码格式:
java -D'file.encoding=utf-8' -jar .\ruoyi-auth-2.0.0.jar
报错内容:io.lettuce.core.RedisException: java.io.IOException: 远程主机强迫关闭了一个现有的连接。
参考redis本机能访问 远程不能访问的问题,解决办法:
开发环境下 nacos 使用单机版。配置参考了docker内搭建单机模式的nacos,但是原文章写的比较早,参数已经发生了变化,所以以下文为准(2020-08-02版)。建议直接参考官方的参数说明:nacos-docker。
docker pull nacos/nacos-server
docker run --env-file=env.list --name nacos -d -p 8848:8848 nacos/nacos-server
env.list 内容
MODE=standalone
SPRING_DATASOURCE_PLATFORM=mysql
MYSQL_SERVICE_DB_NAME=ry-config
MYSQL_SERVICE_HOST=192.168.1.109
MYSQL_SERVICE_USER=root
MYSQL_SERVICE_PASSWORD=root
如果使用的虚拟机(我用的vmware),则需要将主机的 8848 端口映射到虚拟机的 8848 端口,这样其他电脑才能访问到 docker 里的 nacos。步骤是:编辑=》虚拟网络编辑器=》更改设置=》NAT设置=》添加,
运行网关模块,发现没有注册到nacos。运行命令: docker logs 容器id,发现报错: java.net.NoRouteToHostException: No route to host (Host unreachable)。解决办法:防火墙开放相应端口。
默认情况下,docker 内部网络和外部是隔离的。启动的时候讲宿主机的 8080 端口映射到 docker 内网关模块的 8080 端口,这样外部通过网关访问容器内的服务没有问题,内部服务间的调用也没有问题。但是我本地访问 docker 内部的服务的时候就访问不到了,因为 docker 内服务的 IP 都是172.*。我遇到的报错提示是:请求 auth 时超时。解决办法是修改docker的网络为 host,这样服务会共用宿主机的 IP ,访问就正常了。docker 的四种网络模式的区别可以参看:Docker四种网络模式。