Благодаря предыдущему обмену мы узнали о нескольких основных объектах архитектуры микросервиса, благодаря этим компонентам мы можем построить простую систему архитектуры микросервиса. Например, создайте высокодоступный центр регистрации услуг через Spring Cloud Eureka и реализуйте регистрацию и обнаружение услуг;
Балансировать нагрузку с пружинной облачной лентой или притворством; Сервисная защита от неисправности с помощью Spring Cloud Hystrix, чтобы избежать распределения сбоев. После того, как микросервис будет построен, мы обязательно предоставим некоторый унифицированный интерфейс сервиса API Restful для внешней системы для вызова.
Но когда внешняя система вызывает наш Restful API, как вы определяете, какой сервис необходим для предоставления конкретных функций, которые он требует? Это включает в себя обслуживание правил маршрутизации и списков экземпляров обслуживания.
Это представляет нашего главного героя сегодня - Spring Cloud Zuul, который является компонентом API Gateway, основанной на реализации Netflix Zuul. Это может решить две основные проблемы:
Хорошо, давайте посмотрим, как реализовать эту службу шлюза.
1. Создайте шлюз и настройте маршрутизацию
Здесь нам все еще нужно использовать предыдущие услуги Hello-Service и Forign-Consumer. Мы привыкли рассматривать Fain-Consumer как потребителя услуг, но не забывайте, что в системе Eureka каждая услуга является как поставщиком услуг, так и потребителем услуг, поэтому Forign-Consumer также является поставщиком услуг, а интерфейсы, такие как HTTP: // Localhost: 9001/Fain-Consumer предоставляют услуги.
Далее мы строим службу шлюза со структурой кода следующим образом:
Шаги реализации кода:
Создать новый Maven Project API-Gateway
Измените файл POM
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd "> <dolidyversion> 4.0.0 </modelversion> <groupid> com.sam </GroupId> <ArtifactId> api-gateway </artifactid> <serse> 0.0.1-snapshot </версия> <parent> <groupId> org.springframework.boot </GroupId> <artifactId> Spring-Boot-Starter-parent </artifactid> <sersive> 1.5.1.Release </version> </parent> <свойства> <Javaversion> 1.8 </javaVersion> </voperties> <!-Использование зависимости для управления версией-> </vosterties> <! <groupId> org.springframework.cloud </GroupId> <artifactId> spring-cloud-зависимости </artifactid> <sersion> camden.sr6 </version> <sype> pom </type> <cerpope> Импорт </scope> </зависимость> </зависимость> </Зависимость> <Зависимость> <! Spring-Boot-Starter-Actuator/Spring-Boot-Starter-Hystrix/Spring-Boot-Starter-Ribbon-> <Depective> <groupid> org.springframework.cloud </GroupId> <straCateD> Spring-Cloud-starter-Zuul </artifactid> </зависимость> </зависимости> </project>
Создать новый класс стартапов
/*** @enablezuulproxy Включить функцию службы API API API API**/@enablezuulproxy@springcloudapplicationpublic class gatewayapp {public static void main (string [] args) {SpringApplication.run (gateway.class, args); }}Создать новое приложение
server.port = 5555spring.application.name = api-gateway#Добавить в конфигурацию правил маршрутизации#настройка через zuul.routes. <Round>-это название маршрута и может быть определенно указано, но названия маршрутов набора путей и URL-адресов должны быть тем же#, что показано в следующем примере: все удовлетворение/API-A/** Доступ к правилам будет направлен на адрес // Localhost: 9001#, то есть, когда мы получаем http: // localhost: 5555555555555 гг. Интерфейс MicroService, предоставленный 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-url = http://localhost: 9090
Тест, старт Эврика, Hello-Service, Fain-Consumer и недавно добавленный сервис API-Gateway, а затем посетите http: // localhost: 5555/api-a/farign-consumer
Успешный доступ к интерфейсу услуг Fain-Consumer-Feign-ConsOnsumer.
Вышеуказанные шаги реализуют конфигурацию традиционной маршрутизации. Эта конфигурация имеет основной недостаток, который состоит в том, что она требует ручной конфигурации правил маршрутизации в файле приложения. Когда будет много услуг, рабочая нагрузка на техническое обслуживание будет очень большой. Чтобы снизить затраты на техническое обслуживание, есть еще один маршрут - ориентированный на обслуживание маршрута.
2. Сервисная ориентированная маршрутизация
Spring Cloud Zuul и Eureka интегрируются, мы можем сделать путь маршрута не конкретные URL -адреса, а конкретные сервисы, а URL -адреса службы автоматически поддерживаются механизмом обнаружения сервисов Eureka. Этот тип маршрута является сервисным маршрутом. Конфигурация конкретной кода заключается в следующем:
Изменить файлы POM и ввести зависимости Eureka
<!-Представление зависимостей Eureka-> <Dependency> <groupId> org.springframework.cloud </GroupId> <ratifactid> Spring-Cloud-Starter-eureka </artifactid> </sepect>
Изменить файл конфигурации Application.properties
server.port = 5555spring.application.name = api-gatewayzuul.routes.api-a.path =/api-a/**# Здесь мы используем ServiceId вместо URL и используем имя службы вместо IP+номер порта 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. Правила по умолчанию для маршрутизации услуг
На маршрутах, ориентированных на обслуживание, так как имя <Маршрут> произвольно, это возможно:
zuul.routes.hello-service.path =/hello-service/** zuul.routes.hello-service.serviceid = hello-service
<Маршрут> Имя - это имя службы. На самом деле, в реальных приложениях мы часто называем это таким образом. Если есть такие правила, Zuul может помочь нам реализовать такие функции по умолчанию, дополнительно сохраняя проблему конфигурации.
Давайте проведем эксперимент и изменим файл конфигурации на:
server.port = 5555spring.application.name = api-gatewayeureka.client.service-url.defaultzone = http: // localhost: 1111/eureka
Затем проверка доступа к странице
Доступ был успешным.
Тем не менее, по умолчанию, услуги на Eureka будут маршрутизированы Zuul, создавая отношения со картинами по умолчанию, так что услуги, которые мы не хотим быть открытыми для внешнего мира, также доступны извне. В настоящее время мы можем настроить правила, которые не требуют автоматического создания маршрутизации с помощью zuul.ignored-services. Когда zuul.ignored-services =*, все службы не будут автоматически создавать правила маршрутизации. В настоящее время соответствующая конфигурация маршрутизации должна быть выполнена через предыдущую конфигурацию.
================== Великолепная разделительная линия ============================
Ранее было сказано, что все вращаются вокруг одной проблемы: правила маршрутизации и вопросы обслуживания экземпляров. Итак, как решить вторую проблему (проверка проблемы избыточности)?
4. Запросить фильтрацию
Чтобы проверить запросы клиентов в шлюзе API, мы можем использовать фильтры для перехвата и фильтров. Метод реализации относительно прост. Вам нужно только унаследовать класс абстрактного класса Zuulfilter и реализовать его четыре метода.
Изменить API-Gateway:
Добавлен класс фильтра
/*** Унаследование Zuulfilter и реализация его 4 интерфейсов** для фильтрации запроса**/public class accessfilter extends zuulfilter {logger logger = loggerfactory.getlogger (accessfilter.class); / * * Должен фильтер определяет, должен ли фильтр быть выполненным * * Вернуть True ЗДЕСЬ, указывая на то, что фильтр вступит в силу для всех запросов. * В фактическом использовании мы можем использовать эту функцию, чтобы указать эффективный диапазон фильтра*/ @Override public boolean shopfilter () {return true; } /** Специальная логика фильтра** Здесь мы просим Zuul запросить через ctx.setsendzuulresponse (false) и не направляем его*, затем мы устанавливаем возвращаемый код ошибки через ctx.setresponseStatatuscode (401)** / @override public run () {requestContext requestContext.getCurrentContext (); Httpservletrequest request = context.getRequest (); Object AccestToken = request.getParameter ("accessToken"); logger.info ("send {} запрос на {}", request.getmethod (), request.getRequesturl (). toString ()); if (accesstoken == null) {context.setsendzuulresponse (false); Context.SetResponsEStatUscode (401); } return null; } /* FilterType Возвращает тип фильтра* Он определяет, в каком жизненном цикле фильтр выполняется. Это определяется как предварительно, что означает, что запрос будет выполнен до его маршрутизации. * * Pre: Filter Proster execution * route: обработать запрос и маршрут * post: фильтр выполнен после завершения обработки запроса * Ошибка: Фильтр выполняется, когда возникает ошибка */ @override public String filtertype () {return "pre"; } / * * Filterorder Возвращает порядок выполнения фильтра * * Когда запрос имеет несколько фильтров на одном этапе, необходимо выполнить его один раз на основе возвращаемого значения метода * * / @Override public int filterorder () {return 0; }}Изменить класс запуска
/*** @EnableSuulProxy Включить функцию службы API Gateway API**/ @enableSuulProxy @SpringCloudApplicationPublic Class GatewayApp {// Бин добавляется в реализацию @bean public AccessFilter 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?
Модифицированная структура кода:
5. расширить и расширить
На самом деле, когда функция маршрутизации фактически работает, его отображение маршрутизации и пересылка запросов выполняются несколькими различными фильтрами.
Картирование маршрутизации в основном завершено через фильтры предварительного типа, что соответствует пути запроса с настроенными правилами маршрутизации и находит целевой адрес, который необходимо пересылать.
Часть пересылки запроса завершается фильтром маршрута, который пересылает адрес маршрута, полученный с помощью фильтра предварительного типа.
Следовательно, фильтры можно сказать, что является наиболее основным компонентом функции шлюза Zuul API. Каждый HTTP -запрос, введенный в Zuul, будет отвечать через серию цепочек обработки фильтров и возвращен клиенту.
Суммировать
Приведенное выше проблема использования Zuul для реализации службы API Gateway в Spring Cloud. Я надеюсь, что это будет полезно для всех. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит всем вовремя. Большое спасибо за вашу поддержку сайту wulin.com!