- 原理
底层使用netty,使用异步非阻塞模型
- 功能
- 限流
- 日志监控
- 反向代理
- 鉴权
- 熔断
- 架构
- 特性
- 动态路由
- 集成hystrix断路器
- 集成spring cloud服务发现
- 易于编写的predicate(断言)和filter(断路器)
- 请求限流
- 支持路径重写
- zuul和gateway区别
- zuul:阻塞,不支持长连接
- gateway:非阻塞,支持长连接
- zuul流程
- 重要概念
- route:路由是构建网关的基础模块,它由id,目标url,一系列的路由,过滤器组成
- predicate:匹配http所有内容(请求头,请求参数),请求和断言匹配成功则进行路由
- filter:请求在被路由之前或之后进行修改
编码
- pom
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
- yml
server:
port: 9527
spring:
application:
name: cloud-gateway-service
cloud:
gateway:
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用服务名进行路由
routes:
- id: payment_route
uri: lb://cloud-payment-service
predicates:
- Path=/payment/**
eureka:
client:
fetch-registry: true
register-with-eureka: true
service-url:
defaultZone: http://eureka7001.com:7001/eureka
- main类
@SpringBootApplication
@EnableEurekaClient
public class GatewayMain {
public static void main(String[] args) {
SpringApplication.run(GatewayMain.class, args);
}
}
- pridicate类型
filter实现
- 生命周期类型
- pre
- post
- 种类类型
- gateway
- global:常用于鉴权和日志
如下代码实现
@Component
@Slf4j
public class MyGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String token = exchange.getRequest().getHeaders().getFirst("token");
log.info("***token***");
if (StringUtils.isEmpty(token)) {
exchange.getResponse().setStatusCode(HttpStatus.BAD_REQUEST);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
@Override
public int getOrder() {
return 0;
}
}