1.zuul是开源的微服务网管,具有以下功能
- 降低客户端的复杂性,客户端只需发送一次请求到zuul,zuul对多个微服务进行整合。
- 解决跨域请求
- 解决了每个服务都需要单独认证(身份认证与安全)
- 解决了客户端与微服务直接通信强耦合,难以重构
- 易于监控,可以收集网关监控数据,推送到外部系统进行分析
- 减少了服务端与客户端的交换次数、
- 动态的路由规则
- 可以进行压力测试
- 可以负载分配
- 可以静态响应处理:直接在网管中直接返回数据。
2.一个简单的微服务网关
- 导入zuul包,
- 启动类中加入@EnableZuulProxy(声明一个zuul代理,包含了ribbon与hystrix)
- 编写配置文件,将zuul注册到eureka中
- 默认zuul代理了所有的eureka上的微服务,路由规则:通过请求路径,zuulhost:zuulpost/微服务serviceId/xxx 通过serviceId定位
3.管理端点
- 与actuator配合使用可以暴露两个端点 routes和filters
4.路由配置
- 直接指定:配置zuul.routes.微服务的serviceId=指定路径
- 忽略相关路径:zuul.ignored-services:xxx,*表示忽略所有微服务
- 路由前缀
- 指定path与url
- 使用正则表达式
5.zuul的header,可以设置敏感header与忽略header
6.zuul的文件上传
- 小文件无需处理直接上传
- 10M以上需要添加zuul前缀
- 超大文件要增加hystrix/ribbon的超时时间
- 命令测试上传 curl -v -H "xxx" -F "file=@small.file" localhist:8040/xx/upload
7.zuul的核心组件-过滤器
zuul中分为了五种过滤器:
- PRE:请求被路由之前,身份认证,选择微服务,记录调试信息等
- ROUTING:将请求路由到微服务的过滤器,构建发送给微服务的请求
- POST:请求到达微服务之后,进行响应添加header,收集信息和指标,发送回客户端
- ERROR:发生错误的过滤器
- 自定义过滤器:直接响应不发送给微服务
- 过滤器间的通讯采用requestContext封装了httpServletRequest,httpServletResponse,目标,错误信息等
8.@EnableZuulProxy与@EnableZuulService
@EnableZuulProxy是@EnableZuulService 的增强版,包括使用ribbon负载均衡,hystrix容错(通多增加的routing类型过滤器RibbonRoutingFilter)
两者都有的FormBodyWrapperFilter:解析表单数据,不高效,没有表单提交时禁用该过滤器
9.zuul整合hystrix后所有经过zuul的请求都会被hystrix保护。服务异常时访问会报错,要实现回退
- 实现FallbackReovider,指定哪个微服务提供回退,返回ClientHttpResponse
- 添加回退后,任意微服务不可用则返回指定信息
- 方法上加入@HystrixCommand(fallbackMethod=“xx”)指定回退方法
10.饥饿加载,zuul整合ribbon后,由于ribbon是懒加载,首次请求较慢
开启饥饿加载:eager-load:enable:true
11.由于hystrix的隔离策略有thread和semaphore,zuul默认为semaphore,可以指定为thread
- 当为thread时,所有路由默认在相同的hystrix线程池中进行
- 可以指定每个路由使用独立线程池
12.zuul的高可用
- 客户端注册到eureka,所有zuul节点都注册到eureka中,浏览器等会访问eureka获取zuul列表,使用ribbon负载均衡的请求zuul集群
- 客户端没有注册在 eureka中时,需要额外的负载均衡,f5,nginx等来实现zuul高可用。
13.整合非jvm服务,非jvm可以操控eureka中的rest节点
- 采用sidecar,更加方便进行整合
- 整合了zuul
- 引入sidecar包,启动类上添加@EnableSideCar(@EnableCircuitBreaker和@EnableZuulProxy的组合)
- 配置文件中注册到eureka,配置监听端口
- 非jvm服务返回satus:UP/DOWN/OUT_OF_SERVICE来实现健康检查
14.zuul聚合微服务,在controller中进行聚合