boot版本:2.0.6
cloud版本:Finchley.SR2
网关基本的功能:安全(黑白名单)、监控/埋点、熔断、限流等...
核心概念(router、predicates、filter)
路由。路由是网关最基础的部分,路由信息有一个ID、一个目的URL、一组断言和一组Filter组成。如果断言路由为真,则说明请求的URL和配置匹配
断言。Java8中的断言函数。Spring Cloud Gateway中的断言函数输入类型是Spring5.0框架中的ServerWebExchange。Spring Cloud Gateway中的断言函数允许开发者去定义匹配来自于http request中的任何信息,比如请求头和参数等。
过滤器。一个标准的Spring webFilter。Spring cloud gateway中的filter分为两种类型的Filter,分别是Gateway Filter和Global Filter。过滤器Filter将会对请求和响应进行修改处理
spring cloud gateway路由配置
网关最关键的配置是:router,如果写过前后端分离,一定对前端页面的路由(router)有很深的印象。网关的路由和前端的路由功能类似,转发请求到对应的服务上。下面看以下配置:
spring:
cloud:
gateway:
routes:
- id: user_route
uri: lb://yu-user-service-consul
predicates:
- Path=/users/**
- id: third_route
uri: lb://yu-third-service-consul
predicates:
- Path=/third/**
这个配置含义,可以分成两部分,一部分是现实的含义,一部分是隐含的含义:
- 显示的含义,所有以/users/开头的请求都会被转发到user-service-consul这个服务上,lb代表从注测中心查找user-service-consul的服务进行使用;
- 隐含的含义,所有的以/users/开头的请求都会经过所有的全局GatewayFilter的处理;
注意,id的配置没有特殊的含义,仅仅标识router。lb对应的是在consul注册的服务名
spring cloud gateway跨域配置
请看如下跨域配置:
spring:
cloud:
gateway:
globalcors:
cors-configurations:
'[/**]'://匹配所有的请求
allowedOrigins: "*"// 允许的请求域
allowedMethods:
- GET,HEAD,PUT,POST,DELETE,OPTION// 允许的方法
allowedHeaders:
- memberid,token// 允许的请求头部
gateway的filter
在路由配置中说到一个问题,请求会经过所有全局GatewayFilter的处理。因此下面介绍以下gateway的filter。
gateway的filter分为两类:
- 全局filter,所有的请求都会经过全局filter的处理
- 非全局filter,自由特定的请求才会被处理
其实系统默认的filter,用的很少,大多数都是自定义filter。下面介绍有以下如何定义filter。
自定义全局filter:
@Component
public class XXXGlobleFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
log.info("XXXGlobleFilter>>>>>>>>>>>>>>");
Message message;
ServerHttpRequest request = exchange.getRequest();
//业务处理
return chain.filter(exchange);
}
@Override
public int getOrder() {
return 1;
}
}
自定义全局filter要求实现GlobalFilter和Ordered接口,Ordered接口用于确定自定义filter的执行顺序,GlobalFilter用于实现自定义filter的逻辑。
自定义GatewayFilter:
@Component
public class MyGatewayFilterFactory extends AbstractGatewayFilterFactory<MyGatewayFilterFactory.Config> {
public MyGatewayFilterFactory() {
super(Config.class);
}
@Override
public GatewayFilter apply(Config config) {
System.out.println("MyGatewayFilterFactory 正在执行");
return (exchange, chain) -> chain.filter(exchange);
}
@Override
public List<String> shortcutFieldOrder()
{
return Arrays.asList("my");
}
public static class Config {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}
自定义非全局filter要求实现GatewayFilter和Ordered接口,Ordered接口用于确定自定义filter的执行顺序,GatewayFilter用于实现自定义filter的逻辑。
1、如何使用自定义全局filter?
只要在自定义的全局filter上,添加@Component注解就可以使用,不需要其它配置。
2、如何使用自定义非全局filter?
配置如下:
spring:
cloud:
gateway:
routes:
- id: user_router
uri: lb://yu-user-service-consul
predicates:
- Path=/users/**
filters:
# 关键在下面一句,值为true则开启认证,false则不开启
# 这种配置方式和spring cloud gateway内置的GatewayFilterFactory一致
- GatewayFilterFactory=true
ordered的值越大,优先级越低,越靠后执行
使用上个版本的代码创建项目 yu-gateway,在consul上新建配置文件 yu-gateway,dev
spring:
cloud:
gateway:
globalcors:
cors-configurations:
'[/**]':
allowedOrigins: "*"
allowedMethods:
- GET,HEAD,PUT,POST,DELETE,OPTION
allowedHeaders:
- memberid,token
routes:
- id: user_route
uri: lb://yu-user-service-consul
predicates:
- Path=/users/**
- id: third_route
uri: lb://yu-third-service-consul
predicates:
- Path=/third/**
discovery:
locator:
enabled: true
pom.xml引入依赖
<!-- 与 gateway冲突 因为spring cloud gateway是基于webflux的,
如果非要web支持的话需要导入spring-boot-starter-webflux
而不是spring-boot-start-web -->
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-web</artifactId>-->
<!-- </dependency>-->
<!-- 网关 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
application.yml配置
server:
port: 16000
spring:
application:
name: yu-gateway #服务名称(consul默认注册的id 为 应用服务名+端口)
profiles:
active: dev #选择哪个配置
redis:
database: 11
bootstrap.yml(先加载)
spring:
cloud:
consul:
host: localhost
port: 8500
config:
data-key: data #自定义配置文件路径
format: yaml
name: yu-gateway #读指定配置文件(找不到默认为application)
discovery:
service-name: yu-gateway-consul #consul 注册服务名称
register: true
启动 consul(port:8500),yu-gateway(port:16000),yu-user-service(port:16001),yu-third-service(port:16002)
例如 在user服务 创建接口 users/gateway/test,通过