摘要:實踐案例包括兩個項目,服務提供者項目名,調用服務項目名,主要給出兩個服務之間的調用過程,文件上傳功能不提供項目框架依賴一文件上傳服務控制層文件上傳控制文件上傳文件上傳開始文件上傳結束,耗時文件上傳失敗業務層上傳文件判
實踐案例包括兩個項目,服務提供者項目名:upload-service,調用服務項目名:upload-client,主要給出兩個服務之間的調用過程,文件上傳功能不提供
項目框架:spring-boot 2.0.1.RELEASE、spring-cloud Finchley.RELEASE
依賴:
io.github.openfeign.form feign-form 3.0.3 io.github.openfeign.form feign-form-spring 3.0.3 commons-fileupload commons-fileupload 1.3.3
一.文件上傳服務upload-service
1.控制層
@Slf4j @CrossOrigin @RestController @RequestMapping("/ftp") @Api(description = "文件上傳控制") public class FtpFileController { @Autowired private FtpFileService ftpFileService; /** * FTP文件上傳 * * @return */ @PostMapping(value = "/uploadFile", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public FtpApiResponseuploadFileFTP(@RequestPart(value = "file") MultipartFile file, @RequestParam("logId") String logId) { FtpApiResponse result = new FtpApiResponse<>(); LogUtil.updateLogId(logId); try { log.info("文件上傳開始!}"); Long startTime = System.currentTimeMillis(); FtpUploadResDTO resDTO = ftpFileService.uploadFile(file); result.setData(resDTO); result.setSuccess(true); result.setTimeInMillis(System.currentTimeMillis() - startTime); log.info("文件上傳結束 resDTO:{},耗時:{}", resDTO, (System.currentTimeMillis() - startTime)); } catch (ServiceException e){ result.setSuccess(false); result.setErrorCode(ErrorMsgEnum.FILE_UPLOAD_EXCEPTION.getCode()); result.setErrorMsg(ErrorMsgEnum.FILE_UPLOAD_EXCEPTION.getMsg()); } catch (Exception e) { result.setSuccess(false); result.setErrorCode(ErrorMsgEnum.SYSTEM_ERROR.getCode()); result.setErrorMsg(ErrorMsgEnum.SYSTEM_ERROR.getMsg()); log.info("文件上傳失敗 Exception:{}", Throwables.getStackTraceAsString(e)); } return result; } }
2.業務層
@Service @Slf4j public class FtpFileService { @Autowired private FtpFileManager ftpFileManager; /** * 上傳文件 * * @param file * @return */ public FtpUploadResDTO uploadFile(MultipartFile file) { try { //判斷上傳文件是否為空 if (null == file || file.isEmpty() || file.getSize() == 0) { log.info("傳入的文件為空,file:{}", file); throw new ServiceException(ErrorMsgEnum.EMPTY_FILE); } //文件上傳至ftp服務目錄 FtpFileRecordDO ftpFileRecordDO = ftpFileManager.fileUploadToFtp(file); if (null == ftpFileRecordDO) { log.info("文件上傳至ftp服務目錄異常"); throw new ServiceException(ErrorMsgEnum.FILE_UPLOAD_TO_FTP_EXCEPTION); } return ftpFileManager.addFileRecord(ftpFileRecordDO); } catch (Exception e) { log.error("業務異常,case", e); throw new ServiceException(ErrorMsgEnum.SYSTEM_ERROR); } } }
3.服務寫好后,需要把遠程接口暴露出去
@FeignClient(value = "upload-service", configuration = UpDownFtpFacade.MultipartSupportConfig.class) public interface UpDownFtpFacade { /** * FTP上傳文件 * * @param file 文件 * @param logId 日志id * @return */ @PostMapping(value = "/ftp/uploadFile",consumes = MediaType.MULTIPART_FORM_DATA_VALUE) FtpApiResponseuploadFileFTP(@RequestPart(value = "file") MultipartFile file, @RequestParam("logId") String logId); /** * 引用配置類MultipartSupportConfig.并且實例化 */ @Configuration class MultipartSupportConfig { @Bean public Encoder feignFormEncoder() { return new SpringFormEncoder(); } } }
二.文件上傳客戶端upload-client
@Slf4j @Component public class FileManager { @Autowired private UpDownFtpFacade upDownFtpFacade; /** * 調用遠程上傳文件接口 * * @param file 待上傳的文件 * @return 下載路徑 **/ public FtpApiResponserequestFtpFacade(MultipartFile file) { try { DiskFileItem fileItem = (DiskFileItem) new DiskFileItemFactory().createItem("file", MediaType.ALL_VALUE, true, file.getOriginalFilename()); InputStream input = file.getInputStream(); OutputStream os = fileItem.getOutputStream(); IOUtils.copy(input, os); MultipartFile multi = new CommonsMultipartFile(fileItem); FtpApiResponse response = upDownFtpFacade.uploadFileFTP(multi, LogUtil.getLogId()); if (null == response || !response.getSuccess() || null == response.getData()) { throw new ManagerException(ErrorMsgEnum.FIlE_UPLOAD_FAILED); } return response; } catch (Exception e) { throw new ManagerException(ErrorMsgEnum.FIlE_UPLOAD_FAILED); } } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/76950.html
摘要:添加電影微服務啟動類電影微服務接入進行客戶端負載均衡,通過調用遠程微服務。注解表示該電影微服務已經接入模塊。 SpringCloud(第 012 篇)電影微服務接入 Feign 進行客戶端負載均衡,通過 FeignClient 調用遠程 Http 微服務 - 一、大致介紹 1、本章節主要介紹在 SpringCloud 生態圈中,使用一個類似于 Java HTTP 客戶端的工具 Feig...
摘要:公眾號樂園的中提供了兩個組件實現軟負載均衡調用,分別是和。是基于和的客戶端負載工具,它是基于實現的,它可以在客戶端配置服務端列表,然后輪詢請求以實現均衡負載。 公眾號:java樂園 spring cloud的Netflix中提供了兩個組件實現軟負載均衡調用,分別是Ribbon和Feign。上一篇和大家一起學習了Ribbon。Ribbon :Spring Cloud Ribbon是基于H...
摘要:我沒有能力去控制那些自媒體發布這些不實的內容,但是在我了解的范圍內,還是盡力輸出一些我的理解。 之前我發過一篇《說說我為什么看好Spring Cloud Alibaba》,然后這兩天有網友給我轉了這篇文章《坑爹項目spring-cloud-alibaba,我們也來一個》,問我的看法是怎么樣的,聊天時候簡單說了一下。今天在家休息,抽空整理一下內容,逐點說一下我的看法,主要還是覺得這篇文章...
摘要:使用做服務器時,經常會通過調用遠程服務。有時候我們的遠程服務可能做了某些權限驗證。如果某沒有,可能會被阻止調用。如果每個方法都手動設置,那未免太麻煩。可以通過一個切面,自動幫我們添加請求。 使用spring cloud 做saas服務器時,經常會通過Feign調用遠程服務。有時候我們的遠程服務可能做了某些權限驗證。需要驗證header或者token什么的。如果某沒有token,可能會被...
閱讀 1561·2021-11-19 09:55
閱讀 2782·2021-09-06 15:02
閱讀 3549·2019-08-30 15:53
閱讀 1092·2019-08-29 16:36
閱讀 1239·2019-08-29 16:29
閱讀 2290·2019-08-29 15:21
閱讀 627·2019-08-29 13:45
閱讀 2685·2019-08-26 17:15