SpringCloud Gateway 使用Webflux中的reactor-netty响应式编程组件,底层使用了Netty通讯框架。
主要用于:反向代理、鉴权、流量控制、熔断、日志监控
(1)动态路由:能够匹配任何请求属性;
(2)可以对路由指定 Predicate(断言)和 Filter(过滤器);
(3)集成Hystrix的断路器功能;
(4)集成 Spring Cloud 服务发现功能;
(5)易于编写的 Predicate(断言)和 Filter(过滤器);
(6)请求限流功能;
(7)支持路径重写。
路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由
(2)Predicate(断言)开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由
(3)Filter(过滤)指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。
4.网关搭建(1)依赖jar
org.springframework.cloud spring-cloud-starter-gateway
(2)配置文件
server:
port: 9527
spring:
application:
name: springcloud-gateway
cloud:
gateway:
routes:
- id: payment_routh #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名
uri: http://localhost:8001 #匹配后提供服务的路由地址
predicates:
- Path=/payment/** # 断言,路径相匹配的进行路由
- id: payment_routh2 #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名
uri: http://localhost:8001 #匹配后提供服务的路由地址
predicates:
- Path=/payment/lb/** # 断言,路径相匹配的进行路由
eureka:
instance:
hostname: springcloud-gateway-service
prefer-ip-address: true
instance-id: gateway
client: #服务提供者provider注册进eureka服务列表内
service-url:
register-with-eureka: true
fetch-registry: true
defaultZone: http://eureka7001.com:7001/eureka
(3)启动类
package cpm.zj.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class GatewayAppication {
public static void main(String[] args) {
SpringApplication.run(GatewayAppication.class,args);
}
}
5.Gateway动态路由
(1)只需修改网关搭建张的配置文件,开启从注册中心动态创建路由功能
server:
port: 9527
spring:
application:
name: springcloud-gateway
cloud:
gateway:
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
routes:
- id: payment_routh #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名
#uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://SPRINGCLOUD-PAYMENT #匹配后提供服务的路由地址
predicates:
- Path=/payment/query/** # 断言,路径相匹配的进行路由
# - id: payment_routh2 #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名
# uri: http://localhost:8001 #匹配后提供服务的路由地址
# predicates:
# - Path=/payment/hystrix/timeout
@Component
public class MyFilter implements GlobalFilter, Ordered {
@Override
public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
System.out.println("time:"+new Date()+"t 执行了自定义的全局过滤器: "+"MyLogGateWayFilter"+"hello");
String uname = exchange.getRequest().getQueryParams().getFirst("uname");
if (uname == null) {
System.out.println("****用户名为null,无法登录");
exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
@Override
public int getOrder() {
return 0;
}
}



