Pasarela de enrutamiento SpringCloud-getway

Para la configuración y el código completo del proyecto, vaya a gitee para ver https://gitee.com/xwb1056481167/spring-cloud/

Pasarela de servicios

La versión de Zuul integrada en Spring Cloud usa el contenedor Tomcat. El Servlet de procesamiento de E / S de Servlet tradicional  
es la administración del ciclo de vida del contenedor de Servlet. El  
objeto de servlet se construye cuando se inicia el contenedor y se llama al servlet init () para inicializar el  
contenedor. Cada solicitud asigna un subproceso (generalmente obtiene un subproceso inactivo del grupo de subprocesos) y luego llama a service ();
cuando el congainer está cerrado, llame al servlet destroy () para destruir el servlet;

zuul (empresa de netflix)

La versión 2.0 aún no ha salido (los talentos centrales renuncian, otros argumentan que sus objetivos no están unificados)

GateWay (empresa de primavera)

Documento oficial: https://docs.spring.io/spring-cloud-gateway/docs/2.2.5.RELEASE/reference/html/#gateway-request-predicates-factories

Diagrama de arquitectura oficial

Descripción

El cliente envía una solicitud a Spring Cloud Gateway. Si la asignación del controlador de la puerta de enlace determina que la solicitud coincide con la ruta, se envía al controlador web de la puerta de enlace.
El controlador ejecuta la solicitud a través de una cadena de filtros específicos de la solicitud. La razón por la que el filtro está separado por una línea de puntos es que el filtro puede ejecutar la lógica antes y después de que se envíe la solicitud de proxy.
Se ejecuta toda la lógica del "pre" filtro. Luego emita una solicitud de proxy. Después de que se emita la solicitud de proxy, se ejecutará la lógica del filtro "posterior". 

La lógica central del reenvío de enrutamiento de puerta de enlace + cadena de filtro de ejecución

Spring Cloud Gateway tiene las siguientes características

1、基于Spring Framework 5 ,Project Reactor和Spring Boot1.0进行构建  
2、动态路由:能够匹配任何请求属性  
3、可以对路由指定Predicate(断言)和Filter(过滤器)  
4、集成Hystrix的断路器功能  
5、集成Spring Cloud 服务发现功能
6、易于编写的Predicate(断言)和Filter(过滤器)
7、请求限流功能
8、支持路经重新

Tres conceptos centrales

1. La ruta
es el módulo básico para construir Wanguqian. Se compone de ID, URI de destino, una serie de aserciones y filtros. Si la aserción es verdadera, coincidirá con la ruta.
2. Predicado se
refiere a la función java.util.function de Java8 .Los desarrolladores de Predicate pueden hacer coincidir todo el contenido de la solicitud HTTP (como encabezados de solicitud y parámetros de solicitud) y enrutar si la solicitud coincide con la aserción
3. El filtro se
refiere al marco de Spring Una instancia de GatewayFilter, usando un filtro, puede modificar el solicitud después de enrutar la solicitud o más tarde

Utilizar en el proyecto

Crear una puerta de enlace de enrutamiento cloud-gateway-gateway9527

1 、 pom.xml

<dependencies>
    <!-- gateway路由网关 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
    <!-- eureka 服务发现 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

2. Gateway application.yml

spring:
  application:
    name: cloud-gateway9527 #服务名
  cloud:
    gateway:
      routes:
        - id:  payment_route #payment_route  路由的id,没有固定规则但要求唯一,建议配合服务名
          uri: http://localhost:8001 #匹配后提供服务的路由地址
          predicates:
            - Path=/payment/get/**  #断言,路径相匹配的进行路由

        - id: payment_route2 #payment_route2  路由的id,没有固定规则但要求唯一,建议配合服务名
          uri: http://localhost:8001 #匹配后提供服务的路由地址
          predicates:
            - Path=/payment/lb/**  #断言,路径相匹配的进行路由

3. Prueba

Inicie 7001, cloud-provider-payment8001 (no es necesario cambiar nada), cloud-gateway-gateway9527 y visite la dirección

http: // localhost: 8001 / payment / get / 1 后

Resumen: Equivale a agregar una capa de protección frente al acceso 8001,

Dos métodos de enrutamiento

configuración

@Configuration
public class GateWayConfig {
    /**
     * 配置了一个Id为route-name的路由规则,方访问地址http://localhost:9527/guonei是会自动转发到地址http://news.baidu.com/guonei
     */
    @Bean
    public RouteLocator customerRouteLocator(RouteLocatorBuilder routeLocatorBuilder) {
        RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
        routes.route("path_route_xwb", r -> r.path("/guonei").uri("http://news.baidu.com/guonei")).build();
        return routes.build();
    }
}

Pero no se recomienda lo anterior, la configuración es más problemática, se recomienda usar yml

Una, configuración de enrutamiento dinámico gateWay

server:
  port: 9527
spring:
  application:
    name: cloud-gateway9527 #服务名
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
      routes:
          - id:  payment_route #payment_route  路由的id,没有固定规则但要求唯一,建议配合服务名
            #uri: http://localhost:8001 #匹配后提供服务的路由地址
            #cloud-payment-service为eureka注册的服务名 lb是url的协议,表示启用Gateway的负载均衡功能
            uri: lb://cloud-payment-service #微服务提供服务的路由地址()
            predicates:
              - Path=/payment/get/**  #断言,路径相匹配的进行路由

          - id: payment_route2 #payment_route2  路由的id,没有固定规则但要求唯一,建议配合服务名
            #uri: http://localhost:8001 #匹配后提供服务的路由地址
            uri: lb://cloud-payment-service #匹配后提供服务的路由地址
            predicates:
              - Path=/payment/lb/**  #断言,路径相匹配的进行路由

Descripción

1. Debe habilitar la siguiente configuración spring.cloud.gateway.discovery.locator.enable = true para habilitar el enrutamiento por nombre de servicio
2. uri: lb: // cloud-payment-service para acceder al servicio por nombre de servicio, lb es loadBalanceClient ( https://docs.spring.io/spring-cloud-gateway/docs/2.2.5.RELEASE/reference/html/#the-between-route-predicate-factory) Función de equilibrio de carga

Efecto de visualización real:

Dos, afirmar predicados

https://docs.spring.io/spring-cloud-gateway/docs/2.2.5.RELEASE/reference/html/#gateway-request-predicates-factories

Total: 11 métodos de configuración.

1, después de la fábrica de predicados de ruta

predicates:
       - After=2017-01-20T17:42:47.789-07:00[America/Denver]

2, antes de la ruta de fábrica de predicados

predicates:
       - Before=2017-01-20T17:42:47.789-07:00[America/Denver]

3, entre fábrica de predicados de ruta

 predicates:
        - Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]

4 Factory Fábrica de predicados de ruta de cookies

predicates:
       - Cookie=chocolate, ch.p

5 Factory Fábrica de predicados de ruta de encabezado

predicates:
       - Header=X-Request-Id, \\d+

6, fábrica de predicados de ruta de host

predicates:
       - Host=**.somehost.org,**.anotherhost.org

7, método de ruta de fábrica de predicados

predicates:
       - Method=GET,POST

8, fábrica de predicados de ruta de ruta

predicates:
       - Path=/red/{segment},/blue/{segment}

9 、 La fábrica de predicados de ruta de consulta

predicates:
       - Query=green

10 Factory Fábrica de predicados de ruta de RemoteAddr

predicates:
       - RemoteAddr=192.168.1.1/24

11 、 Fábrica de predicados de ruta de peso

predicates:
       - Weight=group1, 2

p.ej:

spring:
  application:
    name: cloud-gateway9527 #服务名
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
      routes:
          - id:  payment_route #payment_route  路由的id,没有固定规则但要求唯一,建议配合服务名
            #uri: http://localhost:8001 #匹配后提供服务的路由地址
            #cloud-payment-service为eureka注册的服务名 lb是url的协议,表示启用Gateway的负载均衡功能
            uri: lb://cloud-payment-service #微服务提供服务的路由地址()
            predicates:
              - Path=/payment/get/**  #断言,路径相匹配的进行路由
              - After=2020-12-06T16:05:15.580+08:00[Asia/Shanghai] #在当前访问时间之后有效
              - Method=GET

          - id: payment_route2 #payment_route2  路由的id,没有固定规则但要求唯一,建议配合服务名
            #uri: http://localhost:8001 #匹配后提供服务的路由地址
            uri: lb://cloud-payment-service #匹配后提供服务的路由地址
            predicates:
              - Path=/payment/lb/**  #断言,路径相匹配的进行路由
              - Host=**.gateway9527.com #当匹配规则为此路径的时候允许访问

curl  http: // localhost: 9527 / payment / lb  -H "Host: gateway9527.com" El gateway9527.com en
mi "Host: gateway9527.com" está configurado en el host.

Tres, filtro

Filtro personalizado

Agregar un filtro personalizado al proyecto 9527

/**
 * Gateway的Filter过滤连
 * 总的全局过滤器,档在所有微服务前面,进行校验
 */
@Component
@Slf4j
public class MyLogGateWayFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info("*********************** come in MyLogGatewayFilter:" + new Date());
        String uname = exchange.getRequest().getQueryParams().getFirst("uname");
        if (uname == null) {
            log.info("************用户名为null,非法用户,(꒦_꒦) ");
            exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
            return exchange.getResponse().setComplete();
        }
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return 0;
    }
}

Nota: 9527 está bloqueado frente a los llamados microservicios. Al solicitar (7001,8001,8002,9527), actualice hacia adelante y hacia atrás a través de la dirección de acceso  http: // localhost: 9527 / payment / lb? Uname = 234, acceso Normal, si se elimina uname, la llamada falla

 

 

 

 

Supongo que te gusta

Origin blog.csdn.net/www1056481167/article/details/113592250
Recomendado
Clasificación