實踐案例包括兩個項目,服務提供者項目名:upload-service,調用服務項目名:upload-client,主要給出兩個服務之間的調用過程,文件上傳功能不提供
項目框架:spring-boot 2.0.1.RELEASE、spring-cloud Finchley.RELEASE
依賴:
<dependency> <groupId>io.github.openfeign.form</groupId> <artifactId>feign-form</artifactId> <version>3.0.3</version> </dependency> <dependency> <groupId>io.github.openfeign.form</groupId> <artifactId>feign-form-spring</artifactId> <version>3.0.3</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.3</version> </dependency>
創建FeignClient接口(用于指定遠程調用的服務)
// 申明這是一個Feign客戶端,并且指明服務id@FeignClient(value = "com-spring-caclulate") public interface CacluFeignClient { // 這里定義了類似于SpringMVC用法的方法,就可以進行RESTful的調用了 @RequestMapping(value = "/caclu/{num}", method = RequestMethod.GET) public Item caclulate(@PathVariable("num") Integer num);}
一.文件上傳服務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 FtpApiResponse<FtpUploadResDTO> uploadFileFTP(@RequestPart(value = "file") MultipartFile file, @RequestParam("logId") String logId) { FtpApiResponse<FtpUploadResDTO> 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@Slf4jpublic 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); } }}
新聞熱點
疑難解答