作者回复: 好办法!
作者回复: 如果比较的是绝对性能,那么java/spring开发的网关肯定比不上nginx。但是并不是说java/spring开发的网关就不能承载高并发,Netflix(高峰期占全面1/3的互联网流量)之前采用的Zuul 1.x做其API网关,Zuul就是Java/Servlet开发的,Zuul本身无状态可以水平扩容,可以支撑Netflix全部API流量。另外携程之前API网关也是基于Zuul改造,支撑每日百亿级流量。 Faraday比Zuul更加简单,虽然它只是一个教学用的简化网关,但是它的性能(经过一定的优化)并不会比zuul差。 实际上,企业级网关单纯比较绝对性能意义不大,更重要的是看是否支持水平扩容(容量不够可以简单扩容即可,云环境中就是多起几个实例而已),是否易于维护(nginx偏运维对开发并不友好),监控治理体系是否完善等,这些方面对网关等技术基础设施更为重要。
作者回复: 大致思路:在网关上收集访问日志(Access Log),进入Kafka,后台大数据系统分析访问日志,生成爬虫ip列表(简单的统计单位时间ip访问量,生成top ip列表,复杂的还可以根据访问模式+AI计算出爬虫行为),这个爬虫ip列表再反馈给网关(网关可以定期拉取),网关根据这个ip列表禁止访问。ip列表比较简单粗糙,也可以是用户id列表。
作者回复: 把zuul部署成k8s中的服务service,可以按需扩展(通过replicaset/deployment方式)。 LBS -> zuul service可以。 LBS -> Ingress service -> zuul service也可以。这种更灵活,除了微服务以外,静态或者mvc站点,也可以躲在Ingress后面,通过ingress做灵活的反向代理。
作者回复: 其实网关在整个微服务体系中是比较好理解的,网关在企业网络边界上,是API出入口,负责路由/安全/认证/监控等跨横切面的功能。 可以理解成一个公司的门卫,负责出入流量监控,安全监控,给人指路(路由)等。
作者回复: 网关一般是无状态部署,可以水平扩展,它的前置一般还有负载均衡设备(比如nginx或者硬件如F5)。 服务注册可以采用Eureka服务注册中心,有专门的API支持下线操作,具体可以看其官方文档。 网关选择,zuul已经有很多落地案例,比较稳定,spring cloud gateway也可以尝试。
作者回复: 是网关报跨域错误,还是后台服务报跨域错误? 可以给相关spring应用添加全局跨域配置,参考: https://www.baeldung.com/spring-cors
作者回复: 对,网关一般是无状态集群部署的,前置一般有硬件(如F5)或者软件(如nginx)LB做负载均衡,也有F5 -> nginx -> gateway软硬结合两层负载的,因为nginx配置相比F5方便。