作者回复: 简单看了一下,soul的功能很丰富,治理很全面,有时间要细细研究下,谢谢推荐! 不过关键还是要落地案例,网关产品其实很多,真正接地气在企业大规模落地的并不多,zuul算是一个(在Netflix大规模落地,也被Spring Cloud集成)。
作者回复: 可编程网关,通常指网关提供可编程的API,比如kong/traefik这些都是可编程网关,可以通过API调用直接操作网关的功能,比如添加路由规则,调整限流阀值,或者高级的流量调度A/B测试等。 Faraday本身就是一个SpringBoot应用,代码不多也很简单,它的可编程主要指,普通开发人员主可以通过代码任意调整网关的功能,这是另外一种意义上的可编程,实际使用也更加灵活,当然如果需要,可以给Faraday添加一层API,支持通过API可编程,这个时候可以考虑像Kong一样引入集中存储(kong使用postgresql),存储网关的配置,有一定复杂性和开发量。
作者回复: 我个人的意见,没有哪个特别有优势,各有利弊,zuul简单稳定,但是同步模式,而且spring cloud zuul里头引入hystrix/ribbon之后也会变得比较复杂;spring cloud gateway异步模式,兼备网关和反向代理功能,配置灵活,但是比较新,坑还没有踩平,大规模落地案例不多;traefik兼备网关和反向代理功能,golang语言写性能也不错,而且是属于云原生网关,带UI不错的dashboard,但是golang语言对一般程序员来说是门槛,国内大规模落地案例也不多。如果你已经用了zuul,没有问题可以继续使用,同时可以关注和试点spring cloud gateway。
作者回复: 在理解了微服务原理和Staffjoy项目的代码以后,其中的Faraday网关完全可以用Spring Cloud Gateway来替代,在生产环境中,也建议用Spring Cloud Gateway。作为一个实践拓展环节,建议你尝试将Staffjoy扩展为支持Spring Cloud Gateway,代码应该并不复杂。
作者回复: 一些公司职责分离比较清楚,网关只做反向路由,安全监控等跨横切面的功能,API聚合逻辑交由后台BFF层做。 也有一些公司的聚合是直接做在网关上的,技术上也可以做到,不过从单一职责/关注分离这些架构原则角度讲,这种做法把网关和业务聚合功能耦合了。当然原则也不是绝对,实际还要看其它因素,比如企业的硬件资源是否富裕,一般企业早期业务简单,资源吃紧,这时候把聚合逻辑直接做在网关上也未尝不可,后续业务变大,需要职责分离的时候,可再拆分解耦。
作者回复: 关于第1/2个问题,k8s支持liveness和readiness probe,其中readiness probe是就绪探针,如果配置了就绪探针,那么pod启动时候,只要就绪探针测试不通过,k8s就不会给这个pod发送流量,所以你可以给k8s中的服务(包括zuul)都配置http就绪探针,以保证服务完全启动后才接收流量。 问题3,k8s内置支持服务发现和负载均衡,客户端可以不用ribbon/feign组合,可以直接用裸http进行调用,k8s底层会自动做负载均衡。 关于就绪探针配置可以参考k8s官方文档: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/ 另外我的B站空间有k8s微服务实践视频课程: https://space.bilibili.com/518029478/channel/index
作者回复: 对,我的意思是spring cloud gateway属于初期产品,出来没有几年,目前文档案例都不多,我认为其功能代码都还不够稳定,还在不断迭代改进中。
作者回复: 1. 首先定位到底是什么原因造成的延迟加载问题,建议把zuul的各种filter都先去掉,就留一些最简单的能支持zuul正常工作的最简单的filter(包括最简单的http client),然后用排除法依次排查,定位到具体问题点后再想办法优化解决。 2. k8s中的就绪探针(readiness proble)解决点火问题,保证pod起来后已经正常工作,k8s可以将流量打到pod上,这个是初次接入流量有效。另外k8s还有liveness proble,用来确保pod是活的,如果死了k8s就会重启新的pod,liveness probe在应用服务期间是一直工作的。如果上面1无法解决你的问题,可以临时考虑用liveness probe定期激活你的zuul(注意合理配置检测间隔和超时时间),实现类似保活keep alive的功能,但这个只能算是一个临时的workaround,最好还是要通过上面的1定位问题才能彻底解决。