Lorsque vous utilisez des microservices, vous avez souvent du mal à appeler entre les services. Spring Cloud fournit des appels d'interface FEIG et des appels de repos.
Ici, je discuterai de la méthode d'appel de repos:
Service A: Les trois paramètres d'objet qui reçoivent ces trois paramètres sont interrogés via la base de données.
Service B: Pour appeler Service, un service B fournit une méthode pour interroger trois paramètres, et trois paramètres doivent être utilisés plus tard.
Pour le service A, il y a deux façons de le faire face
1. Le service B fournit une interface FEIGN pour divulguer la méthode d'interrogation de trois paramètres. Service A Références directes Feign to Requête paramètres. Le service B n'a besoin que de passer les trois mots clés de requête dans le passé.
Servir une action
@Postmapping ("/ import / {busicode} / {filepath}") public map <string, string> importExcel (@pathvariable ("filepath") string filepath, @ pathvariable ("busicode") String busicode, @ requestbody map <string, string> params, httpserverest request, httpsservletRebersponse réponse) {httpletequest request, httpsservletRespèse réponse) {httpletequest request, httpsservletRespèse. Response.SetcharAtterencoding ("UTF-8"); UserInfo user = userUtil.getUser (); return excelService.ImpPortExcel (filepath, busicode, params, utilisateur); } Service un service
// introduire l'interface feign private excelfreign expelfreign; 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 = EXCELFELFREIGN.GETCMDIMPORTCONFIGBYBUSICODODE (BUTISICODE); CMDIMPORTDTO IMPORTDTO = NOUVEAU CMDIMPORTDTO (); importdto.setImportConfigid (configdto.getId ()); importdto.sexcelPath (filepath); importdto.setParam (new gsonBuilder (). create (). tojson (params)); importdto.setlog (""); Long imprid = null; try {Impid = long.valueof (Excelfreign.savecmDimportDTO (importdto)); } catch (exception e1) {e1.printStackTrace (); result.put ("erreur", "exception s'est produite lors de la sauvegarde"); result.put ("message", e1.getMessage ()); Résultat de retour; } essayez {Excelfreign.updateImportStatus (Impid, importConstant.ImportStatus.Submit, "Soumettre réussi"); } catch (exception e) {e.printStackTrace (); } ValidateTask validateTask = new ValidateTask (); validateTask.init (imprid, filepath, busicode, params, utilisateur); Message de chaîne; essayez {message = validateTask.Call (); } catch (exception e) {e.printStackTrace (); result.put ("erreur", "exception s'est produite dans la vérification"); result.put ("message", e.getMessage ()); Résultat de retour; } if (message! = null) {result.put ("error", "vérification a échoué"); result.put ("message", message); Résultat de retour; } Persisttask persisttask = new persisttask (); persisttask.init (imprid, filepath, busicode, params, utilisateur); result.putall (importQueue.Submit (persisttask)); Résultat de retour; }B-Fegin fourni par le service B
@FeignClient (value = "frame-service", path = "/ excelapi / v1") Interface publique Excelfreign étend Excelapi {}Service B API Couche B-API
Interface publique ExcelAPI {/ ** * Statut de mise à jour * @param Impid * @param importType * @param result * / @postmapping ("/ updateImportStatus / {Impid} / {importType} / {Result}") VOID UpdateImpportStatur (@Pathvariable ("Impid") Long Impid, @PathvarIac ImportType, @pathvariable ("result") Résultat de chaîne) lève une exception; / ** * Obtenez des éléments de configuration d'importation * @param buisicode * @return * / @getmapping ("/ getIMPortConfig / {Busicode}") cmDIMPORTCONFIGDTO getCMDIMPORTCONFIGBYBUSICODE (@Pathvariable ("BusicoDe") String Busicode); / ** * Enregistrer les informations * @param importdto * @return * / @postMapping ("/ SaveImport") String SAVECMDIMPORTDTO (@Requestbody CMDIMPORTDTO IMPORTDTO); }Le service B met en œuvre l'action de l'interface API
@RestController @RequestMapping ("/ ExcelAPI / V1") Classe publique ExcELFELIGNACTION implémente ExcelAPI {@Autowired Private CMDExportService ExportService; / ** * Obtenez des éléments de configuration d'importation * @param busicode * @return * / @getmapping ("/ getIMPortConfig / {busicode}") public cmDIMPORCONFIGDTO getCMDIMPORTCONFIGBYBUSICODE (@Pathvariable ("buscoode") String busicode) {return) cmdimportConfigService.getCmDimportConfigByBusicode (busicode); } / ** * Statut de mise à jour * @param impid * @param importstatus * @param result * / @postmapping ("/ updateImportStatus / {Impid} / {importType} / {result}") public void updateImportSatus (@PathVariable ("Impid") Long Impid, @Pathvary @Pathvariable ("result") Résultat de la chaîne) lève une exception {cmdimportService.updateImportStatus (Impid, importstatu, new Date (), result); } / ** * Enregistrer les informations * @param importdto * @return * / @postMapping ("/ SaveImport") public String SavecMDIMPORTDTO (@Requestbody CMDIMPORTDTO ImportDTO) {try {cmDIMPORTService.savecmDIMPortDTO (importdto); return importdto.getID (); } catch (exception e) {e.printStackTrace (); lancer une nouvelle entreprise BusinessRuntimeException ("exception du système"); }}}Service B appelle le service une couche d'action
/ ** * * * @param buscicode L'encodage commercial exporté peut déterminer qu'un module peut l'exporter * @param valeurs de demande paramètres * * Passer les paramètres complexes via RestTemplate * Renvoyez le flux de fichiers et laissez le navigateur apparaître pour télécharger * / @postmapping (value = "/ exportant / v3 / {@ buscode}") @RessageBodyBody ExpDownloadv3 (@Pathvariable ("busiCode") String busicode, @Requestbody map <string, object> valeurs, httpServLetRequest) lève une exception {if (stringUtils.isblank (busicode)) {throw businessRuntimeException ("Paramètre est incorrect, s'il vous plaît vérifier si les paramètres sont corrects, bussimeexception?"); } // Obtenez la carte du processus d'exécution Map = RestTemplate.PostForObject ("http: //" + serviceID + "/excelapi/v1/filename"/"+Busicode ,values,map.class); String Path = (String) Map.get (" filepath "); byte [] excel = FastDFSClient.get.DownloadToByTs (path); Cmdexportconfigdto cmdexportconfig = exportService.getcmdexportConfigByBusicode (busicode); en-têtes = new httpheaders (); FrameurlConstants.transfromFileName (UserAgent, FileName) + "."2. Service B passe directement les paramètres de requête pour servir un
Service A:
/ ** * recevoir le paramètre passant * recevoir les trois valeurs clés suivantes paires * cmdexportConfig: cmdexportConfigdto * exportFieldList: list <cmdexportfieldconfigdto> * params: map * @param params * @param request * @param réponse * @return * / @postmapping ("/ export / v2") Map <String, Object> Params, HttpServLetRequest Request, HttpServletResponse Response) {Response.SetcharAtterencoding ("UTF-8"); essayez {// obtenez le chemin du fichier vers objectMapper Mappeur = new ObjectMapper (); LinkedHashMap requestParmap = (LinkedHashmap) params.get ("cmdexportConfig"); CmdexportConfigdto cmdexportConfigdto = null; List <cmdexportfieldconfigdto> exportFieldList = null; if (requestParmap.size ()> 0) {cmDExportConfigdTo = mAper.ConvertValue (requestParmap, cmdexportConfigdto.class); } ArrayList arrayList = (arrayList) params.get ("ExportFieldList"); if (arrayList.size ()> 0) {ExportFieldList = mAper.ConvertValue (ArrayList, New TypeReference <CMDExportFieldConfigdTo> () {}); } Map valeurs = (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); retourner une nouvelle réponse (map, httpstatus.ok); } catch (ioException e) {throw new RuntimeException ("Erreur de fichier de sortie"); }}Service B:
/ ** * * @param buscicode L'encodage commercial exporté peut déterminer qu'un certain module fait l'opération d'exportation * @param valeurs de demande paramètres * * Passer les paramètres complexes via RestTemplate * Renvoyez le flux de fichiers et laissez le navigateur apparaître pour le télécharger. Actuellement, il est nécessaire de résoudre le problème de la réponse au flux d'octets à la console du navigateur. La méthode de téléchargement d'URL est utilisée par la suite * / @postmapping (value = "/ export / v3 / {buscoode}", produit = mediatype.text_plain_value) @ResponseBody Public Responsentity <Byte []> expdownloadv3 (@pathvariable ("buscicode") String BuidODE, @requestbody map request) lève l'exception {string busicode = valeurs.get ("busicode"). toString (); if (stringUtils.isblank (busicode)) {lancez une nouvelle entreprise BusinessRuntimeException ("Paramètre incorrect, veuillez vérifier si les paramètres sont corrects, buscicode?"); } // Obtenez la carte du processus d'exécution map = excuterestTemplate (busicode, valeurs); String path = (string) map.get ("filepath"); Byte [] Excel = FastDfsClient.DownloadToBytes (Path); CmdexportConfigdto cmdexportConfig = exportService.getcmdexportConfigByBusicode (busicode); // Obtenez le nom de fichier String filename = cmdexportconfig.getReportName (); // obtient la chaîne de nom de fixe de fichier ExtFileName = path.substring (path.lastIndexof ('.') + 1); Httpheaders en-têtes = new httpheaders (); eragent = request.getheader ("user-agent"); En-thers.setContentType (mediaType.Application_octet_stream); en-têtes.setContentDispositionFormData ("attachement", frameurlConstants.transfromFileName (userAgent, fichier) + "." + extFileName); renvoyer une nouvelle réponse <yte []> (Excel, en-têtes, httpstatus.ok); } / ** * Exécuter l'appel de la demande * @param buscicode * @param variables * @return * / map private exhaustrestTemplate (string busicode, map variables) {String ServiceId = ""; // Configuration d'exportation de requête CMDExportConfigdto cmdexportConfig = exportService.getcmdexportConfigByBusicode (busicode); ServiceId = cmdexportConfig.getSystemType (); if (cmDExportConfig == null) {Throw New BusinessRuntiMeException ("Impossible d'exporter sans configuration d'exportation"); } // Obtenez les informations sur le champ d'exportation en fonction de la liste des ID de configuration d'exportation <CMDExportFieldConfigdTo> ExportFieldList = ExportService.getAllCMDExportFieldConfigdToByConfiGid (cmdexportConfig.getID ()); if (stringUtils.isblank (serviceId)) {lancer une nouvelle entreprise BusinessRuntimeException ("Service exporté non configuré"); } Map <string, objet> urivariables = new hashmap <> (); urivariables.put ("cmdexportConfig", cmdexportConfig); urivariables.put ("ExportFieldList", ExportFieldList); urivariables.put ("params", variables); return restTemplate.postForObject ("http: //" + serviceID + "/ excelService / export / v2", new httpentity (urivariables), map.class); }Configuration de l'en-tête du navigateur
/ ** * Définissez le codage d'URL du fichier de téléchargement en fonction des différents types de navigateur * @param userAgent * @param filename * @return * @throws exception * / public static string transfromfilename (string userAgent, String filename) lève exception {string finalfileName = ""; if (StringUtils.Contains (UserAgent, "MSIE")) {// IE Browser FinalFileName = UrLencoder.encode (FileName, "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"); // autres navigateurs} return finalFileName; }Résumer
Ce qui précède est la méthode de repos de Spring Cloud (plusieurs objets) présentée par l'éditeur. J'espère que cela vous sera utile. Si vous avez des questions, veuillez me laisser un message et l'éditeur vous répondra à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!