• 正是那朵玫瑰
    2018-09-15
    老师想问几个问题:
    1、老师实践的zuul是原生的zuul么?并没有使用Spring-cloud-zuul?
    2、每一个客户端如H5、手机、web都对应不同的zuul网关?这样管理是不是太麻烦?
    3、filter文件是怎么管理的,写在zuul项目里面还是直接储存在数据库里面?
    4、老师所说的异步servlet可以优化连接数,servlet是运行在容器里面的如tomcat,目前tomcat支持BIO和NIO,如果使用BIO的话,这种阻塞IO模型是一个连接一个线程,就算异步servlet意义也不大吧;如果是NIO,这种多路复用IO技术,本身就已经支持大量连接了,此时在tomcat里面servlet线程应该是IO线程吧,使用异步servlet,对一些处理慢的请求可以得到优化,但是并不是优化了连接数吧?这是我的理解,所以不太明白老师所说的异步servlet可以优化连接数?望老师可以解答下!
    展开

    作者回复: 你好,你的问题回答如下:1),是原生zuul的简化定制版,不是spring cloud zuul。2),当企业业务和团队到一定规模,zuul网关是要按场景(h5,无线,第三方开放平台等)分集群的,我之前和现在的公司都是这种管理模式,当然管理成本会大一点,一般需要研发一套统一网关治理系统。如果你业务和团队规模小,则没必要分那么细。3)我们做法是存数据库集中管理,zuul网关节点定期到数据库拉取(zuul节点本地有缓存和比对机制)。4),我们在生产实践中发现,不启用AsyncServerlet,当访问量大时候连接数有限制(拒绝额外请求);启用AsyncServerlet后,可以接受的连接数明显增加,当然这个只是前端异步,后端处理和请求还是由容器线程池同步处理的,总体吞吐量没有增加,只是可接受连接数增加了,所以我说优化了连接数。

    
     4
  • DDs moving castle
    2019-02-01
    我司使用的是spring cloud封装的zuul,也想增加动态filter功能,故参考了波波老师的s2g-zuul,将使用数据库动态加载激活filter功能拿过来,期间也发现原本的deactivate通用功能只是将数据库的is_active、is_canary都置为false,并未做其它处理,filter并没有真正停用,还是会调用到,故对停用功能做如下调整:1、更新数据库记录状态保持不变;2、删除本地磁盘filter目录中的groovy文件(因为数据库管理filter也是先写到本地磁盘再加载到内存的,本地磁盘不删,怎么都会再加载进内存);3、根据spring cloud的ZuulFilterInitializer中contextDestroyed()方法的逻辑(也通过dump分析过谁引用了动态加载的filter),将动态filter的实例从FilterRegistry和FilterLoader#hashFiltersByType中删除,想看看是否能够达到删除对动态filter的所有引用后,在下次gc时能被销毁;4、由于使用了apollo配置中心,也将filter的disable property置为true,以防止内存中不能被销毁或其它意外情况发生。经过如上步骤,filter真正是停用了,不会被调用到。但不会被调用到首先是因为已经从FilterLoader#hashFiltersByType中删除,想看看内存中是否被gc销毁,但目前的方法只能通过dump内存(但dump时确实是会触发一次full gc的),从dump数据查看filter实例,确实没有了,不知道这能不能算真正的协助成功??请问有必要这样做吗??
    (题外:本来想通过alibaba Arthas通过不dump的方式查看filter是否被卸载,结果反而发现使用Arthas后发生了内存泄露,在shutdown Arthas后,filter对象仍然被Arthas的Advice引用,而root在tomcat的TaskThread的threadlocal中,尝试很久始终无法卸载)
    展开

    作者回复: 你好,看得出你们已经花费很多功夫去禁用某个filter,实际生产中,我们还是需要评估成本和可靠性,首先,生产上禁用某个filter一般不会频繁发生(毕竟我们没有Netflix那么大规模),所以需要评估这个成本是否值得,大部分情况下,能用apollo配置中心动态控制filter启停就足够了(我们之前就是这么干的),没必要完全内存删除;其次,删除filter可能有潜在内存问题,是否会引入不可靠性?所以还是需要评估下是否一定要这样做,anyway,你已经深入研究了这个问题,也完全理解了这种机制的利弊,相信你已经有自己的答案了,也谢谢你提供的方案思路!

    
     2
  • wyw
    2018-11-06
    老师,filter从激活变为未激活将filter移除 是不是未实现? groovy是不是不能注入spring容器中的bean?

    作者回复: 对的,netflix原生zuul这块还不完善,主要在filter本地加载那块,笨办法只能先删除本地filter临时目录,再重启zuul。或者需自己修复filter加载逻辑,下线的filter本地和内存都要删除。或者也可以用apollo开关控制filter的启用或禁用。groovy应该不在spring容器管理范围内,估计不能用注入。

    
     1
  • 🔰夏天的味道
    2018-07-17
    老师您好,能不能说下您的精简源码和Netflix原版源码之间的对应关系?自己尝试过,找不出老师的源码是从原来哪里精简过来的。

    作者回复: 总体是基于zuul源码,做了少量简化和调整,主要变化:过滤器管理数据访问层从cassandra改为mysql,增加CAT埋点,增加AsyncServlet支持

    
     1
  • 方肚肚。
    2019-10-10
    lab1-lab4的源码没有?

    作者回复: 源码就是定制版s2g-zuul和lab05中的项目
    https://github.com/spring2go/s2g-zuul

     1
    
  • 在路上
    2019-09-19
    老师好
    感觉Zuul和Nginx可以相互替代,是这样的吗?
    在选择时,不考虑公司历史原因,Zuul和Nginx分别适合于哪种场景呢?

    作者回复: 理论上讲,Zuul能做的, Nginx都能做到,相反,Nginx能做的,Zuul也能做到(可以扩展)。实际上,Nginx是一种通用高性能的反向代理,常常作为网站的前置反向代理和负载均衡器用;而zuul则一般用在API网关场景。很多公司同时用Nginx + Zuul。

    
    
  • 飞翔
    2019-08-23
    老师 求教 我启动s2g-zull 在intellij 遇到这个问题, 我觉得可能是找不到client.xml
    注意,上述目录和zuul在要在同一逻辑盘下。 这句话怎么理解呀
    我的目录是
       data
           temp
           s2g-zuul-master
           appdatas
           applogs
    我用的是intellij和mac
    [08-22 14:56:32.735] [ERROR] [CatLogger] [08-22 14:56:32.731] [ERROR] [CatLogger] error when read url:http://org.cat/cat/s/launch?ip=10.20.25.63&env=unknown&hostname=dw135-198-201-228.dhcpw.sest.att.com,exception is org.catjava.io.FileNotFoundException: /data/applogs/cat/cat_client_20190822.log (No such file or directory)
    2019-08-22 14:56:32,741 [ZuulFilterPoller] ERROR io.spring2go.zuul.filters.ZuulFilterPoller- ZuulFilterPoller run error!
    java.lang.ExceptionInInitializerError: null
        at com.dianping.cat.message.internal.DefaultMessageManager.<init>(DefaultMessageManager.java:45) ~[cat-client-3.0.0.jar:na]
        at com.dianping.cat.message.internal.DefaultMessageManager.<clinit>(DefaultMessageManager.java:52) ~[cat-client-3.0.0.jar:na]
        at com.dianping.cat.message.internal.DefaultMessageProducer.<init>(DefaultMessageProducer.java:33) ~[cat-client-3.0.0.jar:na]
        at com.dianping.cat.message.internal.DefaultMessageProducer.<clinit>(DefaultMessageProducer.java:37) ~[cat-client-3.0.0.jar:na]
        at com.dianping.cat.Cat.initializeInternal(Cat.java:311) ~[cat-client-3.0.0.jar:na]
        at com.dianping.cat.Cat.checkAndInitialize(Cat.java:72) ~[cat-client-3.0.0.jar:na]
        at com.dianping.cat.Cat.getProducer(Cat.java:211) ~[cat-client-3.0.0.jar:na]
        at io.spring2go.zuul.filters.ZuulFilterPoller$1.run(ZuulFilterPoller.java:94) ~[s2g-zuul-core-1.0.0.jar:na]
    Caused by: java.lang.RuntimeException: Error when get cat router service, please contact cat support team for help!
        at com.dianping.cat.configuration.ApplicationEnvironment.loadClientConfig(ApplicationEnvironment.java:151) ~[cat-client-3.0.0.jar:na]
        at com.dianping.cat.configuration.DefaultClientConfigService.<init>(DefaultClientConfigService.java:72) ~[cat-client-3.0.0.jar:na]
        at com.dianping.cat.configuration.DefaultClientConfigService.<clinit>
    展开

    作者回复: 同一逻辑盘的意思,只要data和s2g-zuul在同一个盘下,例如都在c盘或者d盘,不要分开在不同盘下就可以了,不需要把s2g-zuul放在data里面。

    你启动了cat服务器吗?

    从错误看,好像确实没找到client.xml,而且日志文件也找不到,你尝试下调整s2g-zuul到data目录之外。

     1
    
  • tongmin_tsai
    2019-02-23
    波波老师,你好,你提供的AsyncServerlet,要替换成这个servlet,是需要在源代码中修改,重新编译打包使用,还是可以有其他配置的方式使用?

    作者回复: 你好,我提供的s2g-zuul,启用AsyncServlet是默认在web.xml中配置的,可以打成war包部署到tomcat,一般较新的tomcat(7以上)都支持async servlet。

    
    
我们在线,来聊聊吧