91.springcloud gateway整合注册中心zookeeper实践方案设计?

文章目录

前言

spring-cloud-starter-gateway是现在比较流行的网关技术,相比较zuul1.0,有很多优势,因为zuul 2.x还没被集成,所以不再评论,我近一段时间研究了下gateway,遇到一些坑,分享给大家解决方案,希望能帮助到大家。

1.使用zookeeper作为中心:

1.1引入依赖:


            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的解压工具。

1.2属性进行配置:

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

2.gateway中配置服务uri的三种方式:

2.1 ws(websocket)方式:

这种感觉是在特殊场景下websocket通信的时候使用。

2.2 http方式:

就是服务的ip或者内网域名进行拼接全路径:http://localhost:8130/

2.3 lb(注册中心中服务名字)方式:

lb://brilliance-consumer,后面进行拼接对应的url的path。

3.gateway的堆内存泄露问题:

因为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

标签:中心   方案设计   节点   网关   路由   底层   前言   路径   属性   场景   内存   心中   名字   版本   方式   工具   科技

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top