Zuul هو موازن تحميل يعتمد على توجيه JVM وجانب الخادم الذي ينتجه Netflix.
وظائف زول:
يتيح محرك قواعد Zuul قواعد الكتابة والمرشحات من خلال أي لغة JVM ، ويدعم البناء القائم على Java و Groovy.
تم استبدال خصائص التكوين zuul.max.host.connections بخصائصين تكوين جديدان ، zuul.host.maxtotalconnections (إجمالي عدد الاتصالات) و zuul.host.maxperrouteConnections ، (عدد التوصيلات لكل مسار) القيم الافتراضية من 200 و 20 ، على التوالي.
1. لماذا استخدم هذا
في أنظمة الخدمات المصغرة المصممة على SpringCloud ، عادةً ما يتم استخدام Gateway Zuul لإجراء بعض عمليات التصفية مثل التحقق من المستخدم. على سبيل المثال ، يقوم المستخدم بتخزين الرموز في رأس المعلمات أو عنوان URL. تحتاج طبقة البوابة إلى استخدام هذا الرمز المميز للعثور على معرف المستخدم للمستخدم وتخزينه في الطلب بحيث يمكن استخدام الخدمات المجهرية اللاحقة مباشرة لتجنب الاستعلام مع الرموز.
2. المعرفة الأساسية
أكبر استخدام في Zuul هو بالإضافة إلى التوجيه ، وهو مرشح. تحتاج المرشحات المخصصة إلى تنفيذ واجهة Zuulfilter. في طريقة Run () ، يمكنك استخدامها
requestContext ctx = requestContext.getCurrentContext () ؛ httpservletrequest request = ctx.getRequest () ؛
احصل على الطلب ، ولكن لا يوجد سوى getParameter () في الطلب ولكن لا توجد طريقة setParameter () ، لذلك ليس من الممكن تعديل معلمة URL مباشرة. بالإضافة إلى ذلك ، على الرغم من أنه يمكن استخدام setAttribute () في reqeust ، فقد يكون ذلك بسبب النطاقات المختلفة ، لا يمكن الحصول على السمة هنا في الخدمات الدقيقة اللاحقة ، لذلك يجب النظر في طريقة أخرى.
3. ممارسات محددة
الطريقة النهائية هي الاستخدام
CTX.SetRequest (httpservletrequestwrapper (طلب) {}) جديدطريقة لإعادة بناء الطلب في السياق ، الرمز كما يلي:
استيراد javax.servlet.http.httpservletRequestWrapper ؛ // إضافة userId try {inputStream in = ctx.getRequest (). getInputStream () ؛ سلسلة body = streamuTils.copyToString (في ، charset.forname ("utf-8")) ؛ System.out.println ("الجسم:" + الجسم) ؛ jsonobject json = jsonobject.fromObject (الجسم) ؛ json.put ("userId" ، userId) ؛ String newBody = json.toString () ؛ System.out.println ("Newbody:" + newbody) ؛ byte النهائي [] reqbodybytes = newbody.getBytes () ؛ ctx.setRequest (new httpservletrequestwrapper (request) {Override public secretInputStream getInputStream () يلقي ioException {return new servletinputStreamWrapper (reqbodybytes) ؛} override public intentlength () getContEntLengthLong () {return reqbodybytes.length ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }الفكرة هي الحصول على دفق الإدخال المطلوب وإعادة كتابته ، أي إعادة كتابة معلمات JSON.
في وحدات تحكم الخدمات المجهرية اللاحقة ، يمكن استخدام الأشكال
خريطة requestbody <string ، object> body ====== body.get ("userId") ؛وبهذه الطريقة ، تم تمرير معرف المستخدم في Zuulfilter
أربعة. بعض المحاولات
عند إعادة كتابة httpservletrequestwrapper ، حاولت إعادة كتابة أساليب getParameterNames() و getParameterMap() ، على أمل إعادة كتابة معلمات عنوان URL ، لكنها لم تسري.
لخص
ما ورد أعلاه هو طريقة تعديل معلومات معلمة الطلب في SpringCloud التي قدمها لك المحرر. آمل أن يكون ذلك مفيدًا لك. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر إليك في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!