عند استخدام الخدمات الصغيرة ، غالبًا ما تواجه مشكلة في الاتصال بين الخدمات. يوفر Spring Cloud مكالمات واجهة Feign ومكالمات RestTemplate.
هنا سأناقش طريقة استدعاء RestTemplate:
الخدمة أ: يتم الاستعلام عن معلمات الكائن الثلاثة التي تتلقى هذه المعلمات الثلاثة من خلال قاعدة البيانات.
الخدمة ب: للاتصال بالخدمة ، توفر الخدمة B طريقة للاستعلام عن ثلاثة معلمات ، ويجب استخدام ثلاثة معلمات لاحقًا.
للخدمة أ ، هناك طريقتان للتعامل معها
1. الخدمة B توفر واجهة Feign للكشف عن طريقة الاستعلام عن ثلاث معلمات. خدمة المراجع مباشرة تظاهر لمعلمات الاستعلام. تحتاج الخدمة B فقط إلى تمرير الكلمات الرئيسية الثلاثة في الماضي.
خدمة العمل
postmapping ("/import/{busicode}/{filepath}") خريطة عامة <string ، string> isordexcel (pathvariable ("filepath") string filepath ،@pathvariable ("busicode") string busicode ،@requestbody map <string> params ، httpletrequest request ، استجابة. setcharacterencoding ("UTF-8") ؛ userInfo user = userUtil.getuser () ؛ إرجاع excelservice.importexcel (filepath ، busicode ، params ، user) ؛ } خدمة خدمة
. الخريطة العامة <string ، string> importexcel (سلسلة filepath ، سلسلة busicode ، خريطة <سلسلة ، سلسلة> params ، userInfo user) {map <string ، string> result = new hashmap <string ، string> () ؛ ExcelDSERIGN = springtool.getApplicationContext (). getBean ( cmdimportConfigdto configdto = exceldreign.getCmDimportConfigByBusicode (busicode) ؛ cmdimportdto importDto = جديد cmdimportdto () ؛ importdto.setimportConfigid (configdto.getId ()) ؛ ImportDto.setExcelPath (FilePath) ؛ importdto.setparam (new gsonbuilder (). create (). tojson (params)) ؛ ImportDto.setLog ("") ؛ ويب طويل = فارغ ؛ حاول {prefid = long.valueof (exceldreign.savecmdimportdto (importDto)) ؛ } catch (استثناء e1) {e1.printstacktrace () ؛ النتيجة. result.put ("message" ، e1.getMessage ()) ؛ نتيجة العودة } جرب {exceldreign.updateimportStatus (prepid ، importConstant.importStatus.Submit ، "إرسال ناجح") ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } ValidateTask ValidateTask = new ValidateTask () ؛ ValidateTask.init (prepid ، filepath ، busicode ، params ، user) ؛ رسالة سلسلة حاول {message = validateTask.call () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ result.put ("خطأ" ، "استثناء حدث في التحقق") ؛ النتيجة. نتيجة العودة } if (message! = null) {result.put ("خطأ" ، "فشل التحقق") ؛ result.put ("رسالة" ، رسالة) ؛ نتيجة العودة } persistask persisttask = new perferTask () ؛ persisttask.init (prepid ، filepath ، busicode ، params ، user) ؛ result.putall (ImportQueue.Submit (persisttask)) ؛ نتيجة العودة }B-fegin التي توفرها الخدمة ب
@dignclient (value = "frame-service" ، path = "/excelapi/v1") excelder exceldign الواجهة العامة يمتد excelapi {}خدمة B API طبقة B-API
الواجهة العامة excelapi {/** * update status * param previd * param importType * @param result */postmapping ("/updateImportStatus/{prefid}/{importType}/{result}") updateimportStatus (pathratepate ("efpid") @pathvariable ("النتيجة") نتيجة السلسلة) يلقي الاستثناء ؛ /** * احصل على عناصر تكوين استيراد * param busicode * return */getMapping ("/getImPortConfig/{busicode}") /** * حفظ المعلومات * param importdto * regurn */postmapping ("/saveImport") String SaveCmDimportDTO (REquestBody cmDimportDTO ImportDto) ؛ }الخدمة B تنفذ عمل واجهة API
RestController @requestmapping ("/excelapi/v1") تنفذ الطبقة العامة exceldIgnAction excelapi {autowired private cmdexportservice orderService ؛ /** * احصل على عناصر تكوين استيراد * param busicode * return */getMapping ("/getImportConfig/{busicode}") public cmdimportConfigdto getCmDimportConfigByBusicod cmdimportConfigService.getCmDimportConfigByBusicode (busicode) ؛ }/** * حالة التحديث * param previd * param importStatus * param result */postmapping ("/updateImportStatus/{prepid}/{importType}/{result}") public void updateimportStatus (pathVarArible ("dipid" patherable ("pathvariable (" eSpathStatsStus eisprotStus ("evidible". @pathvariable ("result") نتيجة سلسلة) يلقي الاستثناء {cmdimportService.upDateImportStatus (prepid ، importStatus ، Date () ، النتيجة) ؛ }/** * حفظ المعلومات * param importdto * regurn */postmapping ("/saveImport") السلسلة العامة savecmdimportdto ( @requestbody cmdimportdto importdto) {try {cmdimportservice.savecmdimportdto (importdto) ؛ return isportDto.getId () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ رمي BusinessRuntImeexception ("استثناء النظام") ؛ }}}الخدمة ب خدمة الخدمة (أ) طبقة عمل
/****** param busicode يمكن أن يحدد ترميز الأعمال المصدرة أن الوحدة النمطية يمكن أن تصدرها* param request request parameters** تمرير معلمات معقدة من خلال resttemplate* إرجاع دفق الملف ودع المتصفح يطفو على التنزيل*/postmapping (value = "/apport/v3/{busicode}") expdownloadv3 (pathvariable ("busicode") سلسلة busicode ، requestbody خريطة <string ، كائن> قيم ، httpservletrequest طلب) يلقي استثناء {if (stringutils.isblank (busicode)) } // الحصول على خريطة عملية التنفيذ = restTemplate.postForObject ("http: //" + serviceid + "/excelapi/v1/filename"/"+busicode.values،map.class) ؛ string path = (string) map.get (" filepath ") ؛ cmdexportconfigdto cmdexportConfig = orportService.getCmdexportConfigbybusicode (busicode) ؛ الرؤوس = httpheaders جديدة () ؛ FrameUrlConstants.transflename (useragent ، اسم الملف) + ".2. الخدمة ب تمر مباشرة معلمات الاستعلام للخدمة أ
الخدمة أ:
/** * استلام معلمة تمرير * تلقي أزواج القيم الرئيسية الثلاثة التالية * cmdexportConfig: cmdexportConfigdto * exportfieldlist: قائمة <cmdexportfieldconfigdto> خريطة <سلسلة ، كائن> params ، httpservletrequest request ، httpservletresponse) {response.setcharacterencoding ("utf-8") ؛ حاول {// الحصول على مسار الملف إلى ObjectMapper mapper = جديد 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) {orportFieldList = mapper.convertvalue (ArrayList ، typereference جديد <cmdexportfieldconfigdto> () {}) ؛ } قيم الخريطة = (خريطة) params.get ("params") ؛ string filepath = excelservice.exportexcel (cmdexportConfigdto ، exportFieldList ، params ، request.getServletContext (). getRealPath ("/")) ؛ خريطة <string ، string> map = new hashmap <string ، string> () ؛ map.put ("filepath" ، filepath) ؛ إرجاع استجابة جديدة (MAP ، httpstatus.ok) ؛ } catch (ioException e) {رمي new RunTimeException ("خطأ ملف الإخراج") ؛ }}الخدمة ب:
/***** param busicode يمكن لترميز الأعمال المصدرة أن تحدد أن وحدة نمطية معينة تقوم بعملية التصدير* param request request parameters** تمرير المعلمات المعقدة من خلال RestTemplate* إرجاع دفق الملف والسماح للمتصفح بالظهور لتنزيله. حاليًا ، من الضروري حل مشكلة الاستجابة لتيار البايت إلى وحدة التحكم في المستعرض. يتم استخدام طريقة تنزيل url بعد ذلك*/postmapping (value = "/esport/v3/{busicode}" ، تنتج = mediaType.text_plain_value) @Responsebody استجابة عامة <byte [] طلب) يلقي استثناء {String busicode = values.get ("busicode"). toString () ؛ if (stringUtils.IsBlank (busicode)) {رمي New BusinessRuntImeException ("المعلمة غير صحيحة ، يرجى التحقق مما إذا كانت المعلمات صحيحة ، busicode؟") ؛ } // احصل على خريطة عملية التنفيذ = ExcuTerestTemplate (busicode ، القيم) ؛ مسار السلسلة = (سلسلة) map.get ("FilePath") ؛ byte [] excel = fastdfsclient.DownloadTobytes (path) ؛ cmdexportConfigdto cmdexportConfig = exportService.getCmDexportConfigByBusicode (busicode) ؛ // احصل على اسم ملف اسم الملف = cmdexportConfig.getReportName () ؛ // احصل على اسم File Factix name extfilename = path.substring (path.lastindexof ('.')+1) ؛ HttPheaders Headers = New HttPheaders () ؛ eragent = request.getheader ("Asse-Agent") ؛ headers.setContentType (mediaType.application_octet_stream) ؛ headers.setContentDispositionFormData ("المرفق" ، framurlConstants.TransFromFilename (useragent ، filename) + "." + extfilename) ؛ إرجاع استجابة جديدة <byte []> (excel ، الرؤوس ، httpstatus.ok) ؛ } / ** * تنفيذ طلب الاتصال * param busicode * param متغيرات * regurn * / private map exhaustrestTemplate (سلسلة busicode ، متغيرات الخريطة) {String serviceId = "" ؛ // تكوين تصدير الاستعلام cmdexportConfigDTO ServiceId = cmdexportConfig.getSystemType () ؛ if (cmdexportConfig == null) {رمي businessRuntImException ("غير قادر على التصدير دون تكوين تصدير") ؛ } // احصل على معلومات حقل التصدير بناءً على قائمة معرف تكوين التصدير <CMDEXPortFieldConfigDTO> ExportFieldList = exportService.getAllCmdexportFieldConfigDtobyConfigid (cmdexportConfig.getId ()) ؛ if (stringUtils.IsBlank (serviceId)) {رمي BusinessRuntImException ("الخدمة المصدرة لم يتم تكوينها") ؛ } الخريطة <string ، object> urivariables = new hashmap <> () ؛ urivariables.put ("cmdexportConfig" ، cmdexportConfig) ؛ urivariables.put ("ExportFieldList" ، ExportFieldList) ؛ urivariables.put ("params" ، المتغيرات) ؛ return resttemplate.postForObject ("http: //" + serviceid + "/excelservice/esport/v2" ، httpentity (urivariables) ، map.class) ؛ }إعداد رأس المتصفح
/ ** * قم بتعيين ترميز عنوان URL لملف التنزيل وفقًا لأنواع المتصفح المختلفة * param useragent * param filename * regurn * @throws استثناء */ سلسلة ثابتة عامة transfromfilename (سلسلة useragent ، اسم ملف السلسلة) يلقي استثناء {Stringfilename = "" ؛ " if (stringUtils.contains (userAgent ، "msie")) {// ie browser finalfilename = urlencoder.encode (filename ، "utf-8") ؛ } آخر إذا (stringUtils.contains (useragent ، "mozilla")) {// google ، firefox finalfilename = new string (filename.getbytes ("GBK") ، "ISO8859-1") ؛ } آخر {FinalFilename = urlencoder.encode (اسم الملف ، "UTF-8") ؛ // متصفحات أخرى} إرجاع FinalFilename ؛ }لخص
ما سبق هو طريقة الربيع السحابة لـ Spring Cloud (كائنات متعددة) التي قدمها لك المحرر. آمل أن يكون ذلك مفيدًا لك. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر إليك في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!