При использовании микросервисов у вас часто возникают проблемы между службами. Spring Cloud обеспечивает подводные интерфейсные вызовы и Resttemplate вызовы.
Здесь я расскажу о методе Resttemplate Call:
Сервис A: Три параметра объекта, которые получают эти три параметра, запрошены через базу данных.
Сервис B: Чтобы позвонить в службу, службу B предоставляет метод для запроса трех параметров, а три параметра должны использоваться позже.
Для обслуживания A есть два способа справиться с этим
1. Сервис B предоставляет интерфейс Feign для раскрытия метода запроса трех параметров. Служба Прямой ссылки притворяется параметрам запроса. Сервис B должен пройти только три ключевых слова запроса в прошлом.
Обслуживание действия
@Postmapping ("/import/{busicode}/{filepath}") public map <string> importexcel (@pathvariable ("filepath") String filePath,@pathvariable ("busicode") string busicode,@requestbody map <string> params, httpservelquest recement) {httpsonsevsevonservonsevsevonser response.setcharacterencoding ("UTF-8"); UserInfo user = userUtil.getUser (); return excelservice.importexcel (filePath, busicode, params, user); } Обслуживание услуги
// Представьте интерфейс Feign Private Excelfign Excelferign; public Map <String, String> importExcel (String filePath, String busicode, Map <String, String> Params, userInfo user) {map <string, string> result = new Hashmap <String, String> (); ExcelfReign = Springtool.getApplicationContext (). GetBean (ExcelfReign.class); CmdimportConfigdto configdto = excreffreign.getCmdimportConfigbyBusicode (busicode); Cmdimportdto importdto = new cmdimportdto (); importdto.setimportConfigid (configdto.getid ()); ImportDto.setExcelpath (filePath); ImportDto.setParam (новый gsonbuilder (). Create (). Tojson (params)); importdto.setlog (""); Длинный импульс = null; try {impid = long.valueof (excelfreign.savecmdimportdto (importDto)); } catch (Exception e1) {e1.printstackTrace (); result.put («ошибка», «Исключение произошло во время сохранения»); result.put ("message", e1.getMessage ()); результат возврата; } try {ExcelfReign.UpdateImportStatus (IMPID, importConstant.importStatus.submit, «отправить успешно»); } catch (Exception e) {e.printstackTrace (); } ValidateTask validateTask = new ValidATeTask (); validateTask.init (иммень, filePath, busicode, params, пользователь); Строковое сообщение; try {message = validateTask.call (); } catch (Exception e) {e.printstackTrace (); result.put («ошибка», «Исключение произошло в проверке»); result.put ("message", e.getMessage ()); результат возврата; } if (message! = null) {result.put ("ошибка", "проверка не удалась"); result.put ("Сообщение", сообщение); результат возврата; } RepistTask repistTask = new PersistTask (); PersistTask.Init (иммень, FilePath, Busicode, Params, пользователь); result.putall (importqueue.submit (persisttask)); результат возврата; }B-fegin предоставлен Сервисом B
@Feignclient (value = "frame-service", path = "/excelapi/v1") публичный интерфейс Excelfign Excelapi {}Серва B API слой B-API
Публичный интерфейс Excelapi {/** * Состояние обновления * @param impid * @param importtype * @param result */@postmapping ("/updateImportStatus/{impid}/{importType}/{result}") void updateMportStatus (@PathVariable ("Impid") ImportType, @pathvairiable ("result") String Result) вызывает исключение; /** * Получить элементы конфигурации импорта * @param busicode * @return */@getmapping ("/getimportconfig/{busicode}") cmdimportconfigdto getcmdimportconfigbybusicode (@pathvariable ("busicode") string busicode); /** * Сохранить информацию * @param importdto * @return */@postmapping ("/saveimport") string savecmdimportdto (@requestbody cmdimportdto importdto); }Сервис B реализует действие интерфейса API
@RestController @RequestMapping ("/Excelapi/V1") открытый класс ExcelfEignAction реализует Excelapi {@Autowired Private CmdexportService ExportService; /** * Получить элементы конфигурации импорта * @param busicode * @return */@getmapping ("/getimportconfig/{busicode}") public cmdimportconfigdto getcmdimportconfigbybusicode (@pathvariable ("bousicode") string busicode) {return cmdimportConfigService.getCmdimportConfigbyBusicode (busicode); } /** * Update status* @param impId * @param importStatus * @param result */ @PostMapping("/updateImportStatus/{impId}/{importType}/{result}") public void updateImportStatus(@PathVariable("impId") Long impId, @PathVariable("importType") String importStatus, @Pathvariable ("result") String Result) Throws Exception {cmdimportservice.updateimportStatus (IMPID, ImportStatus, New Date (), Result); }/** * Сохранить информацию * @param importdto * @return */@postmapping ("/saveimport") public String savecmdimportdto (@requestbody cmdimportdto importdto) {try {cmdimportservice.savecmdimportdto (importDto); return importdto.getid (); } catch (Exception e) {e.printstackTrace (); бросить новый BusinessRuntImeexception («Системное исключение»); }}}Сервис B вызывает сервис уровня действий
/***** @param busicode Экспортируемое деловое кодирование может определить, что модуль может экспортировать его* @param значения Параметры** ПРОДОЛЖИТЬ КОМПЛЕКТЫ ПАРАМЕТРЫ через Resttemplate* Возвращение потока файла и позволить браузеру всплыть в загрузку*/@postmapping (value = "/export/v3/{busicode}") @Ressonse by public response <britetity <britetity <britetity <byttity <britetity <britetity <britetity <britetity <puretity </export/v3/{busicode} ») @Ressonsebody publictity. expdownloadv3 (@pathvariable ("busicode") String busicode, @requestbody map <string> values, values, httpservlectrequest) выбрасывает исключение {if (stringutils.isblank (busicode)) {бросает новый BusinessRuntimeexception ("parameters, пожалуйста, проверьте, являются ли параметры правильными, Busicode?" } // Получить карту процесса выполнения MAP = RESTTEMPLATE.POSTOROBJECT ("http: //" + serviceID + "/excelapi/v1/filename"/"+busicode, values, map.class); string path = (string) map.get (" filepath "); byte [] excel = fastdfsclient.downloby (" filePath "); Cmdexportconfigdto cmdexportconfig = exportservice.getcmdexportconfigbybusicode (busicode); Headers = New Httphaders (); FrameurlConstants.transfromFilename (пользовательский, файл) + ".2. Сервис B напрямую передает параметры запроса на обслуживание
Сервис A:
/** * Переход параметра получения * Получите следующие три пары значений ключей * cmdexportConfig: cmdexportConfigdto * ExportFieldList: List <cmdexportfieldConfigdto> * params: map * @param params * @param refess * @param * @return */@postmapping ("/voport/v2 exportity exptorty. Map <string, object> params, httpservletrequest, httpservletresponse response) {response.setcharacterencoding ("utf-8"); try {// Получить путь к файлу в ObjectMapper mapper = new ObjectMapper (); LinkedHashMap requestParmap = (linkedHashmap) params.get ("cmdexportConfig"); Cmdexportconfigdto cmdexportconfigdto = null; Список <CmdexportfieldConfigdto> exportfieldlist = null; if (requestParmap.size ()> 0) {cmdexportConfigdto = mapper.convertValue (requestParmap, cmdexportConfigdto.class); } Arraylist arraylist = (arraylist) params.get ("exportfieldlist"); if (arraylist.size ()> 0) {exportfieldlist = mapper.convertValue (arraylist, новый Typereference <cmdexportfieldConfigdto> () {}); } Значения карты = (map) params.get ("params"); String filePath = Excelservice.exportExcel (cmdexportConfigdto, ExportFieldList, Params, request.getServletContext (). GetRealPath ("/")); Map <string, string> map = new hashmap <string, string> (); map.put ("filepath", filepath); вернуть новую реакцию (map, httpstatus.ok); } catch (ioException e) {бросить новое runtimeexception ("Ошибка выходного файла"); }}Сервис B:
/**** @param busicode. Экспортированный бизнес -кодирование может определить, что определенный модуль выполняет операцию экспорта* @param значения параметров*** ПРОДОЛЖИТЬ КОМПЛЕКТЫ ПАРАМЕТРЫ через Resttemplate* Возврат поток файла и позвольте браузеру всплыть, чтобы загрузить его. В настоящее время необходимо решить проблему реагирования на байтовый поток на консоли браузера. Метод загрузки URL -адреса используется впоследствии*/@postmapping (value = "/export/v3/{busicode}", presectes = mediaType.text_plain_value) @ResponseBody public responseentity <byte []> expdownloadv3 (@pathvariable ("busicode") string busicode, @requestbody map, string> vallslegle grandervelevlegle, hquestservelevlev, hquestrible, hquestservelible, string> запрос) бросает исключение {string busicode = values.get ("busicode"). toString (); if (stringUtils.isblank (busicode)) {бросить новый бизнес -размер («Параметр неправильно, пожалуйста, проверьте, правильны ли параметры, busicode?»); } // Получить карту процесса выполнения MAP = ExcuTERESTTEMPLATE (busicode, values); String path = (string) map.get ("filePath"); byte [] excel = fastdfsclient.downloadtobytes (path); Cmdexportconfigdto cmdexportconfig = exportservice.getCmdexportConfigbyBusicode (busicode); // Получить имя файла string fileName = cmdexportConfig.getReportName (); // Получить имя суффикса файла string extfilename = path.substring (path.lastindexof ('.')+1); Httpheaders headers = new httphaders (); eragent = request.getheader ("пользовательский агент"); headers.setContentType (mediaType.application_octet_stream); Headers.SetContentDispositionFormData («Приложение», FrameurlConstants.TransFromFilEname (пользовательский, файл) + "." + extfilename); вернуть новую реакцию <byte []> (Excel, заголовки, httpstatus.ok); } / ** * Выполнить запрос Call * @param busicode * @param переменные * @return * / private map ressustresttemplate (string busicode, map переменные) {String serviceId = ""; // Запрос конфигурации экспорта cmdexportconfigdto cmdexportconfig = exportservice.getcmdexportconfigbybusicode (busicode); serviceId = cmdexportConfig.getSysteMtype (); if (cmdexportconfig == null) {бросить новый бизнес -размер («Невозможно экспортировать без конфигурации экспорта»); } // Получить информацию об экспорте поля на основе списка идентификационных идентификаторов конфигурации экспорта if (stringUtils.isblank (serviceId)) {бросить новый бизнес -размер ("экспортируемая служба не настроена"); } Map <string, object> urivariables = new hashmap <> (); urivariables.put ("cmdexportconfig", cmdexportconfig); urivariables.put ("ExportfieldList", ExportfieldList); urivariables.put ("params", переменные); return resttemplate.postforObject ("http: //" + serviceId + "/excelservice/export/v2", new httpentity (urivariables), map.class); }Настройка заголовка браузера
/ ** * Установите URL -кодирование файла загрузки в соответствии с различными типами браузеров * @param useragent * @param filename * @return * @Throws Exception */ public Static String TransFromFilENAME (String userAgent, String FileName) THRES Exception {String finalfilEname = ""; "; if (stringUtils.contains (userAgent, "msie")) {// IE Browser finalfilename = urlencoder.encode (имя файла, "UTF-8"); } else if (stringUtils.contains (userAgent, "mozilla")) {// Google, firefox finalfilename = new String (fileName.getBytes ("gbk"), "iso8859-1"); } else {finalfilename = urlencoder.encode (filename, "utf-8"); // другие браузеры} return finalfilename; }Суммировать
Выше приведено метод Spring Cloud Resttemplate (несколько объектов), введенный вам редактором. Я надеюсь, что это будет полезно для вас. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит вам вовремя. Большое спасибо за вашу поддержку сайту wulin.com!