Рабочий процесс шлюза Spring Cloud
В первом опыте Spring Cloud Gateway в предыдущей статье у вас уже было предварительное представление о функциях Spring Cloud Gateway. Как вход системного трафика шлюз играет ключевую роль. Обычные функции следующие:
- Преобразование протокола, перенаправление маршрутизации
- Агрегация трафика, мониторинг трафика, вывод журнала
- Являясь интерфейсной частью всей системы, он контролирует поток и ограничивает его.
- В качестве внешней границы системы внешний трафик может получить доступ к системе только через шлюз.
- Разрешения могут оцениваться на уровне шлюза
- Может кэшироваться на уровне шлюза
Как шлюз второго поколения среды Spring Cloud, Spring Cloud Gateway обладает большей функциональностью, чем Zuul, и имеет лучшую производительность. С итерацией версий Spring Cloud Spring Cloud официально намерен отказаться от поддержки Zuul. С точки зрения использования и функции, которую автор называет Spring Cloud Gateway, стоимость замены Zuul на Spring Cloud Gateway очень низка, и его можно переключать практически без проблем. Spring Cloud Gateway содержит почти все функции zuul.
Примечание: изображение взято с официального сайта.
Как показано выше, клиент делает запрос к Spring Cloud Gateway. Если сопоставление обработчика шлюза определяет, что запрос соответствует маршруту (в это время используется предикат), он отправляется веб-обработчику шлюза для обработки. Веб-обработчики шлюза проходят серию цепочек фильтров при обработке запросов. Причина, по которой цепочка фильтров разделена пунктирной линией, заключается в том, что цепочка фильтров может выполнять логику фильтрации до или после отправки прокси-запроса. Вся «предварительная» логика фильтрации выполняется перед проксированием запроса. После того, как прокси-запрос сделан, логика фильтра «post» выполняется после получения ответа от прокси-службы. Это очень похоже на процесс обработки zuul. При выполнении всей «предварительной» логики фильтров часто выполняются такие функции, как аутентификация, ограничение тока, вывод журнала и т. д., а также изменение заголовка запроса и преобразование протокола, после пересылки и получения ответа все «пост»-фильтры будут выполняться. Логика, в которой могут быть изменены данные ответа, такие как заголовки ответа, преобразование протокола и т. д.
В описанном выше процессе обработки важным моментом является сопоставление запросов и маршрутов, в это время необходим предикат, определяющий, по какому маршруту пойдет запрос.
Введение в предикат
Предикат исходит из интерфейса java8. Предикат Принимает один входной параметр и возвращает логический результат. Этот интерфейс содержит несколько методов по умолчанию для объединения предикатов в другую сложную логику (например: И, ИЛИ, НЕ). Его можно использовать для проверки параметров запроса интерфейса и для определения того, изменились ли новые и старые данные и нуждаются ли они в обновлении. добавить - и, или - или, отрицать - нет.
Spring Cloud Gateway имеет множество встроенных прогнозов. Исходный код этих прогнозов находится в пакете org.springframework.cloud.gateway.handler.predicate. Читатели могут прочитать их, если им интересно. Теперь перечислите различные предикаты, как показано ниже:
Примечание: картинка взята из интернета
На приведенном выше рисунке представлено множество типов предикатов, например предикат типа времени (AfterRoutePredicateFactory BeforeRoutePredicateFactory BetweenRoutePredicateFactory), когда в этот предикат попадают только запросы, отвечающие определенным временным требованиям, которые передают его маршрутизатору для обработки; CookieRoutePredicateFactory типа cookie , указать Если cookie удовлетворяет регулярному сопоставлению, он войдет в этот маршрутизатор; и предикаты типа host, method, path, querparam, remoteaddr, каждый предикат будет судить о текущем клиентском запросе, соответствует ли он текущим требованиям, и если да , отправьте Обработать текущий запрос. Если имеется несколько предикатов и запрос удовлетворяет нескольким предикатам, первый из них вступит в силу в порядке настройки.
предикат в действии
Теперь я объясню предикат в виде кейсов.Кейсы в этой статье в основном из официальных документов.Официальный адрес документа: http://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.0 .0.RELEASE /single/spring-cloud-gateway.html ; если у вас есть какие-либо вопросы, свяжитесь со мной и обсудите со мной.
Создайте проект и импортируйте Spring Cloud Gateway в pom-файл проекта. Стартер зависит от spring-cloud-starter-gateway, версии Spring Cloud и версии Spring Boot. Код выглядит следующим образом:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
After Route Predicate Factory
AfterRoutePredicateFactory, время может быть настроено.Когда время запроса превышает настроенное время, оно передается маршрутизатору для обработки. В противном случае будет сообщено об ошибке и маршрут не будет пройден.
Конфигурация application.yml в проекте выглядит следующим образом:
server:
port: 8081
spring:
profiles:
active: after_route
---
spring:
cloud:
gateway:
routes:
- id: after_route
uri: http://httpbin.org:80/get
predicates:
- After=2017-01-20T17:42:47.789-07:00[America/Denver]
profiles: after_route
В приведенном выше файле конфигурации порт службы настроен как 8081, а конфигурация spring.profiles.active:after_route указывает, что файлом запуска программы spring является файл after_route. Создайте еще один файл конфигурации в application.yml. Синтаксис — три горизонтальные строки. В этом файле конфигурации используйте spring.profiles для настройки имени файла, соответствующего spring.profiles.active, а затем настройте конфигурацию, связанную с Spring Cloud Gateway, Конфигурация тега id Идентификатор — это идентификатор маршрутизатора. Каждому маршрутизатору требуется уникальный идентификатор. Конфигурация uri — это место, куда направляется запрос. В этом случае все маршруты направляются на http://httpbin.org:80/get.
предикаты: After=2017-01-20T17:42:47.789-07:00[Америка/Денвер] будут проанализированы в объект PredicateDefinition (имя =After, args= 2017-01-20T17:42:47.789-07:00[ Америка/Денвер]). Здесь следует отметить, что конфигурация предикатов After соответствует идее контракта, большего, чем конфигурация, и на самом деле обрабатывается классом AfterRoutePredicateFactory, который является шлюзом, который его определяет. Класс веб-обработчика — AfterRoutePredicateFactory Аналогичным образом другие типы предикатов также следуют этому правилу.
Когда время запроса превышает это настроенное время, запрос будет перенаправлен на http://httpbin.org:80/get.
Запустите проект, посетите http://localhost:8081/ в браузере, и отобразится результат, возвращенный http://httpbin.org:80/get.В это время шлюз перенаправляется на настроенный uri. Если мы установим настроенное время после текущего времени, браузер отобразит 404, что доказывает, что маршрут к настроенному uri отсутствует.
Предикаты, связанные со временем, включают «До фабрики предикатов маршрутов» и «Между фабриками предикатов маршрутов». Читатели могут самостоятельно обращаться к официальным документам и не будут демонстрировать их снова.
Header Route Predicate Factory
Header Route Predicate Factory требует 2 параметра: один — имя заголовка, а другой — значение заголовка, которое может быть регулярным выражением. Когда утверждение совпадает с именем заголовка и значением запроса, утверждение проходит и входит в правила маршрутизатора.
Добавьте следующую конфигурацию в файл конфигурации проекта:
spring:
profiles:
active: header_route
---
spring:
cloud:
gateway:
routes:
- id: header_route
uri: http://httpbin.org:80/get
predicates:
- Header=X-Request-Id, \d+
profiles: header_route
В приведенной выше конфигурации, когда заголовок запроса содержит имя заголовка X-Request-Id, а значение заголовка является числом, запрос будет перенаправлен на настроенный uri.Используйте curl для выполнения следующей команды:
$ curl -H 'X-Request-Id:1' localhost:8081
После выполнения команды результат запроса будет возвращен корректно, а результат пропущен. Если имя заголовка X-Request-Id не включено в запрос, а значение не является числом, запрос сообщит об ошибке 404, а маршрут не был переадресован правильно.
Cookie Route Predicate Factory
Cookie Route Predicate Factory требует два параметра: один — это имя файла cookie, а другой — значение, которое может быть регулярным выражением. Он используется для сопоставления запросов с файлом cookie с таким именем и файлом cookie, соответствующим регулярному выражению.
Добавьте следующую конфигурацию в файл конфигурации:
spring:
profiles:
active: cookie_route
---
spring:
cloud:
gateway:
routes:
- id: cookie_route
uri: http://httpbin.org:80/get
predicates:
- Cookie=name, forezp
profiles: cookie_route
В приведенной выше конфигурации запросы с именем файла cookie и значением файла cookie forezp будут перенаправлены на адрес с uri http://httpbin.org:80/get. Используйте команду curl, чтобы сделать запрос и внести в запрос файл cookie, он вернет правильный результат, в противном случае запрос сообщит об ошибке 404.
$ curl -H 'Cookie:name=forezp' localhost:8081
Host Route Predicate Factory
Host Route Predicate Factory требует параметр, имя хоста, который может использовать .* и т. д. для соответствия хосту. Этот параметр будет соответствовать значению host в заголовке запроса, если они совпадают, то запрос будет переадресован корректно.
В файле конфигурации проекта добавьте следующую конфигурацию:
spring:
profiles:
active: host_route
---
spring:
cloud:
gateway:
routes:
- id: host_route
uri: http://httpbin.org:80/get
predicates:
- Host=**.fangzhipeng.com
profiles: host_route
В приведенной выше конфигурации запрос с хостом как fangzhipeng.com в заголовке запроса будет перенаправлен на настроенный uri путем маршрутизации. Запустите проект, выполните следующую команду curl, запрос вернет правильный результат запроса:
curl -H 'Host:www.fangzhipeng.com' localhost:8081
Method Route Predicate Factory
Для фабрики предикатов маршрута метода требуется один параметр — тип запроса. Например, на этот маршрут перенаправляются запросы типа GET. Добавьте следующую конфигурацию в файл конфигурации проекта:
spring:
profiles:
active: method_route
---
spring:
cloud:
gateway:
routes:
- id: method_route
uri: http://httpbin.org:80/get
predicates:
- Method=GET
profiles: method_route
В приведенной выше конфигурации все запросы типа GET будут направляться на настроенный uri. Использование команды curl для имитации запроса типа get позволит получить правильный возвращаемый результат.
$ curl localhost:8081
Используйте команду curl, чтобы имитировать почтовый запрос и вернуть результат 404.
$ curl -XPOST localhost:8081
Path Route Predicate Factory
Фабрика предикатов Path Route принимает один параметр: выражение написания для применения соответствующего пути.
В файле конфигурации проекта application.yml выполните следующую настройку:
spring:
profiles:
active: path_route
---
spring:
cloud:
gateway:
routes:
- id: path_route
uri: http://httpbin.org:80/get
predicates:
- Path=/foo/{segment}
profiles: path_route
В приведенной выше конфигурации все запросы, путь которых соответствует /foo/{segment}, будут сопоставлены и перенаправлены. Например, запросы для /foo/1 и /foo/bar будут сопоставлены и успешно переадресованы.
Используйте curl для имитации запроса к localhost:8081/foo/dew, и после выполнения будет возвращен правильный результат запроса.
$ curl localhost:8081/foo/dew
Query Route Predicate Factory
Фабрика предикатов маршрута запроса принимает 2 параметра: имя параметра и регулярное выражение для значения параметра. Выполните следующую настройку в файле конфигурации проекта application.yml:
spring:
profiles:
active: query_route
---
spring:
cloud:
gateway:
routes:
- id: query_route
uri: http://httpbin.org:80/get
predicates:
- Query=foo, ba.
profiles: query_route
В приведенном выше файле конфигурации, если запрос содержит параметр foo, а значение foo соответствует ba.
Команда для имитации запроса выглядит следующим образом:
$ curl localhost:8081?foo=bar
Query Route Predicate Factory также может заполнять только один параметр, при заполнении одного параметра сопоставляется только имя параметра, то есть запрашиваемый параметр содержит настроенное имя параметра, и маршрут попадает. Например, в следующей конфигурации настраивается параметр с именем foo в параметре запроса, и запрос будет перенаправлен на uri как http://httpbin.org:80/get.
spring:
cloud:
gateway:
routes:
- id: query_route
uri: http://httpbin.org:80/get
predicates:
- Query=foo
profiles: query_route
Суммировать
В этой статье я сначала расскажу о рабочем процессе и принципах Spring Cloud Gateway, затем представлю встроенную структуру прогнозирования шлюза и ее классификацию и, наконец, сосредоточусь на нескольких важных прогнозах в виде случаев. Predict — это утверждение, которое определяет, на какой маршрутизатор будет направлен запрос. После утверждения запрос будет введен в логику фильтра.В следующей статье вы познакомитесь с содержимым, связанным с фильтром Spring Cloud Gateway.
использованная литература
http://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.0.0.RELEASE/single/spring-cloud-gateway.html
https://www.jianshu.com/p/35b60946b8ce
https://www.jianshu.com/p/03d42105f81f
Загрузка исходного кода
https://github.com/forezp/SpringCloudLearning/tree/master/sc-f-gateway-predicate
Добро пожаловать, чтобы обратить внимание на мой общедоступный номер
Отсканируйте код и подпишитесь на общедоступную учетную запись, чтобы получить сюрприз
(Просьба указывать автора и источник при перепечатке статей с этого сайтаБлог Фан Чжипэна)
Данная статья является [оригинальной] статьей, при перепечатке просьба указывать источник.
Ссылка на эту статью: https://www.fangzhipeng.com/springcloud/2018/12/05/sc-f-gateway2/
Эта статья взята изБлог Фан Чжипэна