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
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