Contents

尋找 spring boot 使用 sftp 方案

當時在找 Spring Boot 接 SFTP 的方案,本來以為直接找一個簡單 client 呼叫就好,結果真的查下去會發現至少有兩條路:一條是直接用底層 SFTP 函式庫,另一條是走 Spring Integration。這篇先把我整理過的思路補完整,之後再回頭看會比較知道當初為什麼選某套方案。

先看需求再選方案

如果只是偶爾上傳一個檔案,其實不用把事情搞太大;但如果你需要排程拉檔、失敗重試、輪詢遠端資料夾、檔案搬移後處理,那 Spring Integration 會比自己硬寫流程穩很多。

我自己會先這樣分:

  1. 單純上傳下載檔案:可以考慮簡單 client。
  2. 需要整合 Spring Flow:Spring Integration 比較適合。
  3. 需要排程、監控、訊息流:Spring Integration 優勢更明顯。

為什麼很多人會選 Spring Integration

Spring Integration SFTP 比較像是在搭資料流,不只是「連上去傳檔」而已。它適合的地方在於:

  1. 可以把 inbound、outbound 流程拆清楚。
  2. 容易接排程、channel、filter。
  3. 對 Spring 專案整體一致性比較好。

缺點就是心智負擔比較高。如果專案只要做一個很單純的上傳 API,第一次看會覺得有點重。

基本設定方向

如果走 Spring Integration,大致上會有幾個核心設定:

  1. SFTP session factory。
  2. 遠端目錄設定。
  3. 上傳或下載的 flow。
  4. 錯誤處理與重試策略。

概念上大概像這樣:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
@Bean
public DefaultSftpSessionFactory sftpSessionFactory() {
	DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true);
	factory.setHost("example.com");
	factory.setPort(22);
	factory.setUser("username");
	factory.setPassword("password");
	factory.setAllowUnknownKeys(false);
	return factory;
}

實際專案通常還會把帳密、路徑改成設定檔,不會硬寫在程式裡。

我會特別注意的地方

  1. 金鑰驗證還是密碼登入。
  2. 遠端目錄是否需要自動建立。
  3. 同名檔案覆蓋策略。
  4. 下載後要不要搬移、刪除或改名。
  5. 網路不穩時是否要 retry。

很多專案一開始只測通 happy path,結果上正式環境才發現檔案重送、檔名衝突、半傳輸狀態都沒處理。

如果不想用太重

如果你只是需要一個 service method:upload(file)download(fileName),其實直接用底層 SFTP 函式庫也不是不行。只是後續一旦需求開始變成排程同步、多資料夾處理、批次錯誤控管,通常就會慢慢長成一套自己的 integration flow。

所以我現在比較傾向:

  1. 短平快需求先求能用。
  2. 有長期維護需求就早點走 Spring Integration。

參考資料

SFTP第三篇——Spring-Integration-Sftp实现 - 代码先锋网
Spring Integration sftp 技术专栏_小花荣的博客-CSDN博客
Spring Integration in Action學習筆記(1) | by Z-xuan Hong | Medium
Spring Integration简介 | TONY’S TOY BLOG
9.1 声明一个简单的集成流 | 蓝蓝站点
Spring企业集成流 Spring Integration - 錵開や落幕 - 博客园
分布式锁神器:springboot 2.X+Redis整合 Spring Integration实现分布式锁 | 航行学园
Spring Integration实现分布式锁_caofeng2012的技术博客_51CTO博客