[Zuul 1.x]: “Zuul”
[gateway]: “gateway”
Cloud全家桶中有个很重要的组件就是网关,在1.x版本中都是采用的Zuul网关;
但在2.x版本中,zuul的升级一直跳票,SpringCloud最后自己研发了一个网关替代Zuul,就是gateway.
SpringCloud Gateway 使用的Webflux中的reactor-net统一响应式编程组件,底层使用了Net统一通讯框架.
Netflix不太靠谱,zuul2.0一直跳票,迟迟不发布
- 一方面因为Zuul1.0已经进入了维护阶段,而且Gateway是SpringCloud团队研发的,是亲儿子产品,值得信赖.而且很多功能Zuul都没有,用起来也非常的简单便捷.
- Gateway是基于异步非阻塞模型进行开发的,性能方面不需要担心.虽然Netflix早就发布了最新的Zuul 2.x,单SpringCloud貌似没有整合计划.而且Netflix相关组件都宣布进入维护期;不知前景如何.
- 多方面综合考虑Gateway是很理想的网关选择.
在SpringCloud Finchley正式版之前,Spring Cloud推荐的网关是Netflix提供的Zuul;
spring:
application:
name: cloud-gateway-service
cloud:
gateway:
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用为服务名进行路由
routes:
- id: payment_route1 #路由的ID,没有固定规则但要求唯一,建议配合服务名
# uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://cloud-payment-service #lb负载均衡
predicates:
- Path=/payment/get/** #断言,路径相匹配的进行路由
- id: payment_route2 #路由的ID,没有固定规则但要求唯一,建议配合服务名
# uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://cloud-payment-service
predicates:
- Path=/payment/lb/** #断言,路径相匹配的进行路由
- After=2020-12-16T18:02:16.747+08:00[Asia/Shanghai]
package com;
import java.time.ZonedDateTime;
public class T {
public static void main(String[] args) {
ZonedDateTime zdt = ZonedDateTime.now();//默认时区
System.out.println(zdt);
//2020-12-16T17:02:16.747+08:00[Asia/Shanghai]
}
}
spring:
application:
name: cloud-gateway-service
cloud:
gateway:
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用为服务名进行路由
routes:
- id: payment_route1 #路由的ID,没有固定规则但要求唯一,建议配合服务名
# uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://cloud-payment-service #lb负载均衡
predicates:
- Path=/payment/get/** #断言,路径相匹配的进行路由
- id: payment_route2 #路由的ID,没有固定规则但要求唯一,建议配合服务名
# uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://cloud-payment-service
predicates:
- Path=/payment/lb/** #断言,路径相匹配的进行路由
# - After=2020-12-16T18:02:16.747+08:00[Asia/Shanghai]
- Before=2020-12-16T17:02:16.747+08:00[Asia/Shanghai]
spring:
application:
name: cloud-gateway-service
cloud:
gateway:
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用为服务名进行路由
routes:
- id: payment_route1 #路由的ID,没有固定规则但要求唯一,建议配合服务名
# uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://cloud-payment-service #lb负载均衡
predicates:
- Path=/payment/get/** #断言,路径相匹配的进行路由
- id: payment_route2 #路由的ID,没有固定规则但要求唯一,建议配合服务名
# uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://cloud-payment-service
predicates:
- Path=/payment/lb/** #断言,路径相匹配的进行路由
# - After=2020-12-16T18:02:16.747+08:00[Asia/Shanghai]
# - Before=2020-12-16T17:02:16.747+08:00[Asia/Shanghai]
- Between=2020-12-16T16:02:16.747+08:00[Asia/Shanghai],2020-12-16T17:02:16.747+08:00[Asia/Shanghai]
curl http://localhost:9527/payment/lb #不带cookie访问
curl http://localhost:9527/payment/lb --cookie "username=zyc" #带cookie访问
spring:
application:
name: cloud-gateway-service
cloud:
gateway:
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用为服务名进行路由
routes:
- id: payment_route1 #路由的ID,没有固定规则但要求唯一,建议配合服务名
# uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://cloud-payment-service #lb负载均衡
predicates:
- Path=/payment/get/** #断言,路径相匹配的进行路由
- id: payment_route2 #路由的ID,没有固定规则但要求唯一,建议配合服务名
# uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://cloud-payment-service
predicates:
- Path=/payment/lb/** #断言,路径相匹配的进行路由
# - After=2020-12-16T18:02:16.747+08:00[Asia/Shanghai]
# - Before=2020-12-16T17:02:16.747+08:00[Asia/Shanghai]
- Between=2020-12-16T17:02:16.747+08:00[Asia/Shanghai],2020-12-16T18:02:16.747+08:00[Asia/Shanghai]
- Cookie=username,zyc
curl http://localhost:9527/payment/lb #404,不带请求头"X-Request-Id:1234"
curl http://localhost:9527/payment/lb -H "X-Request-Id:1234" #带"X-Request-Id:1234"
spring:
application:
name: cloud-gateway-service
cloud:
gateway:
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用为服务名进行路由
routes:
- id: payment_route1 #路由的ID,没有固定规则但要求唯一,建议配合服务名
# uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://cloud-payment-service #lb负载均衡
predicates:
- Path=/payment/get/** #断言,路径相匹配的进行路由
- id: payment_route2 #路由的ID,没有固定规则但要求唯一,建议配合服务名
# uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://cloud-payment-service
predicates:
- Path=/payment/lb/** #断言,路径相匹配的进行路由
# - After=2020-12-16T18:02:16.747+08:00[Asia/Shanghai]
# - Before=2020-12-16T17:02:16.747+08:00[Asia/Shanghai]
- Between=2020-12-16T17:02:16.747+08:00[Asia/Shanghai],2020-12-16T18:02:16.747+08:00[Asia/Shanghai]
# - Cookie=username,zyc
- Header=X-Request-Id, \d+ #请求头要有X-Request-Id属性并且值为整数的正则表达式
curl http://localhost:9527/payment/lb -H "Host:www.atguigu.com"
curl http://localhost:9527/payment/lb -H "Host:news.atguigu.com"
spring:
application:
name: cloud-gateway-service
cloud:
gateway:
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用为服务名进行路由
routes:
- id: payment_route1 #路由的ID,没有固定规则但要求唯一,建议配合服务名
# uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://cloud-payment-service #lb负载均衡
predicates:
- Path=/payment/get/** #断言,路径相匹配的进行路由
- id: payment_route2 #路由的ID,没有固定规则但要求唯一,建议配合服务名
# uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://cloud-payment-service
predicates:
- Path=/payment/lb/** #断言,路径相匹配的进行路由
# - After=2020-12-16T18:02:16.747+08:00[Asia/Shanghai]
# - Before=2020-12-16T17:02:16.747+08:00[Asia/Shanghai]
- Between=2020-12-16T17:02:16.747+08:00[Asia/Shanghai],2020-12-16T18:02:16.747+08:00[Asia/Shanghai]
# - Cookie=username,zyc
# - Header=X-Request-Id, \d+ #请求头要有X-Request-Id属性并且值为整数的正则表达式
- Host=**.atguigu.com #host含有**.atguigu.com
server:
port: 9527
spring:
application:
name: cloud-gateway-service
cloud:
gateway:
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用为服务名进行路由
routes:
- id: payment_route1 #路由的ID,没有固定规则但要求唯一,建议配合服务名
# uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://cloud-payment-service #lb负载均衡
predicates:
- Path=/payment/get/** #断言,路径相匹配的进行路由
- id: payment_route2 #路由的ID,没有固定规则但要求唯一,建议配合服务名
# uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://cloud-payment-service
predicates:
- Path=/payment/lb/** #断言,路径相匹配的进行路由
# - After=2020-12-16T18:02:16.747+08:00[Asia/Shanghai]
# - Before=2020-12-16T17:02:16.747+08:00[Asia/Shanghai]
- Between=2020-12-16T17:02:16.747+08:00[Asia/Shanghai],2020-12-16T18:02:16.747+08:00[Asia/Shanghai]
# - Cookie=username,zyc
# - Header=X-Request-Id, \d+ #请求头要有X-Request-Id属性并且值为整数的正则表达式
# - Host=**.atguigu.com #host含有**.atguigu.com
- Method=Get # get请求才能通过
spring:
application:
name: cloud-gateway-service
cloud:
gateway:
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用为服务名进行路由
routes:
- id: payment_route1 #路由的ID,没有固定规则但要求唯一,建议配合服务名
# uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://cloud-payment-service #lb负载均衡
predicates:
- Path=/payment/get/** #断言,路径相匹配的进行路由
- id: payment_route2 #路由的ID,没有固定规则但要求唯一,建议配合服务名
# uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://cloud-payment-service
predicates:
- Path=/payment/lb/** #断言,路径相匹配的进行路由
http://localhost:9527/payment/lb?username=1
spring:
application:
name: cloud-gateway-service
cloud:
gateway:
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用为服务名进行路由
routes:
- id: payment_route1 #路由的ID,没有固定规则但要求唯一,建议配合服务名
# uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://cloud-payment-service #lb负载均衡
predicates:
- Path=/payment/get/** #断言,路径相匹配的进行路由
- id: payment_route2 #路由的ID,没有固定规则但要求唯一,建议配合服务名
# uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://cloud-payment-service
predicates:
- Path=/payment/lb/** #断言,路径相匹配的进行路由
# - After=2020-12-16T18:02:16.747+08:00[Asia/Shanghai]
# - Before=2020-12-16T17:02:16.747+08:00[Asia/Shanghai]
- Between=2020-12-16T17:02:16.747+08:00[Asia/Shanghai],2020-12-16T18:02:16.747+08:00[Asia/Shanghai]
# - Cookie=username,zyc
# - Header=X-Request-Id, \d+ #请求头要有X-Request-Id属性并且值为整数的正则表达式
# - Host=**.atguigu.com #host含有**.atguigu.com
- Method=Get # get请求才能通过
- Query=username,\d+ #要有username参数,并且值为整数才能通过
spring:
application:
name: cloud-gateway-service
cloud:
gateway:
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用为服务名进行路由
routes:
- id: payment_route1 #路由的ID,没有固定规则但要求唯一,建议配合服务名
# uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://cloud-payment-service #lb负载均衡
predicates:
- Path=/payment/get/** #断言,路径相匹配的进行路由
- id: payment_route2 #路由的ID,没有固定规则但要求唯一,建议配合服务名
# uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://cloud-payment-service
filters:
- AddRequestParameter=X-Request-Id,1024 # 过滤器工厂会在匹配的请求头上加上一对请求头,名称为X-Request-Id值为1024
package com.atguigu.springcloud.config;
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.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.util.Date;
@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("****** 用户名为空,非法用户");
exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
return exchange.getResponse().setComplete();
}
log.info("用户名为:" + uname);
return chain.filter(exchange);
}
@Override
public int getOrder() {
return 0; //数字越小优先级越高
}
}