一、Zuul简介
在微服务场景下,随着业务的发展,原来简单的系统会变得越来越复杂,系统会由原来几个独立的微服务逐渐变成几十个、上百个甚至更多。这样如果每个服务都对外暴露自己的服务接口,将使得微服务的调用变得极其复,例如,我们访问用户微服务时,要调用用户微服务的ip1:port1/api,调用书籍微服务时要调用book-server的ip2:port2/api,随着这样的服务越来越多,基于这样的实现,维护成本将是噩梦级别的。
另外,我们可以想到的一些的公共功能,例如对于客户端的身份验证、业务鉴权、流量与并发控制及响应数据脱敏等控制,难道我们需要每个微服务都放置一遍吗?
显然,SpringCloud不会让这些重复的功能和复杂的设计直接暴露给使用者,所以,API服务网关(API Gateway)应运而生。API服务网关帮助开发者隐藏系统架构实现的细节,提供统一的入口供客户端访问,让微服务使用更为友好。同时通过微服务的统一访问控制,简化了客户端开发的复杂度,降低了客户端与微服务之间的通信次数,客户端不需要与多个微服务之间进行通信,也不需要了解各个微服务的详细信息。而且借助API服务网关可统一做切面任务,避免每个微服务自己开发,提升效率,使系统更加标准化,解决了公共功能重复开发的问题。
Zuul就是API服务网关的一种,是Netflix提供的基于JVM路由和服务端的负载均衡器,其参考GOF设计模式中的外观(Facade)模式,将细粒度的服务组合起来提供了一个粗粒度的服务,以便所有请求都导入一个统一的入口,整个服务只需要暴露一个API,对外屏蔽了服务端的实现细节。
通过Zuul组件,可以完成以下功能:
·动态路由:Zuul路由服务器支持与Eureka服务器的整合,可以动态对注册到Eureka服务器中的微服务进行路由映射。另外,Zuul提供一系列的路由规则配置,可以针对生产中的实际情况进行配置,实现微服务路由的灵活控制。
·监控与审查:通过对一些特定的接口设置访问白名单、访问次数、访问频率等各类设置,可以在不影响微服务实现的情况下,对访问实施监控和审查处理。
·身份认证与安全:通过Zuul可以将认证的部分单独抽取出来,让微服务系统无须关注认证的逻辑,只需要关注业务本身即可。
·压力测试:通过Zuul所提供的过滤器功能可以逐渐增加对某一服务集群的流量,以了解服务性能,从而及早对服务运维架构做出调优。
·金丝雀、A/B测试:新版本、新功能可能都需要测试用户对其的反应,通过API服务网关,可以轻松控制部分用户访问服务实例,并且可以对用户行为进行记录和分析,以便对新版本及新功能进行评价,获取应用的最优方案。
·服务迁移:通过Zuul代理可以处理来自旧端点的客户端上的所有流量,将一些请求重定向到新的端点,从而慢慢地用不同的实现来替换旧端点。
·负载剪裁/限流:为每一个负载类型分配对应的容量