من خلال المشاركة السابقة ، تعلمنا العديد من المرافق الأساسية للهندسة المعمارية للخدمة الدقيقة ، من خلال هذه المكونات ، يمكننا بناء نظام بنية الخدمات الدقيقة البسيطة. على سبيل المثال ، قم بإنشاء مركز تسجيل خدمة متاح للغاية من خلال Spring Cloud Eureka وأدرك تسجيل الخدمة واكتشافها ؛
تحميل موازنة مع شريط سحابة الربيع أو التظاهر ؛ الحماية التي تحمل أخطاء الخدمة مع Spring Cloud Hystrix لتجنب انتشار الفشل. بعد إنشاء الخدمات المجهرية ، سنوفر بالتأكيد بعض واجهة خدمة API الموحدة إلى النظام الخارجي للاتصال.
ولكن عندما يستدعي النظام الخارجي واجهة برمجة التطبيقات الخاصة بنا ، كيف يمكنك تحديد الخدمة التي تحتاجها لتوفير الوظائف المحددة التي يتطلبها؟ يتضمن ذلك صيانة قواعد التوجيه وقوائم مثيل الخدمة.
يقدم هذا بطل الرواية اليوم - Spring Cloud Zuul ، وهو مكون بوابة API يعتمد على تنفيذ Netflix Zuul. يمكن أن يحل مشكلتين رئيسيتين:
حسنًا ، دعنا نلقي نظرة على كيفية تنفيذ خدمة البوابة هذه.
1. بناء بوابة وتكوين التوجيه
هنا ما زلنا بحاجة إلى استخدام خدمات Hello-Service و Feign-Consumer السابقة. اعتدنا أن نعتبر Feign-Consumer مستهلكًا للخدمة ، ولكن لا ننسى أنه في نظام Eureka ، فإن كل خدمة مزود خدمة ومستهلك خدمة ، لذا فإن Feign-Consumer هو أيضًا مزود خدمة ، وواجهات مثل http: // localhost: 9001/feign-consumer هي الخدمات.
بعد ذلك ، نقوم ببناء خدمة بوابة مع بنية الكود على النحو التالي:
خطوات تنفيذ الكود:
قم بإنشاء طريق جديد لـ Maven Project API-Gateway
تعديل ملف POM
<project xmlns = "http://maven.apache.org/pom/4.0.0" http://maven.apache.org/xsd/maven-4.0.0.xsd "> <Dodeversion> 4.0.0 </modelversion> <roupiD> com.sam </rougeid> <Chotifactid> API-gateway </artifactid> <roupl> org.springframework.boot </groupId> <StifactId> Spring-boot-starter-parent </stifactid> <الإصدار> 1.5.1.Release </version> </parent> <sperties> <javaversion> 1.8 </javaversion> </properties> <roupl> org.springframework.cloud </groupId> <StifactId> تعتمد على السحابة الزبدية </intifactid> <splection> camden.sr6 </version> <type> pom </type> الربيع-بوب-starter-actuator/spring-boot-boot-starter-hystrix/spring-boot-starter-ribbon-> <reperence> <rouperency> org.springframework.cloud </rougiD> </projectId>
قم بإنشاء فئة بدء تشغيل جديدة
/*** enablezuulproxy تمكين وظيفة خدمة بوابة API من Zuul**/@enablezuulproxy@springcloudapplicationpublication gatwayapp {public static void main (string [] args) {springapplication.run (gatwayapp.class ، args) ؛ }}إنشاء تطبيق جديد
server.port = 5555spring.application.name = API-Gateway#أضف إلى تكوين قواعد التوجيه#تكوين من خلال zuul.routes. <Troute> هو اسم المسار ويمكن تحديده بشكل تعسفي ، ولكن يجب أن تكون أسماء المسار لمجموعة من المسارات وعناوين URL هي نفسها كما هو موضح في المثال التالي: كل ما يرضي/API-A/** سيتم توجيهه إلى القواعد واجهة الخدمات المجهرية التي توفرها http: // localhost: 9001/hello Zuul.Routes.APi-a.path =/api-a/** zuul.routes.api-a.url = http: // localhost: 9001zuul.routes.api-b.path =/api-b/** zuul.routes.api-b.url = http: // localhost: 9090
اختبار ، ابدأ eureka ، مراجعة الخدمة ، المستهلك المظاهر وخدمة API-Gateway المضافة حديثًا ، ثم تفضل بزيارة http: // localhost: 5555/api-a/feign-consumer
الوصول بنجاح إلى واجهة الخدمة للمستهلكين المستهلكين--FINGING-CONSONSUMER.
الخطوات المذكورة أعلاه تنفذ تكوين التوجيه التقليدي. هذا التكوين له عيب كبير ، وهو أنه يتطلب التكوين اليدوي لقواعد التوجيه في ملف Application.Properties. عندما يكون هناك الكثير من الخدمات ، فإن عبء عمل الصيانة سيكون كبيرًا جدًا. من أجل تقليل تكاليف الصيانة ، هناك طريق آخر - مسار موجه نحو الخدمة.
2. التوجيه الموجهة للخدمة
Spring Cloud Zuul و Eureka Integrate ، يمكننا جعل مسار الطريق وليس تعيين عناوين URL ، ولكن خدمات محددة ، ويتم الحفاظ على عناوين URL للخدمة تلقائيًا بواسطة آلية اكتشاف خدمة Eureka. هذا النوع من المسار هو الطريق الموجهة للخدمة. تكوين الكود المحدد هو كما يلي:
تعديل ملفات POM وتقديم تبعيات Eureka
<!-إدخال تبعيات Eureka-> <redency> <roupiD> org.springframework.cloud </groupid> <Stifactid> spring-cloud-starter-eureka </stifactid> </sperence>
تعديل ملف تكوين Application.Properties
server.port = 5555spring.application.name = api-gatewayzuul.routes.api-a.path =/API-A/** Zuul.Routes.API-A.ServiceId = hello-serviceeureka.client.service-url.defaultzone = http: // localhost: 1111/eureka
ملاحظة: يمكن أيضًا تنفيذ Zuul.Routes.API-A.URL = خدمة Hello-Service ، ولكن لا يمكنها إجراء موازنة التحميل العادية والحماية التي تتحمل الأخطاء.
اختبار ، تفضل بزيارة http: // localhost: 5555/api-a/hello
كان الوصول ناجحًا.
3. القواعد الافتراضية لتوجيه الخدمة
في الطرق الموجهة للخدمة ، نظرًا لأن الاسم <Roude> يكون تعسفيًا ، هل هذا ممكن:
Zuul.Routes.hello-service.path =/hello-service/** zuul.routes.hello-service.serviceid = hello-service
<Roude> الاسم هو اسم الخدمة. في الواقع ، في التطبيقات الفعلية ، غالبًا ما نسميها بهذه الطريقة. إذا كانت هناك مثل هذه القواعد ، يمكن أن تساعدنا Zuul في تنفيذ هذه الوظائف افتراضيًا ، مما يزيد من توفير مشكلة التكوين.
دعنا نقوم بتجربة ونغير ملف التكوين إلى:
server.port = 5555spring.application.name = api-gatewayeureka.client.service-url.defaultzone = http: // localhost: 1111/eureka
ثم التحقق من الوصول إلى الصفحة
كان الوصول ناجحًا.
ومع ذلك ، بشكل افتراضي ، سيتم توجيه الخدمات الموجودة على Eureka بواسطة Zuul إنشاء علاقات رسم الخرائط الافتراضية ، بحيث يتم أيضًا الوصول إلى الخدمات التي لا نريد أن نكون مفتوحين للعالم الخارجي خارجيًا. في هذا الوقت ، يمكننا تكوين القواعد التي لا تتطلب إنشاء توجيه تلقائي بواسطة Zuul.Unored-Services. عندما zuul.ignored-services =*، لن تنشئ جميع الخدمات تلقائيًا قواعد التوجيه. في هذا الوقت ، يجب تنفيذ تكوين التوجيه ذي الصلة من خلال التكوين السابق.
==================== GOODOUS DISIDID LINE ========================
لقد قيل الكثير من قبل ، جميعها تدور حول مشكلة واحدة: قواعد التوجيه وقضايا صيانة مثيل الخدمة. إذن كيف تحل المشكلة الثانية (التحقق من مشكلة التكرار)؟
4. طلب التصفية
من أجل التحقق من طلبات العميل في بوابة API ، يمكننا استخدام المرشحات لاعتراض وتصفية طلبات. طريقة التنفيذ بسيطة نسبيا. تحتاج فقط إلى ورث فئة Zuulfilter Abstract وتنفيذ أساليبها الأربع.
تعديل API-Gateway:
إضافة فئة المرشح
/*** ورث Zuulfilter وتنفيذ واجهات 4** لتصفية الطلب**/الفئة العامة AccessFilter يمتد zuulfilter {logger logger = loggerfactory.getLogger (AccessFilter.Class) ؛ / * * يجب أن يحدد Filter ما إذا كان يجب تنفيذ المرشح * * إرجاع صحيح هنا ، مما يشير إلى أن المرشح سوف يسري على جميع الطلبات. * في الاستخدام الفعلي ، يمكننا استخدام هذه الوظيفة لتحديد النطاق الفعال للمرشح*/ Override boolean shouldfilter () {return true ؛ } /** منطق محدد للمرشح** هنا نطلب من Zuul طلبه عبر ctx.setsendzuulresponse (false) ولا نقوم بتوجيهه* ثم قمنا بتعيين رمز الخطأ الذي تم إرجاعه من خلال ctx.setResPonsStaTusCod httpservletrequest request = context.getRequest () ؛ Object AccessToken = request.getParameter ("AccessToken") ؛ logger.info ("إرسال {} طلب إلى {}" ، request.getMethod () ، request.getRequesturl (). toString ()) ؛ if (AccessToken == null) {context.setsendzuulResponse (false) ؛ context.setResponsestatuscode (401) ؛ } إرجاع فارغ ؛ } /* filterType إرجاع نوع المرشح* يحدد دورة الحياة التي يتم تنفيذ المرشح فيها. ويتم تعريف هذا على أنه مسبق ، مما يعني أنه سيتم تنفيذ الطلب قبل توجيهه. * * Pre: تصفية قبل تطبيق الطلب * المسار: معالجة الطلب والمسار * المنشور: يتم تنفيذ التصفية بعد اكتمال المعالجة بعد الطلب * خطأ: مرشح تنفيذ عند حدوث خطأ */ Override Public String FilterType () {return "pre" ؛ } / * * filterorder إرجاع ترتيب تنفيذ المرشح * * عندما يكون للطلب مرشحات متعددة في مرحلة واحدة ، من الضروري تنفيذها مرة واحدة بناءً على قيمة إرجاع الطريقة * * / Override Public Int Filterorder () {return 0 ؛ }}تعديل فئة بدء التشغيل
/*** enablezuulproxy تمكين وظيفة خدمة بوابة API Zuul**/ @enablezuulproxy @springcloudapplicationpublication class gatewayapp {// the bean تتم إضافة لتطبيق @bean public AccessFilter () {return new Accessfilter () ؛ } public static void main (string [] args) {springapplication.run (gatewayapp.class ، args) ؛ }}امتحان
) زيارة http: // localhost: 5555/hello-service/hello ، فشل الوصول
) زيارة http: // localhost: 5555/hello-service/hello؟ AccessToken = token ، الوصول بشكل طبيعي
بنية الكود المعدلة:
5. توسيع وتمديد
في الواقع ، عندما يتم تشغيل وظيفة التوجيه فعليًا ، يتم إجراء تعيين التوجيه وطلب التوجيه بواسطة عدة مرشحات مختلفة.
يتم إكمال تعيين التوجيه بشكل أساسي من خلال مرشحات ما قبل النوع ، والذي يطابق مسار الطلب مع قواعد التوجيه التي تم تكوينها ويجد العنوان المستهدف الذي يحتاج إلى إعادة توجيهه.
يتم الانتهاء من جزء إعادة توجيه الطلب بواسطة مرشح الطريق ، والذي يقوم بإعادة توجيه عنوان المسار الذي تم الحصول عليه بواسطة مرشح ما قبل النوع.
لذلك ، يمكن القول أن المرشحات هي العنصر الأساسي في وظيفة بوابة API الخاصة بـ Zuul. سيتم الرد على كل طلب HTTP الذي يدخل Zuul من خلال سلسلة من سلاسل معالجة المرشحات وإعادته إلى العميل.
لخص
ما سبق هو مشكلة استخدام Zuul لتنفيذ خدمة بوابة API في Spring Cloud. آمل أن يكون ذلك مفيدًا للجميع. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر على الجميع في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!