Ao usar microsserviços, você geralmente tem problemas para chamar entre serviços. Spring Cloud fornece chamadas de interface feigadas e chamadas Resttemplate.
Aqui vou discutir o método de chamada Resttemplate:
Serviço A: Os três parâmetros de objeto que recebem esses três parâmetros são consultados através do banco de dados.
Serviço B: para chamar o Serviço A Serviço B fornece um método para consultar três parâmetros e três parâmetros devem ser usados posteriormente.
Para o Serviço A, há duas maneiras de lidar com isso
1. O Serviço B fornece uma interface FEIGN para divulgar o método de consultar três parâmetros. Serviço A referencia diretamente os parâmetros de consulta. O Serviço B só precisa passar as três palavras -chave de consulta no passado.
Serviço de uma ação
@PostMapping ("/import/{Busicode}/{filepath}") public map <string, string> importExcel (@PathVariable ("filepath") string filepath,@pathVariable ("Busicode") String Busicode,@requestbody <string> params, HEATSTTRETRECESTENTELTENTEMENTO) Response.Setcharacterencoding ("UTF-8"); UserInfo user = userutil.getUser (); return ExcelService.importExcel (filepath, Busicode, Params, Usuário); } Serviço de um serviço
// Introduce a interface Feign private ExcelfReign ExcelfReign; mapa public <string, string> importExcel (string filepath, string busicode, map <string, string> params, userInfo user) {map <string, string> resultado = new hashmap <string, string> (); ExcelfReign = springtool.getApplicationContext (). getBean (excelfReign.class); CmdimportConfigdto configdto = excelfReign.getcmdimportConfigByBusicode (Busicode); CmdimportDTO Importdto = new CMDIMPORDDTO (); importdto.setImportConfigId (configdto.getId ()); Importdto.setexcelpath (filepath); Importdto.setParam (new GsonBuilder (). Create (). Tojson (Params)); Importdto.setLog (""); Comprimento longo = nulo; tente {impid = long.valueof (excelfReign.SavecMdimportDto (importDto)); } catch (Exceção E1) {e1.printStackTrace (); resultado.put ("erro", "exceção ocorreu ao salvar"); resultado.put ("message", e1.getMessage ()); resultado de retorno; } tente {excelfReign.UpDateImportStatus (impid, importConstant.importStatus.submit, "submeter bem -sucedido"); } catch (Exceção e) {e.printStackTrace (); } ValidateTask validateTask = new ValidAtetask (); validateTask.init (Impid, FilePath, Busicode, Params, Usuário); Mensagem de string; tente {message = validateTask.call (); } catch (Exceção e) {e.printStackTrace (); resultado.put ("erro", "exceção ocorreu na verificação"); resultado.put ("message", e.getMessage ()); resultado de retorno; } if (message! = null) {resultado.put ("erro", "falha na verificação"); resultado.put ("mensagem", mensagem); resultado de retorno; } Persisttask persisttask = new persisttask (); persisttask.init (Impid, FilePath, Busicode, Params, Usuário); resultado.putall (importQueue.submit (persisttask)); resultado de retorno; }B-Fegin fornecido pelo Serviço B
@FeignClient (Value = "Service Frame", Path = "/Excelapi/V1") Interface pública ExcelfReign estende Excelapi {}Servindo B Camada API B-API
interface pública Excelapi {/** * Atualizar status * @param Impid * @param importType * @param resultado */@PostMapping ("/UpdateImportStatus/{impID}/{importType}/{resultado}") void updateImportStatus (@PathVariable ("impid") longmp) @PathVariable ("resultado") Resultado da string) lança exceção; /** * Obtenha itens de configuração de importação * @param Busicode * @return */@getMapping ("/getImportConfig/{Busicode}") cmdimportConfigdto getCmdimportConfigByBusicode (@PathVariable ("Busicode") String Busicode); /** * Salvar informações * @param importdto * @return */@postMapping ("/saveImport") string SaveCMDIMPORDDTO (@RequestBody cmdimportdto importdto); }Serviço B implementa a ação da interface da API
@RestController @RequestMapping ("/Excelapi/v1") Classe pública ExcelFeignaction implementa Excelapi {@Autowired Private CMDexportService ExportService; /** * Obtenha itens de configuração de importação * @param Busicode * @return */@getMapping ("/getImportConfig/{Busicode}") public cmdimportConfigdto getCmdimportConfigByBusicode (@PathVariable ("Busicode") String Busicode) {Return cmdimportConfigService.getcmdimportConfigbyBusicode (Busicode); }/** * status de atualização * @param impid * @param importStatus * @param resultado */@PostMapping ("/updateImportStatus/{impid}/{importType}/{result}") public void updateImportStatus (@PathVariable ("Impid") Long }gium,) @PathVariable ("resultado") String Result) lança Exceção {cmdimportService.UpDateImportStatus (impid, importStatus, new Date (), resultado); }/** * Salvar informações * @param importdto * @return */@PostMapping ("/saveImport") public String SaveCMDImportDto (@Requestbody cmdimportdto importdto) {try {cmdimportService.SaVecmDimportDTO (importação); return importdto.getId (); } catch (Exceção e) {e.printStackTrace (); lançar novos negócios RuntimeException ("Exceção do sistema"); }}}O Serviço B chama o serviço de camada de ação
/****** @param Busicode A codificação de negócios exportados pode determinar que um módulo pode exportá -lo* @param valores Solicitar parâmetros** Passar parâmetros complexos através de Resttemplate* Retornar o fluxo de arquivos e deixar o navegador aparecer para baixar*/@PostMapp ("/"/export/v3/{Busicode) @ @ Expdownloadv3 (@PathVariable ("Busicode") String Busicode, @RequestBody Map <String, Object> valores, httpServletRequest Request) lança a exceção {if (stringutils.isblank (Busicode)) {tiro o novo BusinessRuntime ("Parâmetro está incorreto, verifique se os parâmetros são corretos, BusicEs," parâmetros), "parâmetros)" Busicode) {tiro BusinessException ("Parâmetro está incorreto, verifique se os parâmetros são corretos," parâmetros), "parâmetros)", por favor; } // Obtenha o mapa do processo de execução Map = RestTemplate.PostForObject ("http: //" + serviceId + "/excelapi/v1/filename"/"+busicode.values.map.class); string path = (string) map.get (" filepath "); CMDEXPORTCONFIGDTO CMDEXPORTCONFIG = exportagem.getcmdexportConfigbybusicode (Busicode); = novo httpheaders (); FrameurlConstants.transfromfilename (userAgent, nome do arquivo) + ".2. O Serviço B passa diretamente os parâmetros de consulta para atender a um
Serviço A:
/** * Receba o parâmetro Passagem * Receba os seguintes três pares de valores -chave * cmdexportConfig: cmdexportConfigdto * exportfieldList: list <cmdexportFieldConfigdto> * params: map * @param params * @param request * @param resposta * @return */@PospApping ("exportam/exports * v2/v2) @param stick * @param * params, httpServletReQuest Solicy, httpServletResponse Response) {Response.SetcharAcTerEncoding ("UTF-8"); tente {// obtenha o caminho do arquivo para objectMapper mapper = new objectMapper (); LinkedHashMap RequestParmap = (LinkedHashMap) Params.get ("CMDexportConfig"); CmdexportConfigdto cmdexportConfigdto = null; Lista <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, new TypeReference <cmdexportFieldConfigdto> () {}); } Valores de mapa = (map) params.get ("params"); String filepath = ExcelService.ExportExcel (CMDexportConfigdto, ExportFieldList, params, request.getServletContext (). GetRealPath ("/")); Mapa <string, string> map = new hashmap <string, string> (); map.put ("filepath", filepath); retornar nova resposta de resposta (mapa, httpstatus.ok); } catch (ioexception e) {lança nova runtimeException ("erro de arquivo de saída"); }}Serviço B:
/**** @param Busicode A codificação de negócios exportada pode determinar que um determinado módulo faz a operação de exportação* @param valores Solicitar parâmetros** Passe os parâmetros complexos através do Resttemplate* Retorne o fluxo de arquivos e deixe o navegador aparecer para fazer o download. Atualmente, é necessário resolver o problema de responder ao fluxo de bytes ao console do navegador. O método de download de URL é usado posteriormente*/@PostMapping (value = "/export/v3/{Busicode}", produz = mediatype.text_plain_value) @Responsebod Exceção {String Busicode = valores.get ("Busicode"). ToString (); if (stringUtils.isblank (Busicode)) {Throw New BusinessRuntimeException ("Parâmetro incorreto, verifique se os parâmetros estão corretos, Busicode?"); } // Obtenha o mapa do processo de execução Map = ExcuterestTemplate (Busicode, valores); String caminho = (string) map.get ("filepath"); byte [] excel = fastdfsclient.DownloadToBytes (caminho); CmdexportConfigdto cmdexportConfig = exportService.getCMDexportConfigByBusicode (Busicode); // obtenha o nome do arquivo string filename = cmdexportConfig.getReportName (); // Obtenha o nome do sufixo do arquivo string extfilename = path.substring (path.lastindexof ('.')+1); Httpheaders headers = new httpheaders (); eragent = request.getheader ("user-agent"); headers.setContentType (mediatype.application_octet_stream); headers.setContentDisPoitionFormData ("anexo", ardurlConstants.transfromfilename (userAgent, nome do arquivo) + "." + extfilename); Retornar nova resposta de resposta <byte []> (Excel, cabeçalhos, httpstatus.ok); } / ** * Execute a chamada de solicitação * @param busicode * @param variáveis * @return * / mapa privado exaustaustrestTemplate (string busicode, variáveis de mapa) {string serviceId = ""; // consulta Exportar Configuração cmdexportConfigdto cmdexportConfig = exportService.getcmdexportConfigByBusicode (Busicode); ServiceId = cmdexportConfig.getSystemType (); if (cmdexportConfig == NULL) {Throw New BusinessRuntimeException ("Incapaz de exportar sem exportação de configuração"); } // Obtenha as informações do campo de exportação com base na lista de identificação de configuração de exportação <CmDexportFieldConfigdto> ExportFieldList = exportService.GetAllCMDexportFieldConfigDtobyConfigid (cmdexportConfig.getId ()); if (stringutils.isblank (serviceId)) {throw new BusinessRuntimeException ("Serviço exportado não configurado"); } Mapa <string, objeto> urivariáveis = new hashmap <> (); urivariables.put ("cmdexportConfig", cmdexportConfig); urivariables.put ("exportfieldlist", exportfieldlist); urivariables.put ("params", variáveis); Return RestTemplate.PostForObject ("http: //" + serviceId + "/ExcelService/export/v2", nova httpentity (urivariable), map.class); }Configurando o cabeçalho do navegador
/ ** * Defina a codificação de URL do arquivo de download de acordo com diferentes tipos de navegador * @param userAgent * @param filename * @return * @throws exceção */ public static string transfromfilename (string userAgent, string filename) lança exceção {string finalfilename = "";; if (stringutils.contains (userAgent, "msie")) {// ie navegador finalFileName = urlencoder.encode (nome do arquivo, "utf-8"); } else if (stringutils.contains (userAgent, "mozilla")) {// google, firefox finalfileName = new string (filename.getbytes ("gbk"), "iso8859-1"); } else {finalFilename = urlencoder.encode (nome do arquivo, "utf-8"); // outros navegadores} retornar FinalFileName; }Resumir
O acima é o método Spring Cloud Resttemplate (vários objetos) introduzidos a você pelo editor. Espero que seja útil para você. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a você a tempo. Muito obrigado pelo seu apoio ao site wulin.com!