Spring Cloud Gateway интегрирует маршрутизацию и переадресацию Eureka

задняя часть GitHub Spring

Ранее мы провели вводное исследование по Spring Cloud Gateway, Для конкретных статей вы можете просмотреть«Первые пользователи Spring Cloud Gateway Gateway»учиться.

Шлюз отвечает за переадресацию, поэтому ему необходимо знать служебную информацию бэкэнда.Сегодня мы изучим работу Spring Cloud Gateway для интеграции Eureka для реализации функции переадресации службы.

Добавьте зависимости eureka-client на основе предыдущей:

<dependency>
	    <groupId>org.springframework.cloud</groupId>
	    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

Далее следует настроить конкретные правила переадресации.Здесь нам нужно обратить внимание на конфигурацию uri:

server:
  port: 8084
spring:
  cloud:
    gateway:
      routes:
      - id: fsh-house
        uri: lb://fsh-house
        predicates:
        - Path=/house/**
        
  application:
    name: fangjia-gateway

eureka:
  instance:
    prefer-ip-address: true
  client:
    service-url:
      defaultZone: http://yinjihuan:123456@master:8761/eureka/

URI начинается с lb:// (lb означает получение службы из реестра), за которым следует имя службы, на которое необходимо выполнить переадресацию. Это имя службы должно соответствовать имени в eureka, иначе служба не будет найдена. Ошибка заключается в следующем:

org.springframework.cloud.gateway.support.NotFoundException: Unable to find instance for fsh-house1

Если пакет spring-cloud-starter-netflix-eureka-client введен, но вы не хотите интегрировать Eureka, вы также можете отключить его с помощью следующей конфигурации:

eureka.client.enabled=false

После разговора о способе непосредственной настройки маршрутизации, давайте поговорим о способе переадресации без настройки.Учащиеся, которые использовали Zuul, должны знать, что Zuul будет выполнять операции переадресации для всех служб по умолчанию, и нужно только указать путь доступа на путь доступа.Службы достаточно.Таким образом, нет необходимости настраивать правила переадресации для каждой службы.При добавлении новой службы нет необходимости настраивать правила маршрутизации и перезапускать шлюз.

Разумеется, такая функция в Spring Cloud Gateway есть, ее нужно только включить через конфигурацию, конфигурация следующая:

spring.cloud.gateway.discovery.locator.enabled=true

После открытия мы можем получить доступ к сервису через адрес, формат следующий:

http://网关地址/服务名称(大写)/**

http://localhost:8084/FSH-HOUSE/house/1

Это имя с заглавной буквы по-прежнему имеет большое значение. Если мы обновим Zull до Spring Cloud Gateway, это означает, что адрес запроса изменился или адрес маршрутизации каждой службы был перенастроен. Из исходного кода я обнаружил, что это может быть совместим с обработкой, а затем добавить Достаточно одной конфигурации:

spring.cloud.gateway.discovery.locator.lowerCaseServiceId=true

После завершения настройки мы можем получить к ней доступ через имя службы в нижнем регистре следующим образом:

http://网关地址/服务名称(小写)/**

http://localhost:8084/fsh-house/house/1

Исходный код конфигурации: org.springframework.cloud.gateway.discovery.DiscoveryLocatorProperties

@ConfigurationProperties("spring.cloud.gateway.discovery.locator")
public class DiscoveryLocatorProperties {

	/** Flag that enables DiscoveryClient gateway integration */
	private boolean enabled = false;

	/**
	 * The prefix for the routeId, defaults to discoveryClient.getClass().getSimpleName() + "_".
	 * Service Id will be appended to create the routeId.
	 */
	private String routeIdPrefix;

	/**
	 * SpEL expression that will evaluate whether to include a service in gateway integration or not,
	 * defaults to: true
	 */
	private String includeExpression = "true";

	/** SpEL expression that create the uri for each route, defaults to: 'lb://'+serviceId */
	private String urlExpression = "'lb://'+serviceId";

	/**
	 * Option to lower case serviceId in predicates and filters, defaults to false.
	 * Useful with eureka when it automatically uppercases serviceId.
	 * so MYSERIVCE, would match /myservice/**
	 */
	private boolean lowerCaseServiceId = false;

	private List<PredicateDefinition> predicates = new ArrayList<>();

	private List<FilterDefinition> filters = new ArrayList<>();
}

Адрес источника статьи: https://github.com/yinjihuan/spring-cloud/tree/master/fangjia-gateway

猿天地