Bei der Verwendung von Microservices haben Sie häufig Probleme, zwischen Diensten zu rufen. Spring Cloud bietet vor vortlimische Schnittstellenaufrufe und RastTemplate -Anrufe.
Hier werde ich die Methode des RastTemplate -Aufrufs diskutieren:
Service A: Die drei Objektparameter, die diese drei Parameter empfangen, werden über die Datenbank abgeleitet.
Service B: Zum Aufrufen von Service a Service B bietet eine Methode zum Abfragen von drei Parametern, und drei Parameter müssen später verwendet werden.
Für Service A gibt es zwei Möglichkeiten, damit umzugehen
1. Service B bietet eine vortreitende Schnittstelle zur Offenlegung der Methode zur Abfrage von drei Parametern. Service A direkt Referenzen täuschen vor, um Parameter abzufragen. Service B muss in der Vergangenheit nur die drei Abfrage -Schlüsselwörter übergeben.
Dienst eine Aktion
@PostMapping("/import/{busiCode}/{filePath}") public Map<String,String> importExcel(@PathVariable("filePath") String filePath,@PathVariable("busiCode") String busiCode,@RequestBody Map<String, String> params, HttpServletRequest request,HttpServletResponse response) { response.setcharactercoding ("utf-8"); UserInfo user = userUtil.getUser (); return excelService.importExcel (Filepath, Bussicode, Params, Benutzer); } Service einen Service
// Einführung der vorgefertigten Schnittstelle private ExcelFrEGN excrEfResign; public map <string, string> importexcel (String filepath, String -Busicode, Map <String, String> Params, userInfo -Benutzer) {map <String, String> result = new HashMap <String, String> (); excrEfRegn = springtool.getApplicationContext (). getBean (excrEfRegn.Class); CmdimportConfigDTO configDTO = excforteN.getCMdimportConfigbyBusicode (Bussicode); Cmdimportdto importdto = neuer cmdimportdto (); ImportDTO.SetimportConfigid (configDTO.getId ()); importDto.setExcelPath (filepath); ImportDTO.SetParam (neuer gsonBuilder (). create (). tojson (params)); ImportDTO.SetLog (""); Langes Impid = null; try {impid = long.valueof (excelEnREGN.SAVECMDIMPORTDTO (ImportDTO)); } catch (Ausnahme e1) {e1.printstacktrace (); result.put ("Fehler", "Ausnahme beim Speichern"); result.put ("message", e1.getMessage ()); Rückgabeergebnis; } try {excrEfRegn.UpdateImaPortStatus (Impid, ImportConstant.importStatus.submit, "erfolgreich einreichen"); } catch (Ausnahme e) {e.printstacktrace (); } Validatetask validatetask = new validAtetask (); validatetask.init (Impid, Filepath, Bussicode, Params, Benutzer); String -Nachricht; try {message = validatetask.call (); } catch (Ausnahme e) {e.printstacktrace (); result.put ("Fehler", "Ausnahme in der Überprüfung aufgetreten"); result.put ("message", e.getMessage ()); Rückgabeergebnis; } if (message! result.put ("meldung", meldung); Rückgabeergebnis; } Persisttask Persisttask = new Persisttask (); Persisttask.init (Impid, Filepath, Bussicode, Params, Benutzer); result.putall (ImportQueue.Submit (Persisttask)); Rückgabeergebnis; }B-Fehgin bereitgestellt von Service B
@FeignClient (value = "Frame-Service", path = "/excelapi/v1") öffentliche Schnittstelle ExcelfResign erweitert Excelapi {}Serving b api Schicht B-API
public interface ExcelApi { /** * Update status* @param impId * @param importType * @param result */ @PostMapping("/updateImportStatus/{impId}/{importType}/{result}") void updateImportStatus(@PathVariable("impId") Long impId, @PathVariable("importType") String importType, @PathVariable ("Ergebnis") String -Ergebnis) löst eine Ausnahme aus; /** * Konfigurationselemente abrufen * @param busicode * @return */@getmapping ("/getImportconfig/{busicode}") cmdimportConFigdto getCmdimportConfigByBusicode (@pathvariable ("Busicode") String Busicode); /** * Informationen speichern * @param importdto * @return */@postmapping ("/SaveImport") String SaveCmdimportDTO (@RequestBody cmdimportdto importdto); }Service B implementiert die Aktion der API -Schnittstelle
@RestController @RequestMapping ("/excelapi/v1") öffentliche Klasse ExcelfeIntaction implementiert Excelapi {@autowired private cmdexportService ExportService; /** * Importieren Sie Konfigurationselemente * @param busicode * @return */@getmapping ("/getImportconfig/{busicode}") public cmdimportConFigdto getCmdimportConFigBusicode (@PathVariable ("Busicode") {zurücksend) {zurücksend cmdimportConfigservice.getCMdimportConfigbyBusicode (Bussicode); } /** * 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 ("Ergebnis") String -Ergebnis) löst eine Ausnahme aus {cmdimportService.UpdateImaPortStatus (ImportStatus, New Date (), Ergebnis); }/** * Informationen speichern * @param importdto * @return */@postmapping ("/saveMport") public String SaveCmDimportDTO (@RequestBody cmdimportDTO importdto) {try {cmdimportService.savecMdimportDto (importdto); return importDto.getId (); } catch (Ausnahme e) {e.printstacktrace (); Neue BusinessRuntimeException werfen ("Systemausnahme"); }}}Service B nennt Service eine Aktionsschicht
/***** @param Busicode Die exportierte Geschäftscodierung kann bestimmen, dass ein Modul es exportieren kann expdownloadv3 (@PathVariable ("busicode") String -Busicode, @RequestBody Map <String, Objekt> Werte, httpServletRequest -Anforderung) löst eine Ausnahme aus {if (Stringutils.isblank (Bussicode)) {Wurf New BusinessRuntimeException ("Parameter ist falsch, ob die Parameter korrekt sind, busicode?"). } // Erhalten Sie die Ausführungsprozess map map = restTemplate.postforObject ("http: //" + serviceId + "/excelapi/v1/filename"/"+busicode, Values, map.class); String path = (String) map.get (" filepath); CMDEXPORTCONFIGDO CMDEXPORTCONFIG = ExporteService.getCMDexportConfigByBusicode (Bussicode); Headers = New HTTPHEADERS (); FrameurlConstants.TransFromFileName (Benutzeragent, Dateiname) + ".2. Service B übergibt direkt die Abfrageparameter an den Service A.
Service a:
/** * Empfangen Sie Parameterübergabe * Empfangen Sie die folgenden drei Schlüsselwertepaare * cmdexportConfig: cmdexportConfigDTO * ExportfieldList: List <CmdexportfieldConFigDTO> * Params: map * @param params * @param request * @param reaktion * @return MAP <string, Objekt> Params, httpServletRequest-Anforderung, httpServletResponse-Antwort) {response.setcharactercoding ("utf-8"); Versuchen Sie {// den Dateipfad zu ObjectMapper mapper = new ObjectMapper () abrufen; LinkedHashMap requestParmap = (linkedHashMap) params.get ("cmdexportConfig"); CmdexportConfigdto cmdexportConfigDTO = null; Liste <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, neue Typeeference <CmdexportfieldConfigDTO> () {}); } Map vales = (map) params.get ("params"); String filepath = excelService.exportExcel (cmdexportConfigDTO, ExportfieldList, Params, Request.getServletContext (). GetRealPath ("/")); Karte <String, String> map = new HashMap <String, String> (); map.put ("filepath", filepath); Neue Antwort zurückgeben (MAP, httpstatus.ok); } catch (ioException e) {neue runTimeException ("Ausgabedatei -Fehler"); }}Service B:
/**** @Param Busicode Das exportierte Geschäftskodier kann feststellen, dass ein bestimmtes Modul die Exportoperation durchführt* @Param -Werteanforderungsparameter** Übergebene komplexe Parameter über RESTTEMPLET* Geben Sie den Dateistream zurück und lassen Sie den Browser zum Herunterladen eingehen. Derzeit ist es notwendig, das Problem der Reaktion auf den Byte -Stream auf die Konsole des Browsers zu lösen. Die Methode des URL -Downloads wird später verwendet*/@Postmapping (value = "/export/v3/{busicode}", produziert = mediateType.text_plain_value) @RespondeBody Public Responseentity <Byte []> Expdownloadv3 (@PathVarable ("busicode") string busicode, @requestwods, @requestwods, @requestwods marks, @ -string busicode, @requestwods map <String, Objektion ("busicode"), @requestwods, | Request) löst eine Ausnahme aus {String busicode = values.get ("busicode"). toString (); if (Stringutils.isblank (Bussicode)) {Neue BusinessRuntimeException werfen ("Parameter falsch, bitte prüfen Sie, ob die Parameter korrekt sind, Bussicode?"); } // Erhalten Sie die Ausführungsprozess map String path = (String) map.get ("filepath"); byte [] excel = fastDfSclient.downloadTobytes (Pfad); CmdexportConfigdto cmdexportConfig = exporService.getCMDexportConfigbyBusicode (Bussicode); // den Dateinamen String mateiname = cmdexportconfig.getReportName () abrufen; // den Datei -Suffix -Namen String extfilename = path.substring (path.lastindexof ('.')+1) abrufen; Httpheaders headers = new httpheaders (); eragent = request.getheader ("user-Agent"); Headers.SetContentType (mediatype.application_octet_stream); Headers.SetContentDispositionFormData ("Attachment", FrameurlConstants.transfromFileName (BenutzerAgent, Dateiname) + "." + extfileName); Return New ResponseEntity <Byte []> (Excel, Header, httpstatus.ok); } / ** * Anforderungsanruf ausführen * @param busicode * @param variablen * @return * / private map SETRESTTEMPLATE (String -Busicode, Kartenvariablen) {String serviceId = ""; // Exportkonfiguration abfragen cmdexportConfigdto cmdexportConfig = exporService.getCMdexportConfigbyBusicode (Bussicode); serviceId = cmDexportConfig.getSystemTeMtyPe (); if (cmDexportConfig == null) {wurf neu businessRuntimeException ("ohne Exportkonfiguration nicht exportieren"); } // Die Exportfeldinformationen basierend auf der Liste der Export -Konfigurations -ID <CMDExportfieldConfigDTO> exportfieldlist = exportService.getallcmdexportfieldConFigDtobyConfigid (cmdexportconfig.getId ()) erhalten; if (Stringutils.isblank (ServiceID)) {Neue BusinessRuntimeException werfen ("exportierter Dienst nicht konfiguriert"); } Map <String, Objekt> urivariablen = new HashMap <> (); urivariables.put ("cmdexportconfig", cmdexportconfig); urivariables.put ("ExportfieldList", ExportfieldList); urivariablen.put ("Params", Variablen); restTemplate zurückgeben.postforObject ("http: //" + serviceID + "/excelService/export/v2", neue httpentität (urivariablen), map.class); }Einrichten des Browser -Headers
/ ** * Setzen Sie die URL -Enkodierung der Download -Datei gemäß verschiedenen Browsertypen * @param userAgent * @param Dateiname * @return * @throws Exception */ public static String transfromFileName (String userAgent, String FileName) Aussage {String finalFileName = "; if (stringutils.contains (userAgent, "msie")) {// IE Browser FinalFileName = urlencoder.encode (Dateiname, "UTF-8"); } else if (stringutils.contains (userAgent, "mozilla")) {// Google, Firefox FinalFileName = new String (Dateiname.getBytes ("GBK"), "ISO8859-1"); } else {FinalFileName = urlencoder.encode (Dateiname, "utf-8"); // Andere Browser} return FinalFileName; }Zusammenfassen
Das obige ist die Spring Cloud RestTemplate -Methode (mehrere Objekte), die Ihnen vom Editor vorgestellt wurden. Ich hoffe, es wird Ihnen hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird Ihnen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!