spring-cloud-starter-gateway是现在比较流行的网关技术,相比较zuul1.0,有很多优势,因为zuul 2.x还没被集成,所以不再评论,我近一段时间研究了下gateway,遇到一些坑,分享给大家解决方案,希望能帮助到大家。
org.springframework.cloud
spring-cloud-starter-zookeeper-discovery
org.apache.zookeeper
zookeeper
因为spring-cloud-starter-zookeeper-discovery里面的Curatorb版本比较高,所以要求zookeeper的版本比较高,如果zk的版本过低,则服务不能启动。我本次整合使用的版本是3.6,之前的3.4就是报了好多的问题:
org.apache.zookeeper
zookeeper
3.6.0
org.slf4j
slf4j-log4j12
log4j
log4j
zk的下载链接为:
https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/
注意解压的时候有的解压工具是会解压错误,选择正确的解压包进行解压。我用的306的解压工具。
server.port=9999
spring.application.name=spring-cloud-gateway
spring.cloud.zookeeper.discovery.instanceHost=127.0.0.1
spring.cloud.zookeeper.discovery.instancePort=${server.port}
#底层配置
spring.cloud.zookeeper.connect-string=127.0.0.1:2181
spring.cloud.zookeeper.discovery.enabled=true
spring.cloud.zookeeper.discovery.register=true
这种感觉是在特殊场景下websocket通信的时候使用。
就是服务的ip或者内网域名进行拼接全路径:http://localhost:8130/
lb://brilliance-consumer,后面进行拼接对应的url的path。
因为body流只能读取一次,所以网关鉴权的时候先读取以后再放回去,但是这中间需要进行释放buffer,要是不释放的话就会产生堆内存溢出的问题。下面是处理代码:
private String resolveBodyFromRequest(ServerHttpRequest serverHttpRequest) {
//对body数据进行校验,当为空时候,直接放过拦截
if(serverHttpRequest.getHeaders().getContentLength() <= 0){
return "";
}
Flux body = serverHttpRequest.getBody();
AtomicReference bodyRef = new AtomicReference<>();
body.subscribe(buffer -> {
CharBuffer charBuffer = StandardCharsets.UTF_8.decode(buffer.asByteBuffer());
//进行手动释放
DataBufferUtils.release(buffer);
bodyRef.set(charBuffer.toString());
});
return bodyRef.get() == null?"":bodyRef.get() ;
}
上面是这段时间研究学习gateway的一些自己的理解和总结,还有一些像是动态路由多节刷新的问题,我的思考方向是通过redis或者配置中心实现多节点的刷新同步更新最新的路由变化信息等,希望能帮助到正在学习gateway的朋友。
页面更新:2024-05-18
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号