目录
关是什么
API 关
zuul是什么
zuul原理架构图及流程
关是什么
在微服务架构中,一个系统往往由多个微服务组成,而这些服务可能部署在不同机房、不同地区、不同域名下。这种情况下,客户端(例如浏览器、手机、软件工具等)想要直接请求这些服务,就需要知道它们具体的地址信息,例如 IP 地址、端口 等。
这种客户端直接请求服务的方式存在以下问题:
1、当服务数量众多时,客户端需要维护大量的服务地址,这对于客户端来说,是非常繁琐复杂的。
2、在某些场景下可能会存在跨域请求的问题。
3、身份认证的难度大,每个微服务需要独立认证。
我们可以通过 API 关来解决这些问题,下面就让我们来看看什么是 API 关。
API 关
API 关是一个搭建在客户端和微服务之间的服务,我们可以在 API 关中处理一些非业务功能的逻辑,例如权限验证、监控、缓存、请求路由等。
API 关就像整个微服务系统的门面一样,是系统对外的唯一入口。有了它,客户端会先将请求发送到 API 关,然后由 API 关根据请求的标识信息将请求转发到微服务实例。
对于服务数量众多、复杂度较高、规模比较大的系统来说,使用 API 关具有以下好处:
- 客户端通过 API 关与微服务交互时,客户端只需要知道 API 关地址即可,而不需要维护大量的服务地址,简化了客户端的开发。
- 客户端直接与 API 关通信,能够减少客户端与各个服务的交互次数。
- 客户端与后端的服务耦合度降低。
- 节省流量,提高性能,提升用户体验。
- API 关还提供了安全、流控、过滤、缓存、计费以及监控等 API 管理功能。
zuul是什么
zuul 是netflix开源的一个API Gateway 服务器, 本质上是一个web servlet应用。
承当 关,分发路由。
zuul原理架构图及流程
Zuul提供了一个框架,可以对过滤器进行动态的加载,编译,运行。
Zuul的过滤器之间没有直接的相互通信,他们之间通过一个RequestContext的静态类来进行数据传递的。RequestContext类中有ThreadLocal变量来记录每个Request所需要传递的数据。
Zuul的过滤器是由Groovy写成,这些过滤器文件被放在Zuul Server上的特定目录下面,Zuul会定期轮询这些目录,修改过的过滤器会动态的加载到Zuul Server中以便过滤请求使用。
过滤器类型:
Zuul大部分功能都是通过过滤器来实现的。Zuul中定义了四种标准过滤器类型,这些过滤器类型对应于请求的典型生命周期。
1、 PRE:这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等。
2、ROUTING:这种过滤器将请求路由到微服务。这种过滤器用于构建发送给微服务的请求,并使用Apache HttpClient或Netfilx Ribbon请求微服务。
3、 POST:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等。
4、 ERROR:在其他阶段发生错误时执行该过滤器。
自定义实现过滤器
继承父类ZuulFilter。在父类中提供了4个抽象方法,分别是:filterType, filterOrder, shouldFilter, run。其功能分别是:
filterType:方法返回字符串数据,代表当前过滤器的类型。可选值有-pre, route, post, error。
- pre – 前置过滤器,在请求被路由前执行,通常用于处理身份认证,日志记录等;
- route – 在路由执行后,服务调用前被调用;
- error – 任意一个filter发生异常的时候执行或远程服务调用没有反馈的时候执行(超时),通常用于处理异常;
- post – 在route或error执行后被调用,一般用于收集服务信息,统计服务性能指标等,也可以对response结果做特殊处理.
filterOrder:返回int数据,用于为同filterType的多个过滤器定制执行顺序,返回值越小,执行顺序越优先。
shouldFilter:返回boolean数据,代表当前filter是否生效。
run:具体的过滤执行逻辑。如pre类型的过滤器,可以通过对请求的验证来决定是否将请求路由到服务上;如post类型的过滤器,可以对服务响应结果做加工处理(如为每个响应增加footer数据).
过滤器的生命周期
文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览92005 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!