Зачем вам ворота?
Мы знаем, что хотим ввести саму услугу, и очевидно, что у нас нет особенно хорошего метода. Мы напрямую вводим IP -адрес + номер порта. Мы знаем, что этот подход очень плохой. Есть большая проблема с этим подходом. Во -первых, это раскрывает IP -адрес нашей физической машины. Когда другие смотрят на ваш IP -адрес, они знают, где развертывается сервис, что позволяет другим очень удобно проводить операции атаки.
Во -вторых, у нас так много услуг, мы должны называть их один за другим? Давайте предположим, что мы сделали аутентификацию разрешения, и каждый из наших клиентов обращается к программам обслуживания на разных JVM, работающих на разных машинах. Каждому из наших услуг нужна аутентификация услуг. Это раздражает? Это, очевидно, очень раздражает.
Тогда мы сталкиваемся с этими двумя и их общими проблемами в это время, и нам нужен способ их решить. Прежде всего, давайте посмотрим на экспозицию IP-адреса и проблему с одной точкой, вызванную написанием IP-адреса после смерти. Нужно ли мне также динамически поддерживать список услуг для такой услуги? Мне нужно назвать саму эту услугу, мне также нужна балансировка нагрузки?
Есть также вещи в экспозиции IP -адреса. Нужно ли мне быть прокси, например, обратный прокси Nginx, и есть также вещи, которые развертывают общественные модули на этой вещи, такие как проверка разрешений для всех порталов. Итак, теперь нам нужен Zuul API Gateway. Это решает вышеупомянутую проблему. Если вы хотите позвонить в определенный сервис, он нанесет на карту IP -адрес вашего сервиса в
Если вы войдете в путь, он соответствует ему, и он будет получить доступ к вам службу. У него будет процесс пересылки запроса. Как и NGINX, конкретная сила экземпляра служб -машины, он не будет напрямую доступ к IP, он перейдет в Центр регистрации Eureka, чтобы получить идентификатор экземпляра службы, то есть имя службы. Я использовал ленту балансировки нагрузки клиента, чтобы снова получить доступ к одному из экземпляров службы.
Шлюз API в основном используется для решения проблемы внешних вызовов самой службой и для решения проблемы проверки разрешения. Вы можете интегрировать и вызвать здесь серию фильтров, таких как интеграция Shiro, Springsecurity и другие вещи.
Zuul может загрузить механизм динамической фильтрации для достижения следующих функций:
1. Проверка и безопасность: определить требования к проверке для различных ресурсов и отклонить запросы, которые не соответствуют требованиям.
2. Обзор и мониторинг: отслеживайте значимые данные и статистические результаты в местах Edge, что приводит к тому, что мы точные выводы о статусе производства.
3. Динамическая маршрутизация: запросы маршрута в различные бэкэнд -кластеры динамически по мере необходимости.
4. Стресс -тест: постепенно увеличивайте поток нагрузки в кластер для расчета уровня производительности.
5. Распределение загрузки: назначьте соответствующую емкость каждому типу нагрузки и установите запросы, которые превышают предельное значение.
6. Обработка статического отклика: создайте частичные ответы непосредственно в местах краев, чтобы они не проникли во внутренний кластер.
7. Многорегионный эластичность: маршрутизация запроса в регионах AWS предназначена для достижения диверсифицированного использования ELB и обеспечения того, чтобы местоположения были максимально близки к пользователям.
Затем перейдите к маленькой демонстрации
Первым шагом является создание нового модуля Zuul в соответствии с оригинальным проектом и внедрить зависимости. Код заключается в следующем:
<Depected> <groupid> org.springframework.cloud </GroupId> <ArtifactId> Spring-Cloud-Starter-eureka </artifactid> <sersive> 1.3.5.Release </version> </repertive> <Dependency> <groupId> org.springframework.cloud </GroupId> <restifactId> <groupD> <версия> 1.3.5.reelease </version> </depervice>
Затем введите аннотацию @enablezuulproxy в классе запуска, и код заключается в следующем:
Сервер: Порт: 5000Spring: Приложение: Имя: Api-Getewayzuul: Маршруты: #Identify Имя вашего Сервиса, которое можно определить сами здесь. Вообще говоря, удобство и спецификации такие же, как и название вашего сервиса Hello-Service:#Путь сопоставления услуг, через этот путь вы можете получить доступ к вашему сервису снаружи. Цель состоит в том, чтобы избежать разоблачения IP-адреса вашей машины и маршрута, ориентированного на обслуживание, и выбирать доступный для вас. # Где-то, Zuul автоматически зависит от Hystrix и ленты, а не для автономного пути: /hello-service /**# Это должно быть название Сервиса в вашем центре регистрации Eureka. Следовательно, ServiceID настроен здесь, потому что он в сочетании с Eureka. Если вы используете Zuul в одиночку, вы должны написать IP на своей собственной машине. #такой как URL: http: // localhost: 8080/Это недостаточно, чтобы написать IP Dead. Если этот IP не удается, и это высокая доступность, набор регистрации услуг не будет использоваться. ServiceId: Hello-Serviceeeureka: #Client: #Registration Center Adder Service-Url: defaultzone: http: // localhost: 8888/eureka/, http: // localhost: 8889/eureka/
Затем запустите реестр и два поставщика услуг Hello-Service в предыдущей статье. Затем мы запускаем его и рассмотрим его функцию пересылки запроса, чтобы увидеть, опросит ли это в двух услугах.
Введите Localhost: 5000/Hello-Service/Hello, следующим образом:
Затем снова обновитесь:
Вы можете видеть, что Zuul сделал запрос на его распространение. Он сопоставлен с конкретной машиной на основе вашего имени службы Hello-Servie. Разве это не функция обратного прокси?
Zuul также может выполнять фильтрацию запросов, поэтому давайте выполним проверку токенов, чтобы продемонстрировать. Во -первых, нам нужно создать новый класс TokenFilter, чтобы наследовать класс Zuulfilter и реализовать его четыре интерфейса. Код заключается в следующем:
пакет hjc.zuul; import com.netflix.zuul.zuulfilter; import com.netflix.zuul.context.requestcontext; import javax.servlet.http.httpservletrequest;/*** Создан Cong на 2018/5/18. */Public Class TokenFilter Extends Zuulfilter {// Четыре типа: pre, маршрутизация, ошибка, post // pre: он в основном используется на этапе сопоставления маршрутизации, чтобы найти таблицу картирования маршрутизации // маршрутизация: конкретный фильтр перенаправления маршрутизации находится на маршрутизации. При пересылке конкретного запроса он будет вызван // Ошибка: как только произойдет предыдущая ошибка фильтра, будет вызван фильтр ошибки. // post: этот фильтр не будет вызван после того, как маршрутизация и ошибка будет завершена. Это @Override public String filterType () {return "pre"; } // Настроить порядок выполнения фильтров. Чем больше значение, тем более позднее выполнение. Чем меньше значение, тем больше оно выполняется, тем больше оно выполняется в первую очередь. @Override public int filterorder () {return 0; } // контролировать фильтр, чтобы вступить в силу или нет. Вы можете написать строку логики, чтобы управлять @override public boolean shopfilter () {return true; } // Выполнить логику фильтра @Override public Object run () {requestContext context = requestContext.getCurrentContext (); Httpservletrequest request = context.getRequest (); String token = request.getParameter ("token"); if (token == null) {context.setsendzuulresponse (false); Context.SetResponsEStatUscode (401); context.setResponsebody ("unautrized"); вернуть ноль; } return null; }}FilterType: возвращает строку, представляющую тип фильтра. Четыре типа фильтров с разными жизненными циклами определены в Zuul, следующим образом:
1. pre : это может быть вызвано до маршрутизации запроса. Он используется для поиска таблицы отображения маршрутизации на этапе картирования маршрутизации.
2.route : вызывается во время запроса маршрутизации. Конкретный фильтр пересылки маршрутизации будет вызван при маршрутизации конкретной переадресации запроса маршрутизатора.
3. error : вызывается, когда возникает ошибка при обработке запроса
4. post : Фильтр не будет вызван после завершения маршрутизации и ошибки, что находится на последнем этапе.
Здесь мы объявляем исключение, которое происходит, когда Zuul Filter выполняет сетевой запрос. Исключение, пойманное Try-Catch, не может быть непосредственно брошено на страницу в фильтре. Исключение, добавленное приложением, может быть возвращено на страницу с помощью метода context.set () в подъеме. следующее:
try {Business Logic ...} catch (Exception e) {requestContext context = requestContext.getCurrentContext (); context.set ("error.status_code", 401); context.set ("error.exception", e); context.set ("error.message", "sfdfsdf");}Затем вам нужно добавить этот фильтр в пружину и позволить пружине управлять им. Код заключается в следующем:
Пакет HJC; импорт hjc.zuul.tokenfilter; import org.springframework.boot.springapplication; import org.springframework.boot.autoconfigure.springbootpplication; import.springframework.cloud.netflix.zuul.enablezuulproxy; org.springframework.context.annotation.bean;@SpringbootApplication@enableSuulProxyPublic Class Zuulapplication {public static void main (string [] args) {SpressApplication.run (Zuulapplication.class, args); } // Оставьте фильтр на руководство Spring @bean public tokenfilter tokenfilter () {return new tokenfilter (); }}Далее, давайте начнем класс запуска и первый доступ без токенов следующим образом:
Вы можете видеть, что сообщение без разрешения возвращается. Здесь я хочу сказать, что токены обычно помещаются в заголовок запроса. Здесь мы не делаем этого для демонстрационных целей.
Затем возьмите жетон и посетите его следующим образом:
Вы можете видеть, что наш запрос был отправлен.
Здесь я расскажу о том, что такое маршрут по умолчанию, и удалю конфигурацию Zuul следующим образом:
Сервер: Порт: 5000Spring: Приложение: Имя: API-GetewayEureka: #Client Client: #Register Center Adder Service-Eurl: defaultzone: http: // localhost: 8888/eureka/, http: // localhost: 8889/eureka/, http: // localhost: 8889/eureka/, http: // localhost: 8889/eureka/, http: // loc
Затем перезапустите и продолжайте доступ, следующим образом:
В
Вы можете видеть, что мы все еще можем продолжать доступ. Нам нечего делать, но мы все еще можем получить к нему доступ. Это потому, что по умолчанию вы автоматически объявлены с помощью имени службы Hello-Service.
Итак, если я не хочу, чтобы он автоматически объявил об этом для меня, и я хочу определить его сам, то я могу использовать Zuu.ignored-Services в файле конфигурации YML, чтобы фильтровать его, как фильтрация, следующим образом: »
Zuul:#если игнорируемые услуги:* означает, что все маршруты по умолчанию истек. Вы должны соответствовать им один за другим. Никто не будет так трахнут, если только вы не столкнетесь с странным бизнесом, игнорируемыми услугами:
Давайте поговорим о правилах отображения, например,
Zuul: Маршруты: #Identify название вашего сервиса, вы можете определить его сами здесь. Вообще говоря, удобство и спецификации совпадают с названием вашей службы Hello-Service: #Service Mappice Path, через этот путь, вы можете получить доступ к вашему сервису снаружи. Цель состоит в том, чтобы избежать разоблачения IP-адреса вашей машины, а маршрут, ориентированный на обслуживание для вас. #Shere Zuul автоматически зависит от Hystrix и ленты, а не для автономного пути: /hello-service /**#Это должно быть название вашей службы регистрационного центра Eureka, поэтому ServiceID настроен здесь, потому что он сочетается с Eureka. Если вы используете Zuul в одиночку, вы должны написать IP вашей машины, #такой как URL: http: // localhost: 8080/Это плохо, это означает написание IP Dead. Если этот IP не стерт и высокую доступность, набор регистрации услуг не будет использоваться ServiceId: Hello-servicezuul: Маршруты: Hello-Service: Path:/hello-service/ext/** serviceId: hello-service
Два пути сопоставления конфигурации Zuul здесь имеют /hello-service /. Вы можете увидеть, что/hello-service/** включает/hello-service/ext/**. Есть ли конфликты при сопоставлении этих двух путей? Как с этим справиться? Кто первым будет соответствовать?
Вот порядок, определенный в YML, чтобы соответствовать. Если это файл конфигурации в формате Application.properties, этот заказ не может быть гарантирован. Файлы конфигурации в формате YML находятся в последовательности, что может быть гарантировано. Обратите внимание на это здесь.
Что если мы хотим определить правило соответствующего? Затем нам нужно определить боб в классе стартапов, который определяет ваш маршрут следующим образом:
Я не буду демонстрировать это здесь. Когда вам это нужно, идите и ищите информацию медленно.
Также есть игнорирование-паттерны: следующим образом:
Zuul: Маршруты: #Identify название вашего сервиса, вы можете определить его сами здесь. Вообще говоря, удобство и спецификации совпадают с названием вашей службы Hello-Service: #Service Mappice Path, через этот путь, вы можете получить доступ к вашему сервису снаружи. Цель состоит в том, чтобы избежать разоблачения IP-адреса вашей машины, а маршрут, ориентированный на обслуживание для вас. #Shere Zuul автоматически зависит от Hystrix и ленты, а не для автономного пути: /hello-service /**#Это должно быть название вашей службы регистрационного центра Eureka, поэтому ServiceID настроен здесь, потому что он сочетается с Eureka. Если вы используете Zuul в одиночку, вы должны написать IP своей машины, #такой как URL: http: // localhost: 8080/Это плохо, это означает написание мертвого IP. Если этот IP не работает и высокая доступность, набор регистрации услуг не будет использоваться ServiceId: Hello-Service игнорируемые patterns: /hello /**
Игнорировать-паттерны: указывает, что путь /hello /** заблокирован. Даже если вы/hello-service/hello/** невозможно, вы все равно блокируете его. Мы можем дополнительно уточнить эту конфигурацию. Например, если я не хочу направлять интерфейс /hello, то мы можем настроить его, как указано выше
Что если мы также хотим настроить префикс службы? Код заключается в следующем:
Zuul: Маршруты: #Identify название вашего сервиса, вы можете определить его сами здесь. Вообще говоря, удобство и спецификации совпадают с названием вашей службы Hello-Service: #Service Mappice Path, через этот путь, вы можете получить доступ к вашему сервису снаружи. Цель состоит в том, чтобы избежать разоблачения IP-адреса вашей машины, а маршрут, ориентированный на обслуживание для вас. #Shere Zuul автоматически зависит от Hystrix и ленты, а не для автономного пути: /hello-service /**#Это должно быть название вашей службы регистрационного центра Eureka, поэтому ServiceID настроен здесь, потому что он сочетается с Eureka. Если вы используете Zuul в одиночку, вы должны написать IP вашей машины, #такой как URL: http: // localhost: 8080/Это недостаточно, чтобы написать мертвый IP. Если этот IP не работает и высокая доступность, набор регистрации услуг не будет использоваться ServiceId: Hello-Service Prefix: /API /**
Вы можете видеть, что услуги, которые вы посещаете, должны быть предварительно профиксированы с/api/, например,/api/hello-service/**
Что мы должны делать, если мы хотим прыгнуть в мою местность, если хотим сделать доступ к пути?
Я надеюсь, что пользователь может автоматически перейти к этому методу при доступе /локальном. Таким образом, в настоящее время нам нужно использовать локальный прыжок Zuul, а метод конфигурации выглядит следующим образом:
zuul: prefix:/api игнорируемые patterns:/**/hello/** Маршруты: локальный: path:/hello-service/** url: вперед:/local
Некоторые из широко используемых, соединяющихся с Springsecurity или некоторыми сторонними компонентами, получат некоторую информацию о ваших файлах cookie. Таким образом, Zuul Gateway убил всю информацию о вашем файле cookie по соображениям безопасности, и нет способа сделать файлы cookie. Это убито по умолчанию.
Здесь Zuul предоставляет Zuul.Sentive Headers, чтобы сделать эти файлы cookie и заголовки для вас, и не фильтруйте эту информацию. Контролировать свою конфиденциальную информацию.
По умолчанию информация о конфиденциальной заголовке не может быть передана через шлюз API. Мы можем сделать его проходимым через следующую конфигурацию:
Zuul: Маршруты: Hello-Service: Path: /Hello-Service /** ServiceId: Hello-Service чувствительные головы: cookie, заголовок и другие вещи
Его также можно использовать с некоторыми подробными конфигурациями Hystrix, как упоминалось ранее. Я не буду говорить об этом здесь
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.