若依微服務版(ruoyi-cloud)使用記錄

東方fan發表於2020-07-22

記錄一下使用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 右側的小三角就能啟動前端了,簡單省事。如下圖:

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-my 的 pom 檔案,直接複製 ruoyi-system 的 dependencies 節點和 build 節點。建立包結構,建立啟動類(複製 system 模組的啟動類修改名稱),建立 bootstrap.yml(同樣複製 system 模組,修改埠和服務名稱)。如下圖:

目錄結構和bootstrap.yml
目錄結構和bootstrap.yml

接下來登陸 nacos,克隆 ruoyi-system-dev.yml ,命名為 ruoyi-my-dev.yml,修改 mybatis.typeAliasesPackage,改為 com.ruoyi.my,釋出。如下圖:

nacos上的配置檔案
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.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。如下圖:
EnableCustomConfig
EnableCustomConfig
啟動類
啟動類

 啟動專案即可。

5.將模組抽取為單獨的專案

首先,執行 mvn install 命令,將 ruoyi 的包安裝到本地倉庫,因為之後會用到這些包。直接在 idea 裡執行就可以。如下圖:

install ruoyi 各模組
install ruoyi 各模組

以“新增不以 com.ruoyi 開頭的模組” 為例。先將 ruoyi-my 資料夾複製到一個新的目錄,然後用 idea開啟。然後修改 pom.xml 檔案,修改 parent 節點,指向 ruoyi。如下:

修改pom的parent節點
修改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,這樣別的模組引用的時候不會混亂。如下:

主pom和my-server的pom
主pom和my-server的pom
// 主pom
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>${java.version}</source>
                <target>${java.version}</target>
                <encoding>${project.build.sourceEncoding}</encoding>
            </configuration>
            <version>${maven-compiler-plugin.version}</version>
        </plugin>
    </plugins>
</build>

 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 的引用:

<dependency>
    <groupId>com.mypkg</groupId>
    <artifactId>my-client</artifactId>
    <version>1.0.0</version>
</dependency>

然後就可以呼叫 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設定=》新增,

  • 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四種網路模式

相關文章