Прогноз Spring Cloud Gateway

задняя часть Spring Curl регулярное выражение

Рабочий процесс шлюза 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, а другой — значение, которое может быть регулярным выражением. Он используется для сопоставления запросов с файлом 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/
Эта статья взята изБлог Фан Чжипэна
阿里云1023 腾讯云1023