一. 简介

1. 微服务网关是介于客户端和服务器之间的中间层,所有的外部请求都会先经过微服务网关;

2. 优点

微服务网关封装了应用程序的内部结构,客户端只用跟网关交互,无需直接调用特定微服务的接口,简化开发流程;

易于监控,可在微服务网关收集监控数据并推送到外部系统进行分析;

易于认证,可在微服务网关上进行认证,再将请求转发到后端的微服务,无需在每个微服务中进行认证;

减少了客户端与各个微服务之间的交互次数;

3. Zuul的核心是一系列过滤器,可以完成以下功能:

身份认证与安全;审查与监控;动态路由;压力测试;负载分配;静态响应处理;多区域弹性;

4. 编写Zuul微服务网关

添加spring-cloud-starter-netflix-zuul依赖;

在启动类上添加注解@EnableZuulProxy,声明一个Zuul代理,该代理使用Ribbon来定位注册在Eureka Server中的微服务,还整合了Hystrix,实现了容错;

编写配置文件;

5. 管理端点

/routes端点

使用GET方法访问该端点,可以返回Zuul当前映射的路由列表;

使用POST方法会强制刷新Zuul当前映射的路由列表;

使用/routes?format=details查看更多与路由相关的详情设置;

/filters端点

返回Zuul中当前所有过滤器的详情,并按照类型分类;

6. 过滤器

Zuul的大部分功能都是通过过滤器实现的,Zuul中定义了4种标准过滤器类型,对应请求的典型生命周期;

PRE:在请求被路由之前调用,可实现身份验证,在集群中选择请求的微服务,记录调试信息等;

ROUTING:将请求路由到微服务;

POST:在路由到微服务以后执行,可以用来为响应添加标准的HTTP Header,收集统计信息和指标,将响应从微服务发送给客户端等;

ERROR:在其他阶段发生错误时执行;

@EnableZuulProxy所启用的过滤器:

PRE类型过滤器:

  ServletDetectionFilter:检查请求是否通过Spring Dispatcher;

  FormBodyWrapperFilter:解析表单数据,并未请求重新编码;

  DebugFilter:调试用的过滤器;

  PreDecorationFilter:根据提供的RouteLocator确定路由到的地址以及怎样去路由;

ROUTE类型过滤器:

  SendForwardFilter:该过滤器使用Servlet RequestDispatcher转发请求,转发位置存储在RequestContext的属性FilterConstants.FOWARD_TO_KEY中;

  RibbonRoutingFilter:使用Ribbon,Hystrix和可插拔的HTTP客户端发送请求;

  SimpleHostRoutingFilter:通过Apache HttpClient向指定的URL发送请求;

POST类型过滤器:

  SendResponseFilter:将代理请求的响应写入当前消息;

ERROR类型过滤器:

  SendErrorFilter:若RequestContext.getThrowable()不为bull,则默认转发到/error;

7. 自定义Zuul过滤器

继承ZuulFilter类;

filterType():过滤器的类型;

filterOrder():返回一个int值来指定过滤器的执行顺序;

shouldFilter():返回一个boolean值来判断该过滤器是否要执行;

run():过滤器的具体逻辑;

8. 禁用过滤器

设置zuul.<SimpleClassName>.<filterType>.disable = true;

9. 回退

实现FallbackProvider接口,可以通过ClientHttpResponse fallbackResponse(Throwable cause)方法获取造成回退的原因;

10. 饥饿加载

Zuul整合了Ribbon实现负载均衡,而Ribbon默认是懒加载的,可使用zuul.ribbon.eager-load.enabled = true配置饥饿加载;

11. 隔离策略与线程池

可以使用zuul.ribbon-isolation-strategy = thread 将隔离策略从默认的SEMAPHORE改为THREAD;

可以使用zuul.threadPool.useSepatateThreadPools = true 让每个路由使用独立的线程池;