若依微服务版(ruoyi-cloud)使用记录

记录一下使用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 部署注意事项


1.启动

 按照官网的步骤,

  1. 导入项目,创建数据库和表,启动nacos。接下来修改nacos=》配置管理=》配置列表,把里面用到数据库连接的地方全部换成自己的数据库,并修改用户名和密码,包括:ruoyi-system-dev.yml、ruoyi-auth-dev.yml、ruoyi-gen-dev.yml、ruoyi-job-dev.yml
  2. 下载、安装、启动Redis(注意,2020-07-22的时候官网文档没写这一步,但是必须要启动redis),将nacos配置列表所有用到Redis的地方换成自己的链接,包括:ruoyi-gateway-dev.yml、ruoyi-auth-dev.yml、ruoyi-system-dev.yml
  3. 启动前端。我遇到了某个包下载不下来的情况(ejs),解决办法是单独安装一下那个包,或者复制一个放到 node_modules 下也行。node 版本最好不要太低,我用的12.16.3

补充:vscode 打开 ruoyi-ui后,左侧目录会出现 NPM脚本,点击 dev 右侧的小三角就能启动前端了,简单省事。如下图:

若依微服务版(ruoyi-cloud)使用记录_第1张图片

2.代码生成

使用代码生成的时候,数据库表一定要配置主键,不然可能会遇到一些一眼看过去很奇妙的问题,我遇到的是新增和修改调用的是同一个接口,表现出来就是有一个功能异常。后期熟悉了很容易找见问题,但刚接触的时候确实摸不着头脑。

3.协同开发一个模块

多个人协同开发同一个模块的情况多少会遇到。如果不做修改的话,在 nacos 上看到的是一个服务有多个实例,nacos 会根据配置的权重自动做均衡。这种情况下调试就会变得很麻烦。我没采用的解决办法是:假设开发ruoyi-house 模块

  1. 修改 resources 目录下的 bootstrap.yml文件中定义的应用名称,比如改成:ruoyi-house-m1
  2. nacos 上克隆一份原配置,修改名称,这里的情况就是改成 ruoyi-house-m1-dev.yml
  3. 修改 ruoyi-ui 下的 vue.config.js 的 proxy,将要开发模块的请求全部映射到本地,不走网关。这样别人访问不到自己的服务,不用担心调试的时候误入。但是自己可以访问其他模块,不影响自己的开发。参考配置如下:
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]: ''
    }
  }
}

4.新建模块

新增以com.ruoyi开头的模块

在 ruoyi-modules 上右键,new=》module,Parent 选择 ruoyi-modules,name 以 ruoyi-my 为例。如下图:

若依微服务版(ruoyi-cloud)使用记录_第2张图片 新建模块

接下来修改 ruoyi-my 的 pom 文件,直接复制 ruoyi-system 的 dependencies 节点和 build 节点。创建包结构,创建启动类(复制 system 模块的启动类修改名称),创建 bootstrap.yml(同样复制 system 模块,修改端口和服务名称)。如下图:

若依微服务版(ruoyi-cloud)使用记录_第3张图片 目录结构和bootstrap.yml

接下来登陆 nacos,克隆 ruoyi-system-dev.yml ,命名为 ruoyi-my-dev.yml,修改 mybatis.typeAliasesPackage,改为 com.ruoyi.my,发布。如下图:

若依微服务版(ruoyi-cloud)使用记录_第4张图片 nacos上的配置文件

然后修改 ruoyi-gateway-dev.yml,添加新增的模块,发布。如下图:

若依微服务版(ruoyi-cloud)使用记录_第5张图片 网关配置

关于上图中出现的 myService 的说明:myService 是和 api 中的 url 关联的。api如下:

// 查询测试用列表
export function listTest(query) {
  return request({
    url: '/myService/test/list',
    method: 'get',
    params: query
  })
}

启动新模块后就可以访问了。

新增不以 com.ruoyi 开头的模块

在“新增 com.ruoyi 开头的模块”的基础上做以下修改:以 com.mypkg.my 为例

  1. 修改 nacos 上对应配置文件,修改 mybatis.typeAliasesPackage 为 com.mypkg.my
  2. 新建 annotation 包,将 ruoyi-common 模块下 ruoyi-common-security子模块下的com.ruoyi.common.security.annotation.EnableCustomConfig.java 类复制过来,修改 @MapperScan 的值为 com.mypkg.**.mapper。接着将启动类上的 @EnableCustomConfig 注解改引用 annotation 包下的 EnableCustomConfig。如下图:
若依微服务版(ruoyi-cloud)使用记录_第6张图片 EnableCustomConfig 若依微服务版(ruoyi-cloud)使用记录_第7张图片 启动类

 启动项目即可。

5.将模块抽取为单独的项目

首先,运行 mvn install 命令,将 ruoyi 的包安装到本地仓库,因为之后会用到这些包。直接在 idea 里运行就可以。如下图:

若依微服务版(ruoyi-cloud)使用记录_第8张图片 install ruoyi 各模块

以“新增不以 com.ruoyi 开头的模块” 为例。先将 ruoyi-my 文件夹复制到一个新的目录,然后用 idea打开。然后修改 pom.xml 文件,修改 parent 节点,指向 ruoyi。如下:

若依微服务版(ruoyi-cloud)使用记录_第9张图片 修改pom的parent节点

运行启动类,结束。

如果是以“新增以 com.ruoyi开头的模块” 为基础,那么需要添加“新增不以 com.ruoyi 开头的模块”的第2步,迁移 EnableCustomConfig 类。

6.服务接口的定义和服务间调用

以“新增不以 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,这样别的模块引用的时候不会混乱。如下:

若依微服务版(ruoyi-cloud)使用记录_第10张图片 主pom和my-server的pom
// 主pom

    
        
            org.apache.maven.plugins
            maven-compiler-plugin
            
                ${java.version}
                ${java.version}
                ${project.build.sourceEncoding}
            
            ${maven-compiler-plugin.version}
        
    

 my-client 的创建参照 ruoyi-api 即可。有一点需要注意,新建的 fallbackFactory 接口要在 resource.META-INF.spring.factories 里注册,如下图:

若依微服务版(ruoyi-cloud)使用记录_第11张图片

 重复“新增不以 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 服务了。

7.部署运行

  • jar 包运行

打包后直接 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
  • Redis 只能 localhost 访问,本机 IP 访问报错 

报错内容:io.lettuce.core.RedisException: java.io.IOException: 远程主机强迫关闭了一个现有的连接。

参考redis本机能访问 远程不能访问的问题,解决办法:

  1. 给 Redis 添加密码
  2. 注释掉 bind 127.0.0.1
  • docker 运行 nacos

 开发环境下 nacos 使用单机版。配置参考了docker内搭建单机模式的nacos,但是原文章写的比较早,参数已经发生了变化,所以以下文为准(2020-08-02版)。建议直接参考官方的参数说明:nacos-docker

  1. 拉取镜像
    docker pull nacos/nacos-server

     

  2. 启动镜像
    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设置=》添加,若依微服务版(ruoyi-cloud)使用记录_第12张图片若依微服务版(ruoyi-cloud)使用记录_第13张图片

  • docker 运行 ruoyi 模块

运行网关模块,发现没有注册到nacos。运行命令: docker logs 容器id,发现报错: java.net.NoRouteToHostException: No route to host (Host unreachable)。解决办法:防火墙开放相应端口。

  • 开发环境 docker 部署注意事项

默认情况下,docker 内部网络和外部是隔离的。启动的时候讲宿主机的 8080 端口映射到 docker 内网关模块的 8080 端口,这样外部通过网关访问容器内的服务没有问题,内部服务间的调用也没有问题。但是我本地访问 docker 内部的服务的时候就访问不到了,因为 docker 内服务的 IP 都是172.*。我遇到的报错提示是:请求 auth 时超时。解决办法是修改docker的网络为 host,这样服务会共用宿主机的 IP ,访问就正常了。docker 的四种网络模式的区别可以参看:Docker四种网络模式。

你可能感兴趣的:(Web,若依,ruoyi-cloud)