SpringCloud開發中多臺公網ip服務器,Eureka、provider、Ribbon遇到的坑記錄

SpringCloud開發中多臺公網ip服務器,Eureka、provider、Ribbon遇到的坑記錄

  1. springcloud多模塊項目,每個項目執行maven package後生成的jar包大小很小,並不是可執行的jar包。
  • 解決方案(修改pom依賴文件):
  1. spring-boot-maven-plugin的版本使用與當前springgboot相符合的
  2. 下面的<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>
  1. 共用的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>
  1. 引用到公共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包需要執行以下幾步驟
  1. 對api模塊執行 mvn clean -> mvn install(注意一定要記得每次都install,因爲我之前有次忘記install結果用的舊的api的po類,打包沒問題,但是運行項目mybatis提示mapper裏面的屬性卻好啊setter之類的。因爲用的不是最新的po類!!)

  2. provider的pom依賴中打包插件spring-boot-maven-plugin裏配置mainClass等屬性(前面提過了)。

  3. provider模塊執行 mvn clean -> mvn package就可以生成而執行jar包了

  4. 項目佈置在幾臺不同公網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: #這個自己根據實際情況配置了

  1. 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章