引入maven依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
注意:引入gateway依赖的同时,引入nacos依赖,成为微服务,实现服务之间的调用
配置文件application.yml
如果项目中引用了springboot中内置的tomcat,在地址重写的时候会报异常
cannot be cast to org.springframework.core.io.buffer.NettyDataBufferFactory
如使用servlet则需引入
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
地址转发举例:
spring:
cloud:
gateway:
routes:
- id: host_route
uri: http://example.org
predicates:
- Path=/foo/{segment},/bar/{segment} # 可以转发,但不能转发地址后的参数
- Path=/**/** #匹配所有路径及子路径
这个路由匹配以/foo或者/bar开头的路径,转发到http:example.org/foo或者/bar开头的路径。例如 /foo/1
or /foo/bar
or /bar/baz
.
spring:
cloud:
gateway:
routes:
- id: nacos-consumer 唯一标识
## uri: http://127.0.0.1:8080 建议使用服务名
lb://nacos-consumer
predicates:
- Path=/hi
predicates将网关端口匹配/hi的地址转发到uri下的/hi
http://192.168.56.1:8888/hi->http://192.168.56.1:8000/hi
地址转发
- id: time
uri: lb://leyou-time-server
predicates:
- Path=/time/**
filters:
- RewritePath=/time(?<segment>/?.*),$\{segment}
网关端口下以“/time/(路径)”开头的地址,转发到uri/(路径)的地址
http://192.168.56.1:8888/time/getTime->http://192.168.56.1:8000/getTime
自定义过滤器
1.创建自定义过滤器类实现GatewayFilter
接口,添加到spring容器中,重写public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain)
方法
以校验登录cookie为例
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 获取request和response,注意:不是HttpServletRequest及HttpServletResponse
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
// 获取所有cookie
MultiValueMap<String, HttpCookie> cookies = request.getCookies();
// 如果cookies为空或者不包含指定的token,则相应认证未通过
if (CollectionUtils.isEmpty(cookies) || !cookies.containsKey(this.jwtProperties.getCookieName())) {
// 响应未认证!
response.setStatusCode(HttpStatus.UNAUTHORIZED);
// 结束请求
return response.setComplete();
}
// 获取cookie
HttpCookie cookie = cookies.getFirst(this.jwtProperties.getCookieName());
try {
// 校验cookie
JwtUtils.getInfoFromToken(cookie.getValue(), this.jwtProperties.getPublicKey());
} catch (Exception e) {
e.printStackTrace();
// 校验失败,响应未认证
response.setStatusCode(HttpStatus.UNAUTHORIZED);
return response.setComplete();
}
// 认证通过放行
return chain.filter(exchange);
}
2.创建过滤器工厂,继承AbstractGatewayFilterFactory<Object>
类,并注入到spring容器中,将自定义的过滤器对象注入到重写的apply
方法中
@Component
public class AuthGatewayFilterFactory extends AbstractGatewayFilterFactory<Object> {
@Autowired
private AuthGatewayFilter authGatewayFilter;
@Override
public GatewayFilter apply(Object config) {
return authGatewayFilter;
}
}
3.配置文件使用过滤器,只需要命名前缀