SpringCloud(六)Gateway网关
目录
一.Gateway网关说明
1.Gateway配置
2.Gateway拦截器
一.Gateway网关说明
spring-cloud-Gateway是spring-cloud的一个子项目。而zuul则是netflix公司的项目,只是spring将zuul集成在spring-cloud中使用而已。
还有一种说法是因为zuul2连续跳票和zuul1的性能表现不是很理想,所以催生了spring孵化Gateway项目。
总的来说,gateway性能大大强于zuul。
1.Gateway配置
首先在pom.xml文件中导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
server:
port: 8999
spring:
application:
name: gateway
cloud:
gateway:
discovery:
locator:
enabled: true
routes:
- id: feign-customer
#lb://feign-customer
uri: lb://feign-customer
order: 0
predicates:
- Path=/foo/**
filters:
- StripPrefix=1
logging:
level:
org.springframework.cloud.gateway: debug
表示注册中心生效,我们可以通过注册中心的服务名进行路由转发
discovery.locator.enabled=true;
表示路由ID
- id: feign-customer
指向注册中心的服务。lb://服务ID或者http://localhost:8080完整的url
uri: lb://feign-customer
表示要进行的断言
predicates:
表示path地址,根据url,以foo开头的会被转发到feign-customer服务,可以使用通配符地址
- Path= /foo/**
过滤器
filters:
从前面截取一个,忽略第一个/foo,其他路径进行转发
- StripPrefix= 1
2.Gateway拦截器
/**
* @Author wangyu
* @Description: Copyright 2019 yiYuan Networks 上海义援网络科技有限公司. All rights reserved.
* @Date 2019/5/16
*/
@Component
public class WrapperResponseFilter implements GlobalFilter, Ordered {
@Override
public int getOrder() {
// -1 is response write filter, must be called before that
return -2;
}
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//前置拦截器
ServerHttpResponse originalResponse = exchange.getResponse();
DataBufferFactory bufferFactory = originalResponse.bufferFactory();
ServerHttpResponseDecorator decoratedResponse = new ServerHttpResponseDecorator(originalResponse) {
@Override
public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
//后置拦截器
if (body instanceof Flux) {
Flux<? extends DataBuffer> fluxBody = (Flux<? extends DataBuffer>) body;
return super.writeWith(fluxBody.map(dataBuffer -> {
// probably should reuse buffers
byte[] content = new byte[dataBuffer.readableByteCount()];
dataBuffer.read(content);
// 释放掉内存
DataBufferUtils.release(dataBuffer);
String rs = new String(content, Charset.forName("UTF-8"));
Map<String,Object> response = new HashMap<>();
response.put("code","1");
response.put("message","请求成功");
response.put("data",rs);
// byte[] newRs = JSON.toJSONString(response).getBytes(Charset.forName("UTF-8"));
// originalResponse.getHeaders().setContentLength(newRs.length);//如果不重新设置长度则收不到消息。
//请求的返回结果
return bufferFactory.wrap(rs.getBytes());
}));
}
return super.writeWith(body);
}
};
return chain.filter(exchange.mutate().response(decoratedResponse).build());
}
}
还没有评论,来说两句吧...