現在分布式運用越來越多了,通過feign傳輸資料,但上傳檔案的時候就會遇到問題,因為springcolud的feign本身就不支持上傳檔案,
所以需要額外的匯入先關jar。


首先
因為最詳細的,所以每個都盡量的注釋。不要嫌太OUT,新人也是人。也的為他們考慮1 創建parent專案
1.1創建parent專案
創建parent分布式專案:專案名字Dandy_parent 切記<packaging>pom</packaging>

1.2 添加springboot和springcloud依賴

2 在Dandy_parent專案下創建Eureka專案Dandy_parent_Eureka
2.1 APP 所在包為dandy.eureka

2.2相關依賴:

2.3 application.yml:
###eureka 服務埠號
server:
port: 8200
##服務器名稱 單個注冊中心 則不需要 集群 需要
spring:
application:
name: Eureka
###服務注冊中心ip
eureka:
instance:
hostname: 127.0.0.1
##這是注冊到別人的ip地址中 并不是提供注冊地址!!!
##下面ip地址是自己的。所以注冊到自己中。只是地址 還沒確定是否注冊。因為下面有控制 是否注冊顯示在eureka上
client:
# serviceUrl: 等價于 service-url:
serviceUrl:
#http://${服務注冊名稱}:${服務埠號}/eureka/,多臺用,分開。
#即http://${服務注冊名稱}:${服務埠號}/eureka/,http://${服務注冊名稱}:${服務埠號}/eureka/
defaultZone: http://${eureka.instance.hostname}:8200/eureka/
### 集群會把自己注冊自己提供給別人用,所以當你是單個注冊中心的時候如果true,則啟動的時候他就會把自己注冊ip里面,可是自己都還沒啟動完成,怎么能注冊到自己里面,所以會報錯
### 是否注冊 當前服務,因為是控制中心 所以沒必要注冊自己
register-with-eureka: false
### 因為是控制中心 所以沒必要自檢
fetch-registry: false
3 在Dandy_parent專案下創建服務提供者 Provider專案名 :Dandy_parent_Provider
3.1 app 所在包為dandy.provider

3.2相關依賴:

3.3 application.yml:
server:
port: 8082
spring:
application:
name: Provider
eureka:
client:
# service-url=serviceUrl 這2個是一樣的
service-url:
defaultZone: http://localhost:8200/eureka
###注冊自己的服務到eureka上
register-with-eureka: true
###是否需要從eureka上獲取注冊資訊
fetch-registry: true
##定義在Eurka網頁上的status顯示ip地址。
instance:
prefer-ip-address: true
instance-id: ${spring.application.name}:${server.port}
4 在Dandy_parent專案下創建Feign專案名 :Dandy_parent_api
4.1 fegin介面為 所在包為dandy.api

4.2 重要 上傳MultipartFile檔案的組態檔
@Configuration
public class FeignMultipartSupportConfig {
@Configuration
public class FeignMultipartSupportConfig {
@Autowired
private ObjectFactory<HttpMessageConverters> messageConverters;
@Bean
@Primary
@Scope("prototype")
public Encoder multipartFormEncoder() {
//此處為了證明Fegin的掃描可以掃描到@Configuration
System.out.println("============@Configuration==========");
return new SpringFormEncoder(new SpringEncoder(messageConverters));
}
@Bean
public feign.Logger.Level multipartLoggerLevel() {
return feign.Logger.Level.FULL;
}
}
@Bean
public feign.Logger.Level multipartLoggerLevel() {
return feign.Logger.Level.FULL;
}
}
4.3相關依賴:

5 在Dandy_parent專案下創建 消費者Consumer專案名 :Dandy_parent_Consumer
5.1 Consumer消費者app 所在包為dandy.consumer

5.2相關依賴:

5.3 application.yml:
server:
port: 8083
spring:
application:
name: Consumer
eureka:
client:
service-url:
defaultZone: http://localhost:8200/eureka
###注冊自己的服務到eureka上
register-with-eureka: true
###是否需要從eureka上獲取注冊資訊
fetch-registry: true
instance:
prefer-ip-address: true
instance-id: ${spring.application.name}:${server.port}
這樣就搞定了
注意:本貼 未實作上傳 具體上傳自己搞定
還有關于有人@我 問我怎么把物體類和MultipartFile 分開同時上傳,答案是不可以的 目前以我所知,
只能把MultipartFile 放入物體類中,如User中 ,Feign介面的引數 用@RequestBody
public String saveHeadImg(@RequestBody User user);實作帶著MultipartFile 一起傳
為什么不能public String saveHeadImg(@RequestBody User user,@RequestPart("headImg") MultipartFile headImg);
答:其實很好理解 一個請求只有一個請求體,@RequestBody 就只能有1個 只支持POST,可以有多個@RequestParam
相當于get方法后面 添加引數 所以大概總結下:在一個方法中
1 @RequestBody 有且只能有1個,@RequestParam可以多個
2 @RequestBody 和@RequestPart 只能存在一個 ,這也是為什么不能分開同時上傳物件和MultipartFile
3 @RequestBody 傳物件
@RequestPart 傳MultipartFile 當然不絕對,比如當傳String型別的時候 @RequestPart 也能傳。
@RequestParam 傳引數如:int string
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/100503.html
標籤:Web 開發
上一篇:Java有點懵,求鐵友指點一下。
下一篇:C語言陣列
