Cuando usa microservicios, a menudo tiene problemas para llamar entre los servicios. Spring Cloud proporciona llamadas de interfaz Feign y llamadas RESTTemplate.
Aquí discutiré el método de llamadas de RestTemplate:
Servicio A: Los tres parámetros del objeto que reciben estos tres parámetros se consultan a través de la base de datos.
Servicio B: Para llamar al servicio, un servicio B proporciona un método para consultar tres parámetros, y se deben usar tres parámetros más adelante.
Para el servicio A, hay dos formas de lidiar con él
1. El servicio B proporciona una interfaz Feign para revelar el método para consultar tres parámetros. Servicio A directamente hace referencia a los parámetros de consulta. El servicio B solo necesita pasar las tres palabras clave de consulta en el pasado.
Servicio a una acción
@PostMapping ("/import/{busicode}/{filePath}") mapa público <string, string> importexcel (@PathVariable ("filePath") string filePath,@pathVariable ("busicode") string busicode,@requestbody map <string> params, httpsEbrletRequest Solicitud, httpSEvletRessessessesseds respuesta) {respuesta) respuesta.setcharacterEncoding ("UTF-8"); UserInfo user = userutil.getuser (); devolver ExcelService.ImportExcel (FilePath, BusiCode, Params, User); } Servicio a un servicio
// Introducir la interfaz Feign Private ExcelfReign ExcelfLeign; MAP Public <String, String> ImportExcel (String FilePath, String Busicode, MAP <String, String> Params, UserInfo User) {MAP <String, String> Result = new HashMap <String, String> (); ExcEfFreign = SpringTool.GetApplicationContext (). GetBean (ExcEffreign.class); CMDIMPORTCONFIGDTO CONFIGDTO = Excelfreign.GetCMDIMPortConfigByBusiCode (BusiCode); Cmdimportdto importdto = new cmdimportdto (); importdto.setImportConfigID (configDto.getID ()); importdto.setExcelpath (filepath); importdto.setParam (new GsonBuilder (). Create (). TJson (Params)); importdto.setLog (""); Largo impid = nulo; intente {impid = long.ValueOf (ExcEffreign.savecMdImportDTO (importdto)); } catch (excepción e1) {e1.printstackTrace (); resultado.put ("error", "se produjo una excepción al guardar"); resultado.put ("Mensaje", e1.getMessage ()); resultado de retorno; } try {exCelFreign.UpdateImportStatus (impid, importconstant.importstatus.submit, "envíe exitoso"); } catch (Exception e) {E.PrintStackTrace (); } ValidateTask ValidateTask = new ValidateTask (); validateTask.init (impid, filepath, busicode, params, usuario); Mensaje de cadena; prueba {mensaje = ValidateTask.call (); } catch (Exception e) {E.PrintStackTrace (); resultado.put ("error", "se produjo la excepción en la verificación"); result.put ("Mensaje", E.GetMessage ()); resultado de retorno; } if (mensaje! = null) {resultado.put ("error", "fallido de verificación"); resultado.put ("mensaje", mensaje); resultado de retorno; } PersistTask persistTask = new PersistTask (); persisttask.init (impid, filepath, busicode, params, usuario); resultado.putall (importqueue.submit (persisttask)); resultado de retorno; }B-fegin proporcionado por el servicio b
@FeIgnClient (value = "Frame-Service", Path = "/Excelapi/V1") La interfaz pública ExcelFreign extiende Excelapi {}Sirviendo la capa de la API B B-API
interfaz pública Excelapi {/** * Estado de actualización * @param impid * @param importype * @param resultado */@postmapping ("/updateImportStatus/{impid}/{importype}/{resultado}") void updateImportus (@PathVariable ("impid") largo, @pathvariable ("importable) importype, @pathvariable ("resultado") resultado de cadena) lanza la excepción; /** * Obtenga elementos de configuración de importación * @param busicode * @return */@getmapping ("/getimportconfig/{busicode}") cmdimportconfigdto getcmdimportconfigbybusicode (@pathvariable ("busicode") string busicode); /** * Guardar información * @param importdto * @return */@postmapping ("/saveImport") String saveCmdimportdto (@RequestBody cmdimportdto importdto); }El servicio B implementa la acción de la interfaz API
@RestController @RequestMapping ("/Excelapi/V1") La clase pública ExcelfeignAction implementa Excelapi {@aUtowired private cmdexportservice exportservice; /** * Obtenga elementos de configuración de importación * @param busicode * @return */@getmapping ("/getimportconfig/{busicode}") public cmdimportconfigdto getcmdimportconfigbybusicode (@pathvariable ("busicode") string busicode) {retorno CMDIMPORTCONFIGService.getCMDIMPortConfigbyBusiCode (BusiCode); }/** * Estado de actualización * @param impid * @param importstatus * @param resultado */@postmapping ("/updateimportStatus/{impid}/{importype}/{resultado}") public void updateSportStatus (@PathVariable ("impid") Long Impid, @pathvariable ("importyPe, cita importable"). @PathVariable ("Result") String Result) lanza la excepción {cmdimportService.UpdateImportStatus (impid, importstatus, new date (), resultado); }/** * Guardar información * @param importdto * @return */@postmapping ("/saveMport") public string saveCmdimportdto (@RequestBody cmdimportdto importdto) {try {cmdimportService.savecmdimportdto (importdto); devolver importdto.getId (); } catch (Exception e) {E.PrintStackTrace (); tirar New BusinessRuntimeException ("Excepción del sistema"); }}}Servicio B llama al servicio una capa de acción
/****** @param BusiCode La codificación comercial exportada puede determinar que un módulo puede exportarlo* @param valores Parámetros de solicitud** Pase los parámetros complejos a través de RESTTemplate* Devolver la transmisión de archivos y dejar que el navegador aparezca para descargar*/@PostMapping (valor = "/export/v3/{Busicode}") ExpdownloadV3 (@PathVariable ("Busicode") String Busicode, @RequestBody Map <String, Object> Values, HttpServletRequest Solicitud) lanza la excepción {if (StringUtils.isblank (busicode)) {tirar nueva empresa de negocios ("Parámetro es incorrecta, verifique si los parámetros son correctos, busicode?"); ");"); "); } // Obtenga el proceso de ejecución MAP = RestTemplate.PostForObject ("http: //" + ServiceId + "/Excelapi/V1/filename"/"+Busicode,values,map.class); String path = (String) map.get (" filepath "); byte [] excel = fastdfsclient.loadtobytObytObyts (ruta); CMDEXPORTCONFIGDTO CMDEXPORTCONFIG = ExportService.getCMDEXPORTCONFIGBYBUSICODE (busicode); encabezados = new httpheaders (); FrameUrlConstants.TransFromFileName (UserAgent, nombre de archivo) + ".2. El servicio B pasa directamente los parámetros de consulta para dar servicio a un
Servicio A:
/** * Recibe el parámetro Paso * Reciba los siguientes tres pares de valores clave * cmdexportconfig: cmdexportconfigdto * exportFieldList: list <cmdexportfieldconfigdto> * params: map * @param params * @param request * @Param Response * @return */@postMapping ("/export/v2") Public ResponseExcel (@Param Response * @return */@postMapping ("/export/v2") PublicSpazsEntity (@Param Solicitude. params, solicitud httpservletrequest, respuesta httpservletreSponse) {Respuesta.SetcharacterEncoding ("UTF-8"); Pruebe {// Obtenga la ruta del archivo a ObjectMapper mapper = new ObjectMapper (); Linkedhashmap requestParmap = (LinkedHashMap) params.get ("cmdexportConfig"); Cmdexportconfigdto cmdexportconfigdto = null; Lista <cmdexportfieldconfigdto> exportfieldlist = null; if (requestParmap.size ()> 0) {cmdexportconfigdto = mApper.conververValue (requestParmap, cmdexportconfigdto.class); } ArrayList ArrayList = (ArrayList) Params.get ("ExportFieldList"); if (arrayList.size ()> 0) {exportFieldList = mApper.ConververValue (ArrayList, nueva tyquingerference <cmDexportFieldConfigdto> () {}); } Map valores = (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); devolver una nueva respuesta de respuesta (map, httpstatus.ok); } Catch (IOException e) {Throw New RuntimeException ("Error de archivo de salida"); }}Servicio B:
/***** @param BusiCode La codificación empresarial exportada puede determinar que cierto módulo hace la operación de exportación* @param Valores Parámetros de solicitud** Pase los parámetros complejos a través de RestTemplate* Devuelve la transmisión de archivos y deja que el navegador aparezca para descargarlo. Actualmente, es necesario resolver el problema de responder a la transmisión de bytes a la consola del navegador. El método de descarga de URL se utiliza después*/@postmapping (value = "/export/v3/{busicode}", produce = mediatype.text_lain_value) @ResponseBody Public ResponseEntity <byte []> ExpdownloadV3 (@PathVariable ("Busicode") String Busicode, @RequestBody <String, Object> Valores, HtttPeServe solicitud) lanza la excepción {String busicode = value.get ("busicode"). toString (); if (stringUtils.isblank (busicode)) {lanzar New BusinessRunteException ("Parámetro incorrecto, verifique si los parámetros son correctos, Busicode?"); } // Obtener el mapa del proceso de ejecución = excututerestTemplate (busicode, valores); String path = (string) map.get ("filepath"); byte [] Excel = fastdfsclient.downloadTobytes (ruta); CMDEXPORTCONFIGDTO CMDEXPORTCONFIG = ExportService.GetCMDEXPORTCONFIGBYBUSICODE (BusiCode); // Obtenga el nombre del archivo String FileName = CMDEXPORTCONFIG.GETRPORTNAME (); // Obtenga la cadena de nombre de sufijo del archivo extfileName = path.substring (path.lastindexof ('.')+1); Httpheaders encabezados = new httpheaders (); eRAGENT = request.getheader ("agente de usuario"); Headers.SetContentType (Mediatype.application_octet_stream); Headers.setContentDispositionFormData ("Adjunto", FrameUrlConstants.TransFromFileName (UserAgent, FileName) + "." + ExtFileName); devolver una nueva respuesta de respuesta <byte []> (Excel, encabezados, httpstatus.ok); } / ** * Ejecutar la llamada de solicitud * @param busicode * @param variables * @return * / private map shaustresttemplate (string busicode, map variables) {string serviceId = ""; // Configuración de exportación de consulta CMDEXPORTCONFIGDTO CMDEXPORTCONFIG = exportservice.getcmDexportCigByBusiCode (BusiCode); servicio = cmdexportconfig.getSystemType (); if (cmdexportconfig == null) {lanzar New BusinessRunteException ("No se puede exportar sin la configuración de exportación"); } // Obtenga la información del campo de exportación basada en la lista de identificación de configuración de exportación <CmDexportFieldConfigdto> exportFieldList = exportService.GetAllcmDexportFieldConfigDTObyConfigID (cmdexportconfig.getid ()); if (StringUtils.isblank (ServiceId)) {lanzar New BusinessRunteException ("Servicio exportado no configurado"); } Map <string, object> urivariables = new HashMap <> (); urivariables.put ("cmdexportconfig", cmdexportconfig); urivariables.put ("exportfieldlist", exportfieldlist); urivaribles.put ("params", variables); return ResttEmplate.postforObject ("http: //" + ServiceId + "/ExcelService/Export/V2", nueva httpentity (urivaribles), map.class); }Configuración del encabezado del navegador
/ ** * Establezca la codificación de URL del archivo de descarga de acuerdo con diferentes tipos de navegador * @param userAgent * @param FileName * @return * @throws Exception */ public static String transfromFileName (String UserAgent, String FileName) lanza Exception {String FinalFileName = ""; if (stringUtils.contains (userAgent, "msie")) {// es decir, el navegador finalFileName = urlencoder.encode (nombre de archivo, "utf-8"); } else if (stringUtils.Contains (UserAgent, "Mozilla")) {// Google, Firefox finalFileName = new String (FileName.getBytes ("GBK"), "ISO8859-1"); } else {finalFileName = urlencoder.encode (nombre de archivo, "UTF-8"); // Otros navegadores} return FinalFileName; }Resumir
Lo anterior es el método Spring Cloud RestTTemplate (múltiples objetos) introducido por el editor. Espero que te sea útil. Si tiene alguna pregunta, déjame un mensaje y el editor le responderá a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!