Gateway
Spring Cloud Gateway 是 Spring Cloud 新推出的网关框架,之前是 Netflix Zuul。
常见的功能有转发服务,权限认证,限流控制等等。
三大核心概念:
- Route(路由)
- Predicate(断言)
- Filter(过滤)
简单使用
1.pom
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>com.xmm.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
</dependency>
</dependencies>
注意:spring-cloud-starter-gateway与spring-boot-starter-web会冲突报错,不能同时引入
2.yml
-
通过地址路由配置
server: port: 9527 cloud: gateway: discovery: locator: enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由 routes: - id: payment_route_get #路由的id,没有固定规则但要求唯一,建议配合服务名使用 uri: http://localhost:8001 #匹配后提供路由服务的路由地址 predicates: - Path=/payment/get/** #断言,路径相匹配的进行路由 - id: payment_route_lb #路由的id,没有固定规则但要求唯一,建议配合服务名使用 uri: http://localhost:8001 #匹配后提供路由服务的路由地址 predicates: - Path=/payment/lb/** #断言,路径相匹配的进行路由 eureka: client: register-with-eureka: true #表示是否将自己注册进rurekaServer fetch-registry: true #是否从eurekaServer抓取已有的注册信息 service-url: defaultZone: http://eureka7001.com:7001/eureka/ #单机版
-
通过注册中心服务名动态路由配置
#通过服务名动态路由 配置 cloud: gateway: discovery: locator: enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由 routes: - id: payment_route_get #路由的id,没有固定规则但要求唯一,建议配合服务名使用 uri: lb://CLOUD-PAYMENT-SERCICE predicates: - Path=/payment/get/** #断言,路径相匹配的进行路由 - id: payment_route_lb #路由的id,没有固定规则但要求唯一,建议配合服务名使用 uri: lb://CLOUD-PAYMENT-SERCICE predicates: - Path=/payment/lb/** #断言,路径相匹配的进行路由
-
通过以上配置,启动后可通过访问9527端口访问uri对应地址的服务,实现了不暴露原本服务端口,在上面套一层路由端口,即:localhost:9527/payment/get/1可替代:localhost:8001/payment/get/1
配置中常用的predicate
- After Route Predicate
- Before Route Predicate
- Between Route Predicate
- Cookie Route Predicate
- Header Route Predicate
- Host Route Predicate
- Method Route Predicate
- Path Route Predicate
- Query Route Predicate
- RemoteAddr Route Predicate
- Weight Route Predicate
解释:
例1:
spring:
cloud:
gateway:
routes:
- id: after_route
uri: http://locahost:8001
predicates:
- After=2020-04T17:42:47.789-07:00[America/Denver]
即:在上述predicates After中对应的时间之后才可以访问成功
例4:必须要带cookie才可以访问,以此类推
自定义Filter
过滤器使用太广泛,在此只介绍自定义过滤器
一下为简单实例:具体需要实现什么功能可增加相应逻辑(例:权限,日志等等)
实现接口:
@Component
public class MyLogGatewayFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
System.out.println("**********come in MyLogGatewayFilter"+new Date());
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;
}
}