SpringCloud開發中多臺公網ip服務器,Eureka、provider、Ribbon遇到的坑記錄
- springcloud多模塊項目,每個項目執行maven package後生成的jar包大小很小,並不是可執行的jar包。
- 解決方案(修改pom依賴文件):
- spring-boot-maven-plugin的版本使用與當前springgboot相符合的
- 下面的
<configuration>
裏面的mainClass
修改值爲自己服務啓動類的全限制類名
<!-- 修改原本的build字段 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${springboot.version}</version>
<configuration>
<!-- 指定該Main Class爲全局的唯一入口 -->
<mainClass>com.ash.springcloud.TestApplication</mainClass>
<layout>ZIP</layout>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal><!--可以把依賴的包都打包到生成的Jar包中-->
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
- 共用的api模塊,比如存放pojo、工具類utils,如果用Feign可能還存放service接口等。這個打包不需要生成可執行文件,但是記得,別的module模塊要是使用到其po類等,需要在pom依賴文件中聲明
<!-- api,示例如下,根據自己實際的api模塊修改對應的3個值 -->
<dependency>
<groupId>com.ash.springcloud</groupId>
<artifactId>http-api-n0-0000</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
- 引用到公共api模塊的項目,除了在pom聲明外,如果該項目mvn package成執行jar包,找不到po類之類的,那就是之前沒有對api模塊執行mvn clean -> mvn install。install才能把之前的公共api模塊存到本地maven倉庫,這時候別的模塊的pom對api模塊依賴纔算真正起到作用(指可執行jar包可以使用到公共的po類)
- api模塊不需要打成可執行jar包,所以不需要在自帶的
spring-boot-maven-plugin
裏配置mainClass
等
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
- 假如provider用到了api模塊的po類,那麼要生成provider的可執行jar包需要執行以下幾步驟
-
對api模塊執行 mvn clean -> mvn install(注意一定要記得每次都install,因爲我之前有次忘記install結果用的舊的api的po類,打包沒問題,但是運行項目mybatis提示mapper裏面的屬性卻好啊setter之類的。因爲用的不是最新的po類!!)
-
provider的pom依賴中打包插件
spring-boot-maven-plugin
裏配置mainClass
等屬性(前面提過了)。 -
provider模塊執行 mvn clean -> mvn package就可以生成而執行jar包了
-
項目佈置在幾臺不同公網IP的服務器,每個Eureka互相註冊,需要用到真實ip。
# 服務啓動項
server:
port: 7001
#spring配置
spring:
profiles: dev
application:
name: http-eureka-dev-n1-7001
# security: # 使得Eureka需要賬號密碼才能訪問 ,沒有用到 security依賴就不用。之前文章應該有提過這個配置了
# user:
# name: test
# password: 123456
# roles: SUPERUSER
#eureka配置
eureka:
server:
enable-self-preservation: false
instance:
hostname: http-eureka-n1-7001
appname: http-eureka-7001
instance-id: n1-XXX.YYY.ZZZ.NNN
prefer-ip-address: true # 使用真實的ip註冊
ip-address: XXX.YYY.ZZZ.NNN # 真實的公網ip
client:
service-url:
#單機 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
#設置與Eureka Server交互的地址查詢服務和註冊服務都需要依賴這個地址(單機)。
defaultZone: #這個自己根據實際情況配置了
- Provider註冊到Eureka後,Ribbon根據服務名訪問不到
- 可能是沒有設置
spring.application.name
屬性,Ribbon負載均衡要用到的serviceId就是這個。 - 因爲是不同公網IP服務器,加上如果用到docker之類的,Eureka會識別成本地局域網網橋的ip地址,需要自己手動配置
# 服務啓動項
server:
port: 8081
# spring配置
spring:
profiles: prod
application:
name: http-provider-n1 # Ribbon負載均衡要用到的serviceId就是這個
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver # 用的mysql 8
url: jdbc:mysql://服務器IP:3306/表名?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8&useSSL=false
username: 數據庫賬號
password: 數據庫密碼
#mybatis配置
mybatis:
type-aliases-package: com.ash.springcloud.po
config-location: classpath:mybatis/mybatis-config.xml
mapper-locations: classpath:mybatis/mapper/*.xml
#eureka配置
eureka:
instance:
appname: http-provider-n1
instance-id: n1-XXX.YYY.ZZZ.NNN
prefer-ip-address: true
ip-address: 你的服務器公網ip # 服務提供者通過我們自己指定的ip註冊到Eureka
non-secure-port: 你的服務用到的端口port # 服務提供者通過我們自己指定的port註冊到Eureka
client:
service-url:
defaultZone: # 這個根據你自己的實際配置
#info配置
info: #點擊Eureka的頁面的服務的Status進入的頁面顯示的信息
app.name: provider
author: ash