来自蚂蚁课堂
链接:http://www.mayikt.com/
概述
- 该项目提供了一个用于在Spring MVC之上构建API网关的库。Spring Cloud Gateway旨在提供一种简单而有效的方法来路由到API,并为它们提供跨领域的关注,例如:安全性,监视/指标和弹性。
Spring Cloud Gateway功能:
- 建立在Spring Framework 5,Project Reactor和Spring Boot 2.0之上
- 能够匹配任何请求属性上的路由。
- 谓词和过滤器特定于路由。
- Hystrix断路器集成。
- Spring Cloud DiscoveryClient集成
- 易于编写的谓词和过滤器
- 请求速率限制
- 路径改写
pom引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
yml添加配置
server:
port: 80
spring:
cloud:
nacos:
discovery:
##服务的注册
server-addr: 192.168.112.144:8848
config:
server-addr: 192.168.112.144:8848
file-extension: yaml
gateway:
routes:
- id: mayikt-weixin
uri: lb://mayikt-weixin
predicates:
- Path=/mayikt-weixin/**
filters:
- SwaggerHeaderFilter
- StripPrefix=1
- id: mayikt-member
uri: lb://mayikt-member
predicates:
- Path=/mayikt-member/**
filters:
- SwaggerHeaderFilter
- StripPrefix=1
x-forwarded:
enabled: false
discovery:
locator:
enabled: true
application:
name: mayikt-gateway
简单过滤器新建.class配置类
/*自定义全局过滤器*/
@Component
public class FluidControlGlobalGatewayFilter implements GlobalFilter, Ordered {
@Autowired
private RedisUtil redisUtil;
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 请求信息
ServerHttpRequest request = exchange.getRequest();
// 返回信息
ServerHttpResponse response = exchange.getResponse();
// 如若为接口文档放行
if (request.getURI().toString().contains("api-docs")) {
return chain.filter(exchange);
}
// 如若请求会员服务直接放行
if (request.getURI().toString().contains("ly-weixin")) {
return chain.filter(exchange);
}
// 获取请求头
String token = exchange.getRequest().getHeaders().getFirst("token");
// 如若token不为空
if (!StringUtils.isEmpty(token)) {
// redisUtil 网上搜的工具类,一搜一堆
String userId = redisUtil.get(token);
// 如若userId不为空
if (!StringUtils.isEmpty(userId)) {
// 移除旧 token 防止重复使用
redisUtil.delete(token);
// 在相应头中设置新 token
String responseToken = TokenUtils.getToken("token", "");
response.getHeaders().add("token", responseToken);
// 放行
return chain.filter(exchange);
}
}
response.setStatusCode(HttpStatus.BAD_REQUEST);
String jsonString = this.setDataBuffer(500, "token is null", null).toJSONString();
DataBuffer buffer = response.bufferFactory().wrap(jsonString.getBytes());
return response.writeWith(Mono.just(buffer));
// return chain.filter(exchange);
}
private JSONObject setDataBuffer(Integer code, String message, Object data) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("code", code);
jsonObject.put("msg", message);
jsonObject.put("data", data);
return jsonObject;
}
@Override
public int getOrder() {
return -1000;
}
}
网友评论