赞
踩
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-gateway</artifactId>
- </dependency>
- <dependency>
- <groupId>com.alibaba.cloud</groupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
- </dependency>
端口、注册naocs、gateway配置
- server:
- port: 10010
- spring:
- application:
- name: gateway
- cloud:
- nacos:
- discovery:
- server-addr: localhost:8845
- gateway:
- routes:
- - id: user-service
- uri: lb://userservice
- predicates:
- - Path=/user/**
解析yml中写的Predicate字符串,转化为判断条件
a.11种断言的使用方法:
请转到这里查看=======>11种路由断言工厂-CSDN博客
GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理。
官方提供了三十多种过滤器,我们可以在需要时查看,部分过滤器如下:
通过过滤器可以实现多种功能,例如流量染色,判断请求是否来源于gateway,如果不是gateway转发,将抛出异常。
实现:
application.yml:
- server:
- port: 10010
- spring:
- application:
- name: gateway
- cloud:
- nacos:
- discovery:
- server-addr: localhost:8845
- gateway:
- routes:
- - id: user-service
- uri: lb://userservice
- predicates:
- - Path=/user/**
- filters:
- - AddRequestHeader=passGateway, true

UserController.java
- @GetMapping("/{id}")
- public User queryById(@PathVariable("id") Long id,
- @RequestHeader(value = "PassGateway", required = false) boolean passGateway) {
- if (!passGateway) {
- throw new RuntimeException("passGateway is false");
- }
- System.out.println(passGateway);
- return userService.queryById(id);
- }
- }
如果不经过gateway则抛出异常:
- java.lang.RuntimeException: passGateway is false
- at cn.itcast.user.web.UserController.queryById(UserController.java:45) ~[classes/:na]
- at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_201]
- at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~
给所有的路由请求请求加上过滤器:
- server:
- port: 10010
- spring:
- application:
- name: gateway
- cloud:
- nacos:
- discovery:
- server-addr: localhost:8845
- gateway:
- routes:
- - id: user-service
- uri: lb://userservice
- predicates:
- - Path=/user/**
- # filters:
- # - AddRequestHeader=passGateway, true
- default-filters:
- - AddRequestHeader=passGateway, true

通过实现GlobalFilter接口,并且实现其中的filter方法即可定义全局过滤器
filter方法参数讲解:
- @Override
- public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
- return null;
- }
接口包含以下重要方法:
GatewayFilterChain是 Spring Cloud Gateway 中的一个接口,用于定义一系列的过滤器链。在请求进入网关后,会经过一系列的过滤器对请求进行处理和转换,然后再转发到后端服务。
GatewayFilterChain接口定义了一个 filter方法,调用该filter方法表示放行。
chain.filter(exchange);
gateway中有三种过滤器:Default过滤器、路由过滤器、全局过滤器
Default过滤器和路由过滤器回通过AddRequestHeaderGatrewayFilterFactory这个工厂类转化为GatewayFilter类型的拦截器
【注】AddRequestHeaderGatrewayFilterFactory不是所有的Default过滤器和路由过滤器都是这个工厂类处理,而是对应filter配置文件中写的过滤器对应的工厂类。
全局过滤器会通过GatewayFilterAdapter类转换成GatewayFilter类型的类
七、网关的cors跨域配置
跨域问题:浏览器禁止请求的发起者与服务端发生跨域的Ajax请求
解决方案:
- globalcors:
- add-to-simple-url-handler-mapping: true
- corsConfigurations:
- '[/**]':
- allowedOrigins: # 允许跨域访问的地址
- - "http://localhost:8080"
- - "www.baidu.com"
- allowedMethods: # 允许跨域访问的请求方式
- - "GET"
- - "POST"
- - "PUT"
- - "DELETE"
- allowedHeaders: # 允许请求头中携带的字段
- - "*"
- allowCredentials: true #是否允许携带cookies
- exposedHeaders: # 允许跨域访问的响应头
- - "*"
- maxAge: 3600

踩坑日志:网关配置跨域之后,如果每个服务重新配置跨域,例如使用@CrossOrign注解,会导致出错
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。