本文介绍了一些关于SpringCloud GateWay的基本概念与应用。
网关功能
- 身份认证,权限认证
- 服务路由,负载均衡
- 请求限流
搭建网关
- 添加依赖,nacos服务发现以及网关的依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency>
|
- 编写路由配置以及nacos的地址
server: port: 10010 spring: application: name: gateway
cloud: nacos: server-addr: localhost:8848
gateway: routes: - id: user-service uri: lb://userservice predicates: - Path=/user/**
|
接着向网关所在端口发送请求信息,如http://localhost:10010/user/1,就可以得到userService服务的返回。
服务流程:

路由断言工厂
Spring提供了多种断言工厂,除了Path用来限制路径以外,还可以限制ip,限制时间等

详情实例见SpringCloudGateway文档路由断言工厂
路由过滤器
作用
对请求或者响应做加工处理,比如添加请求头
请求流程
客户端向网关发起请求,请求经过多层过滤器到达服务端,服务端的响应也会经过过滤器再返回给客户端
实例
假如想要给请求头添加一个token
spring: application: name: gateway
cloud: nacos: server-addr: localhost:8848
gateway: routes: - id: user-service uri: lb://userService predicates: - Path=/user/** filters: - AddRequestHeader=token, xxx default-filters: - AddRequestHeader=token, xxx
|
SpringCloud官网提供了31种过滤器,详细可以参考过滤器工厂
全局过滤器
定义一个类并且实现GlobalFilter接口,并且重写函数filter
@Order(-1) @Component public class AuthFilter implements GlobalFilter {
@Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpRequest request = exchange.getRequest(); MultiValueMap<String, String> params = request.getQueryParams(); String authorization = params.getFirst("authorization"); if("admin".equals(authorization)) { return chain.filter(exchange); } ServerHttpResponse response = exchange.getResponse(); response.setStatusCode(HttpStatus.UNAUTHORIZED);
return response.setComplete(); } }
|
@Order(-1)注解是过滤器的执行顺序(或者说优先级),值越小优先级越高
@Component注解将过滤器注册为一个Bean
总结步骤:
- 实现GlobalFilter接口
- 添加@Order和@Component注解至类
- 编写过滤处理逻辑
过滤器执行顺序
每个过滤器都有一个order值,根据order值进行排序
GlobalFilter是由我们自定义order的值的
路由过滤器与默认过滤器的order值由spring决定,spring默认按照声明顺序从1开始递增
当order值一样时,会按照默认过滤器>路由过滤器>全局过滤器的顺序执行
跨域处理
只需要通过spring的配置就可以对网关的跨域进行处理
spring: cloud: gateway: globalcors: add-to-simple-url-handler-mapping: true corsConfigurations: '[/**]': allowedOrigins: - "http://localhost" allowCredentials: true allowedMethods: - GET - OPTIONS - PUT - DELETE - POST allowedHeaders: "*" maxAge: 36000
|
题外话
接SpringCloud-Feign的题外话,果然有时候无法理解某个知识的时候,不妨继续学下去看看,后继拉动前驱了属于是