помещение
В последнее время проводится реконструкция старой системы.После завершения реконструкции в новую систему необходимо внедрить службу шлюза в качестве приспособления и прокси для интерфейса между новой системой и старой системой. Раньше многие шлюзовые приложения использовалиSpring-Cloud-Netfilx
на основеZuul1.x
версия реализована, но учитываяZuul1.x
Итерация остановлена, используется более традиционная реализация блокировки (B)IO + многопоточность, по факту производительность не очень. Позже команда Spring просто самостоятельно переработала набор компонентов шлюза, что мы и рассмотрим на этот раз.Spring-Cloud-Gateway
.
Введение
Spring Cloud Gateway зависит отSpring Boot 2.0, Spring WebFlux,иProject Reactor. Многие знакомые библиотеки синхронизации (например,Spring-Data
иSpring-Security
) и режим синхронного программирования вSpring Cloud Gateway
не применяется во фреймворке, поэтому лучше сначала прочитать документацию трех фреймворков, упомянутых выше.
Spring Cloud Gateway
зависит отSpring Boot
иSpring WebFlux
предоставляется на основеNetty
среду выполнения, он не построен как WAR-пакет и не работает на традиционномServlet
в контейнере.
имя собственное
- Маршрут: Маршрут является основным компонентом шлюза. Он определяется идентификатором, целевым URI, набором предикатов и набором фильтров. Если агрегация предикатов оценивается как true, маршрут сопоставляется.
- Предикат: введен на основе функционального программирования в Java 8.java.util.Predicate. При использовании предикатного (агрегационного) суждения входными параметрами являются
ServerWebExchange
Тип, который позволяет разработчикам сопоставлять произвольные параметры HTTP-запросов, такие как заголовки HTTP-запросов, параметры HTTP-запросов и т. д. - Фильтр (Filter): использует указанный
GatewayFilter
завод созданGatewayFilter
Например, запрос (параметры) или ответ (параметры) могут быть изменены до или после отправки запроса вниз по течению.
фактическиFilter
также включеныGlobalFilter
, но в официальной документации это не упоминается.
Принцип работы
клиент дляSpring Cloud Gateway
сделать запрос, еслиGateway Handler Mapping
Модуль обрабатывает текущий запрос и, если он соответствует целевой конфигурации маршрутизации, запрос будет переадресован наGateway Web Handler
модуль.Gateway Web Handler
Когда модуль отправляет запрос, он пропускает запрос через цепочку фильтров, соответствующую запросу. Причина, по которой фильтры разделены пунктирными линиями на приведенном выше рисунке, заключается в том, что логика обработки фильтра может выполняться до или после отправки прокси-запроса. всеpre
Запрос прокси не будет создан (и отправлен) до тех пор, пока не будет выполнен тип фильтра, а когда запрос прокси создан (и отправлен), всеpost
тип фильтра будет выполнен.
См. рисунок выше, если приходит внешний запрос и попадает в цепочку фильтров, то левая часть пунктираpre
тип фильтра, запрос проходит первымpre
тип фильтра, который затем отправляется в целевую прокси-службу. Целевая прокси-служба отвечает на запрос, и ответ снова проходит через цепочку фильтров, то есть цепочку фильтров справа от пунктирной линии.post
тип фильтра.
Обратите внимание, что если соответствующий порт маршрутизации явно не указан в конфигурации маршрутизации, будут использоваться следующие порты по умолчанию:
- Протокол HTTP, использующий порт 80.
- Протокол HTTPS, использующий порт 443.
импортировать зависимости
Рекомендуется пройти напрямую через версию для поезда (на самом деле, автор исследовал, кодовое название версии для поезда на самом деле является названием станции лондонского метро, как и нынешняяSpring Cloud
Последняя версияGreenwich.SR1
,Greenwich
Этот сайт можно найти на карте станций лондонского метро, соответствующихSpringBoot
Версия 2.1.x) ПредставленоSpring-Cloud-Gateway
, так как это соответствует последней стабильной версииSpring-Cloud
версии, дополнительно из-заSpring-Cloud-Gateway
на основеNetty
Среда выполнения запускается без необходимости импортаServlet
контейнерspring-boot-starter-web
.
Родительский POM импортирует следующую конфигурацию:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.4.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Подмодули или должны быть импортированыSpring-Cloud-Gateway
Модуль POM представляет следующую конфигурацию:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
</dependencies>
Просто создайте класс запуска:
@SpringBootApplication
public class RouteServerApplication {
public static void main(String[] args) {
SpringApplication.run(RouteServerApplication.class, args);
}
}
Конфигурация шлюза
Конфигурация шлюза в конечном итоге должна быть преобразована вRouteDefinition
Набор конфигурации, интерфейс определения конфигурации выглядит следующим образом:
public interface RouteDefinitionLocator {
Flux<RouteDefinition> getRouteDefinitions();
}
Конфигурация через файл YAML или стриминговая программная конфигурация (на самом деле в документации есть и ЭврикаDiscoveryClient
Конфигурация, которая пока здесь не изучается), в конечном итоге заключается в созданииRouteDefinition
коллекция.
Конфигурация Yaml
Реализация конфигурацииPropertiesRouteDefinitionLocator
, связанный с классом конфигурацииGatewayProperties
:
spring:
cloud:
gateway:
routes:
- id: datetime_after_route # <------ 这里是路由配置的ID
uri: http://www.throwable.club # <------ 这里是路由最终目标Server的URI(Host)
predicates: # <------ 谓词集合配置,多个是用and逻辑连接
- Path=/blog # <------- Key(name)=Expression,键是谓词规则工厂的ID,值一般是匹配规则的正则表示
Конфигурация программной потоковой передачи
Конфигурация программного и потокового программирования требует зависимостейRouteLocatorBuilder
, цель состоит в том, чтобы построитьRouteLocator
Пример:
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route(r -> r.path("/blog")
.uri("http://www.throwable.club")
)
.build();
}
Фабрика предикатов маршрутизации
Spring Cloud Gateway
использовать маршрут какSpring-WebFlux
изHandlerMapping
часть компонентной инфраструктуры, т.е.HandlerMapping
При сопоставлении настроенные правила маршрутизации также будут включены в механизм сопоставления.Spring Cloud Gateway
Он содержит множество встроенных фабрик предикатов маршрутизации. Каждый из этих предикатов соответствует разным атрибутам HTTP-запроса. Можно использовать несколько фабрик предикатов маршрутов сand
логика объединена.
В настоящее времяSpring Cloud Gateway
Предоставляемые встроенные фабрики предикатов маршрутов:
Укажите предикаты маршрутизации правил даты и времени
Существует три необязательных правила для предикатов маршрутизации, заданных сконфигурированным датой и временем:
- Соответствие запросам до указанной даты и времени.
- Соответствие запросам после указанной даты и времени.
- Соответствие запросов между указанной датой и временем.
Стоит отметить, что настроенные дата и время должны соответствоватьZonedDateTime
Формат:
//年月日和时分秒用'T'分隔,接着-07:00是和UTC相差的时间,最后的[America/Denver]是所在的时间地区
2017-01-20T17:42:47.789-07:00[America/Denver]
Например, приложение шлюза2019-05-01T00:00:00+08:00[Asia/Shanghai]
В режиме онлайн запросы после выхода в Интернет направляются в Австриюwww.throwable.club
, то конфигурация следующая:
server
port: 9090
spring:
cloud:
gateway:
routes:
- id: datetime_after_route
uri: http://www.throwable.club
predicates:
- After=2019-05-01T00:00:00+08:00[Asia/Shanghai]
На этом этапе просто запросите шлюзhttp://localhost:9090
, запрос перенаправляетсяhttp://www.throwable.club
.
Если вы хотите разрешить только2019-05-01T00:00:00+08:00[Asia/Shanghai]
Предыдущий запрос, затем просто измените его на:
server
port: 9091
spring:
cloud:
gateway:
routes:
- id: datetime_before_route
uri: http://www.throwable.club
predicates:
- Before=2019-05-01T00:00:00+08:00[Asia/Shanghai]
Если для запросов разрешено только время между двумя периодами даты и времени, просто измените его на:
server
port: 9090
spring:
cloud:
gateway:
routes:
- id: datetime_between_route
uri: http://www.throwable.club
predicates:
- Between=2019-05-01T00:00:00+08:00[Asia/Shanghai],2019-05-02T00:00:00+08:00[Asia/Shanghai]
Тогда только запросы с 0:00 1 мая 2019 года до 0:00 2 мая могут маршрутизироваться нормально.
Предикат маршрутизации файлов cookie
CookieRoutePredicateFactory
Вам необходимо указать два параметра: имя файла cookie и регулярное выражение (значение). Только когда имя и значение, соответствующие файлу cookie в запросе, совпадают со значением, настроенным в предикате маршрутизации файла cookie, соответствующее попадание может быть маршрутизировано.
server
port: 9090
spring:
cloud:
gateway:
routes:
- id: cookie_route
uri: http://www.throwable.club
predicates:
- Cookie=doge,throwable
Запрос должен содержать файл cookie, имя — doge, а значение должно совпадать с регулярным выражением «throwable» для маршрутизации.http://www.throwable.club
.
Вот попробуйте наладить заказ локальноOrder
Сервис, основанный на SpringBoot2.1.4, запускается на порту 9091:
// 入口类
@RestController
@RequestMapping(path = "/order")
@SpringBootApplication
public class OrderServiceApplication {
public static void main(String[] args) {
SpringApplication.run(OrderServiceApplication.class, args);
}
@GetMapping(value = "/cookie")
public ResponseEntity<String> cookie(@CookieValue(name = "doge") String doge) {
return ResponseEntity.ok(doge);
}
}
Заказать конфигурацию сервиса application.yaml:
spring:
application:
name: order-service
server:
port: 9091
Конфигурация маршрутизации шлюза:
spring:
application:
name: route-server
cloud:
gateway:
routes:
- id: cookie_route
uri: http://localhost:9091
predicates:
- Cookie=doge,throwable
curl http://localhost:9090/order/cookie --cookie "doge=throwable"
//响应结果
throwable
Предикат маршрутизации заголовка
HeaderRoutePredicateFactory
Необходимо указать два параметра: имя заголовка и регулярное выражение (значение). Только когда имя и значение, соответствующие заголовку в запросе, совпадают со значением, настроенным в предикате маршрутизации заголовка, для маршрутизации может быть выполнено соответствующее попадание.
Добавить новую услугу заказа/header
Конечная точка:
@RestController
@RequestMapping(path = "/order")
@SpringBootApplication
public class OrderServiceApplication {
public static void main(String[] args) {
SpringApplication.run(OrderServiceApplication.class, args);
}
@GetMapping(value = "/header")
public ResponseEntity<String> header(@RequestHeader(name = "accessToken") String accessToken) {
return ResponseEntity.ok(accessToken);
}
}
Конфигурация маршрутизации шлюза выглядит следующим образом:
spring:
cloud:
gateway:
routes:
- id: header_route
uri: http://localhost:9091
predicates:
- Header=accessToken,Doge
curl -H "accessToken:Doge" http://localhost:9090/order/header
//响应结果
Doge
Предикат маршрутизации хоста
HostRoutePredicateFactory
Просто укажите список имен хостов, каждый элемент в списке поддерживает стиль именования Ant, используйте.
В качестве разделителя, используемого между несколькими элементами,
выделить. Предикат маршрутизации хоста фактически предназначен для заголовка HTTP-запроса.Host
Атрибуты.
Добавить новую услугу заказа/header
Конечная точка:
@RestController
@RequestMapping(path = "/order")
@SpringBootApplication
public class OrderServiceApplication {
public static void main(String[] args) {
SpringApplication.run(OrderServiceApplication.class, args);
}
@GetMapping(value = "/host")
public ResponseEntity<String> host(@RequestHeader(name = "Host") String host) {
return ResponseEntity.ok(host);
}
}
Конфигурация маршрутизации шлюза выглядит следующим образом:
spring:
cloud:
gateway:
routes:
- id: host_route
uri: http://localhost:9091
predicates:
- Host=localhost:9090
curl http://localhost:9090/order/host
//响应结果
localhost:9091 # <--------- 这里要注意一下,路由到订单服务的时候,Host会被修改为localhost:9091
На самом деле можно настроить более разнообразные шаблоны сопоставления хостов, и даже могут поддерживаться переменные шаблона URI.
- Host=www.throwable.**,**.throwable.**
- Host={sub}.throwable.club
предикат маршрутизации метода запроса
MethodRoutePredicateFactory
Требуется только один параметр: метод HTTP-запроса для соответствия.
Конфигурация маршрутизации шлюза выглядит следующим образом:
spring:
cloud:
gateway:
routes:
- id: method_route
uri: http://localhost:9091
predicates:
- Method=GET
При такой конфигурации все запросы к методу GET шлюза будут направляться наhttp://localhost:9091
.
Добавить новую услугу заказа/get
Конечная точка:
@GetMapping(value = "/get")
public ResponseEntity<String> get() {
return ResponseEntity.ok("get");
}
curl http://localhost:9090/order/get
//响应结果
get
предикат маршрутизации пути запроса
PathRoutePredicateFactory
необходимостьPathMatcher
Список путей шаблонов и необязательный аргумент flagsmatchOptionalTrailingSeparator
. Это наиболее часто используемый предикат маршрутизации.
spring:
cloud:
gateway:
routes:
- id: path_route
uri: http://localhost:9091
predicates:
- Path=/order/path
@GetMapping(value = "/path")
public ResponseEntity<String> path() {
return ResponseEntity.ok("path");
}
curl http://localhost:9090/order/path
//响应结果
path
Кроме того, через{segment}
пути конфигурации заполнителя, такие как/foo/1
или/foo/bar
или/bar/baz
, если настроено в этой форме, при перенаправлении совпадающего попадания соответствующий контент в пути будет извлечен, а пара ключ-значение будет помещена вServerWebExchange.getAttributes()
В коллекции КЛЮЧ естьServerWebExchangeUtils.URI_TEMPLATE_VARIABLES_ATTRIBUTE
, эти извлеченные свойства можно использовать дляGatewayFilter Factories
использовать.
предикат маршрутизации параметра запроса запроса
QueryRoutePredicateFactory
Требуется обязательный параметр запроса запроса (имя параметра) и необязательное регулярное выражение (регулярное выражение).
spring:
cloud:
gateway:
routes:
- id: query_route
uri: http://localhost:9091
predicates:
- Query=doge,throwabl.
Настроенный здесь параметрdoge
, регулярное выражениеthrowabl.
.
@GetMapping(value = "/query")
public ResponseEntity<String> query(@RequestParam("name") String doge) {
return ResponseEntity.ok(doge);
}
curl http://localhost:9090/order/query?doge=throwable
//响应结果
throwable
Предикат маршрутизации удаленного IP-адреса
RemoteAddrRoutePredicateFactory
Правило сопоставления принимает список (минимум 1) строк в нотации CIDR (IPv4 или IPv6), например 192.168.0.1/16 (где 192.168.0.1 — удаленный IP-адрес, а 16 — маска подсети).
spring:
cloud:
gateway:
routes:
- id: remoteaddr_route
uri: http://localhost:9091
predicates:
- RemoteAddr=127.0.0.1
@GetMapping(value = "/remote")
public ResponseEntity<String> remote() {
return ResponseEntity.ok("remote");
}
curl http://localhost:9090/order/remote
//响应结果
remote
Что касается предиката маршрутизации удаленной IP-маршрутизации, то на самом деле существует множество методов расширения, которые пока не будут здесь раскрываться.
Объединение нескольких предикатов маршрутизации
потому что конфигурация маршрутизацииpredicates
Атрибут на самом деле является списком, и несколько правил маршрутизации могут быть добавлены напрямую:
spring:
cloud:
gateway:
routes:
- id: remoteaddr_route
uri: http://localhost:9091
predicates:
- RemoteAddr=xxxx
- Path=/yyyy
- Query=zzzz,aaaa
Эти правила используютсяand
Логически объединенный, например, приведенный выше пример эквивалентен:
request = ...
if(request.getRemoteAddr == 'xxxx' && request.getPath match '/yyyy' && request.getQuery('zzzz') match 'aaaa') {
return true;
}
return false;
Фабрика шлюзовых фильтров
фильтр маршрутаGatewayFilter
Позволяет изменять содержимое входящего HTTP-запроса или возвращаемого содержимого HTTP-ответа. Область действия фильтра маршрута — это конкретная конфигурация маршрута.Spring Cloud Gateway
предоставляет множество встроенныхGatewayFilter
Фабрика, вы можете выбрать по мере необходимости.
так какGatewayFilter
Фабричных классов слишком много, приведу простой пример.
Если мы хотим прикрепить к некоторым запросам специальные заголовки HTTP-запроса, мы можем выбратьAddRequestHeaderX-Request-Foo:Bar
,application.yml
следующее:
spring:
cloud:
gateway:
routes:
- id: add_request_header_route
uri: https://example.org
filters:
- AddRequestHeader=X-Request-Foo,Bar
Тогда все HTTP-запросы от входа в шлюз будут добавлять специальный заголовок HTTP-запроса:X-Request-Foo:Bar
.
В настоящее времяGatewayFilter
Встроенная реализация фабрики выглядит следующим образом:
ID | имя класса | тип | Функции |
---|---|---|---|
StripPrefix | StripPrefixGatewayFilterFactory | pre | Удалите первую часть пути URL-адреса запроса, например, исходный путь запроса — /order/query, а после обработки — /query. |
SetStatus | SetStatusGatewayFilterFactory | post | Установите код состояния ответа на запрос, который будет проанализирован из org.springframework.http.HttpStatus |
SetResponseHeader | SetResponseHeaderGatewayFilterFactory | post | Установить (добавить) заголовок ответа на запрос ответа |
SetRequestHeader | SetRequestHeaderGatewayFilterFactory | pre | Установить (добавить) заголовки запроса |
SetPath | SetPathGatewayFilterFactory | pre | Установить (переопределить) путь запроса |
SecureHeader | SecureHeadersGatewayFilterFactory | pre | Установите заголовки запросов, связанные с безопасностью, см. SecureHeadersProperties |
SaveSession | SaveSessionGatewayFilterFactory | pre | Сохранить веб-сессию |
RewriteResponseHeader | RewriteResponseHeaderGatewayFilterFactory | post | заголовок повторного ответа |
RewritePath | RewritePathGatewayFilterFactory | pre | Переписать путь запроса |
Retry | RetryGatewayFilterFactory | pre | Повторить запросы в зависимости от условий |
RequestSize | RequestSizeGatewayFilterFactory | pre | Ограничьте размер запроса, единица измерения байт, если он превышает установленное значение, он будет возвращен413 Payload Too Large
|
RequestRateLimiter | RequestRateLimiterGatewayFilterFactory | pre | Ограничение |
RequestHeaderToRequestUri | RequestHeaderToRequestUriGatewayFilterFactory | pre | Измените URL-адрес запроса на значение заголовка запроса |
RemoveResponseHeader | RemoveResponseHeaderGatewayFilterFactory | post | Удалить настроенные заголовки ответа |
RemoveRequestHeader | RemoveRequestHeaderGatewayFilterFactory | pre | Удалить настроенные заголовки запроса |
RedirectTo | RedirectToGatewayFilterFactory | pre | Перенаправление, необходимо указать код состояния HTTP и URL-адрес перенаправления |
PreserveHostHeader | PreserveHostHeaderGatewayFilterFactory | pre | Установите для атрибута saveHostHeader, переносимого запросом, значение true. |
PrefixPath | PrefixPathGatewayFilterFactory | pre | добавить предварительный путь к пути запроса |
Hystrix | HystrixGatewayFilterFactory | pre | Интеграция Hystrix |
FallbackHeaders | FallbackHeadersGatewayFilterFactory | pre | Hystrix выполняется, если логика перехода на более раннюю версию позволяет передавать сведения об исключении через заголовки запроса. |
AddResponseHeader | AddResponseHeaderGatewayFilterFactory | post | добавить заголовки ответа |
AddRequestParameter | AddRequestParameterGatewayFilterFactory | pre | Добавьте параметры запроса, ограничиваясь только параметром запроса URL-адреса. |
AddRequestHeader | AddRequestHeaderGatewayFilterFactory | pre | добавить заголовок запроса |
GatewayFilter
При использовании фабрики необходимо знать ее идентификатор и метод настройки, который можно увидеть в публичном статическом внутреннем классе соответствующего класса фабрики.XXXXConfig
.
Завод GlobalFilter
GlobalFilter
Функция на самом деле такая же, какGatewayFilter
то же самое, простоGlobalFilter
Область действия — все конфигурации маршрутизации, не привязанные к указанной конфигурации маршрутизации. несколькоGlobalFilter
в состоянии пройти@Order
илиgetOrder()
способ указать каждыйGlobalFilter
Порядок выполнения , чем меньше значение ордера, темGlobalFilter
Чем выше приоритет выполнения.
Обратите внимание, что поскольку существует два типа фильтров, предварительный и пост-фильтр, если порядковое значение фильтра предварительного типа меньше, то оно должно быть на верхнем уровне цепочки предварительного фильтра, а если порядковое значение фильтра пост-типа меньше, то он должен быть в верхней части цепочки предварительных фильтров.Нижний слой цепочки предварительных фильтров. Схематическая диаграмма выглядит следующим образом:
Например, для достижения функции балансировки нагрузки,application.yml
Конфигурация выглядит следующим образом:
spring:
cloud:
gateway:
routes:
- id: myRoute
uri: lb://myservice # <-------- lb特殊标记会使用LoadBalancerClient搜索目标服务进行负载均衡
predicates:
- Path=/service/**
В настоящее времяSpring Cloud Gateway
встроенныйGlobalFilter
следующее:
имя класса | Функции |
---|---|
ForwardRoutingFilter | перенаправить |
LoadBalancerClientFilter | балансировки нагрузки |
NettyRoutingFilter | Маршрутизация для HTTP-клиента Netty |
NettyWriteResponseFilter | Netty отвечает на операцию записи |
RouteToRequestUrlFilter | Обновить URL-адрес на основе конфигурации маршрута |
WebsocketRoutingFilter | Запросы Websocket перенаправляются вниз по течению |
ВстроенныйGlobalFilter
большинство иServerWebExchangeUtils
свойства взаимосвязаны, поэтому я не буду здесь вдаваться в подробности.
Междоменная конфигурация
Шлюзы можно настроить для управления глобальным поведением CORS. Класс, соответствующий глобальной конфигурации CORS:CorsConfiguration
, эта конфигурация представляет собой карту шаблонов URL. Напримерapplication.yaml
Файлы следующие:
spring:
cloud:
gateway:
globalcors:
corsConfigurations:
'[/**]':
allowedOrigins: "https://docs.spring.io"
allowedMethods:
- GET
В приведенном выше примере для всех запрошенных путей путь отdocs.spring.io
И это запрос CORS с методом GET.
Корреляция конечной точки привода
вводитьspring-boot-starter-actuator
, вам необходимо выполнить следующую настройку, чтобы включитьgateway
Конечные точки мониторинга:
management.endpoint.gateway.enabled=true
management.endpoints.web.exposure.include=gateway
Список поддерживаемых в настоящее время конечных точек:
ID | путь запроса | HTTP-метод | описывать |
---|---|---|---|
globalfilters | /actuator/gateway/globalfilters | GET | Показать список GlobalFilters в конфигурации маршрутизации |
routefilters | /actuator/gateway/routefilters | GET | Отображает список GatewayFilters, привязанных к соответствующей конфигурации маршрутизации. |
refresh | /actuator/gateway/refresh | POST | Очистить кеш конфигурации маршрута |
routes | /actuator/gateway/routes | GET | Показать список определенных конфигураций маршрутизации |
routes/{id} | /actuator/gateway/routes/{id} | GET | Отображение конфигурации маршрутизации, определенной для соответствующего идентификатора. |
routes/{id} | /actuator/gateway/routes/{id} | POST | Добавить новую конфигурацию маршрута |
routes/{id} | /actuator/gateway/routes/{id} | DELETE | Удалить конфигурацию маршрутизации указанного идентификатора |
в/actuator/gateway/routes/{id}
Формат добавления нового параметра запроса конфигурации маршрута следующий:
{
"id": "first_route",
"predicates": [{
"name": "Path",
"args": {"doge":"/throwable"}
}],
"filters": [],
"uri": "https://www.throwable.club",
"order": 0
}
резюме
Хоть автор и низкоуровневый кодовый зверь, я давно сказал своим друзьям:
Реактивное программирование в сочетании с синхронным неблокирующим вводом-выводом или асинхронным неблокирующим вводом-выводом является основным направлением современных сред сетевого программирования. стать их соавторами.
Общие среды реактивного программирования:
-
Reactorи
RxJava2
,вReactor
Приложения JVM в бэкенде более распространены,RxJava2
Это чаще встречается в клиентах APP, написанных для Android. -
Reactor-Netty
, который основан наReactor
иNetty
в упаковке. -
Spring-WebFlux
иSpring-Cloud-Gateway
,вSpring-Cloud-Gateway
полагатьсяSpring-WebFlux
,иSpring-WebFlux
Нижний слой зависит отReactor-Netty
.
В соответствии с этой цепной связью лучше всего систематически учитьсяReactor
иNetty
.
Использованная литература:
приложение
выберитеSpring-Cloud-Gateway
Не только для использования новой технологии, но, что более важно, ее производительность была улучшена, сравнительные проектыspring-cloud-gateway-benchРезультат выглядит следующим образом:
Прокси-компонент (Прокси) | Средняя задержка взаимодействия (Avg Latency) | Среднее число запросов, обрабатываемых в секунду (Avg Requests/Sec) |
---|---|---|
Spring Cloud Gateway | 6.61ms | 32213.38 |
Linkered | 7.62ms | 28050.76 |
Zuul(1.x) | 12.56ms | 20800.13 |
Нет (прямой вызов) | 2.09ms | 116841.15 |
Оригинальная ссылка
- Страница на гитхабе:woohoo.throwable.club/2019/05/04/…
- Кодовая страница:кинутьable.coding.what/2019/05/04/…
(Конец этой статьи c-3-d e-a-20190504)
Технический публичный аккаунт ("Throwable Digest"), который время от времени выкладывает оригинальные технические статьи автора (никогда не занимайтесь плагиатом и не перепечатывайте):
Развлекательный паблик ("Скульптуры из песка каждый день") выбирает интересные картинки, тексты и видео скульптур из песка и время от времени выкладывает их, чтобы снять напряжение жизни и работы: