Spring Cloud所集成的zuul版本,采用的是Tomcat容器,使用的是传统的Servlet IO处理模型
传统的Web框架,像struct2、springmv 等都是 基于Servlet API 和Servlet容器运行的。
但是在Servlet3.1之后增加了异步阻塞的支持。而WebFlux是一个典型非阻塞异步的框架,它的核心是基于Reactor的相关API实现的。相对于传统的web框架来说,它可以运行在诸如Netty、Undertow及支持Servlet3.1的容器上。
SpringCloud GateWay是基于WebFlux框架实现的,而WebFlux框架底层则使用高性能的Reactor模式通信框架Netty。
Spring Cloud GateWay 的目标是提供统一的路由方式且基于Filter链的方式提供网关基本的功能,例如: 安全、监控/指标和 限流。
Gateway 是基于异步非阻塞模型,性能方面表现较好。
路由是构建网关的基本模块,由ID、目标URI、一系列的断言和过滤器组成,如果断言为true则匹配该 路由。
开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由
指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由之前或之后进行修改
Spring MVC found on classpath, which is incompatible with Spring Cloud Gateway at this time. Please remove spring-boot-starter-web dependency.
springcloud gateway的内部是通过netty+webflux实现的,webflux实现和springmvc配置依赖冲突。
引入依赖:
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-gatewayartifactId>
dependency>
配置路由转发之后
访问http://localhost:9527/payment/get/35会通过路由转发到http://localhost:8001/payment/get/35
在application.yaml处,将uri: http://localhost:8001修改为uri: lb://cloud-payment-service。即lb://服务名
spring:
application:
name: cloud-gateway
cloud:
gateway:
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
routes:
- id: payment_routh #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名
#uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://cloud-payment-service #lb 表示负载均衡 匹配后提供服务的路由地址
predicates:
- Path=/provider/payment/get/** # 断言,路径相匹配的进行路由
- id: payment_routh2
uri: lb://cloud-payment-service
predicates:
- Path=/provider/payment/lb
定义filter类实现两个接口: Ordered和GlobalFilter
package com.johnny.springcloud.filter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.util.Date;
/**
* @author Johnny Lin
* @date 2021/6/27 0:25
*/
@Component
@Slf4j
public class MyLogGatewayFilter implements Ordered, GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
log.info("************* com in MyLogGatewayFilter "+ new Date());
String uname = exchange.getRequest().getQueryParams().getFirst("uname");
if( uname == null){
log.info("*****用户名为null, 非法用户 o(╥﹏╥)o");
//设置响应状态码
exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
return exchange.getResponse().setComplete();
}
//放行
return chain.filter(exchange);
}
@Override
public int getOrder() {
return 0; // 值越小 优先级越高
}
}