一. 简介
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 让每个路由使用独立的线程池;