SpringCloud_Zuul

定义:

Zuul是Netflix的基于JVM的路由器和服务器端负载均衡器。

Zuul属性

1
2
3
4
5
//默认
//最大连接数
zuul.host.maxTotalConnections = 200
//预制连接
zuul.host.maxPerRouteConnections = 20

所有路由的默认Hystrix隔离模式(ExecutionIsolationStrategy)都是 SEMAPHORE。
可以将zuul.ribbonIsolationStrategy更改为THREAD,这是官方推荐的选择(使用熔断的线程池来达到线程级别隔离)

Zuul routers 配置模式

服务ID模式

  • 要跳过自动添加的服务,请将zuul.ignored-services设置为服务ID模式列表。
    如果服务与忽略包含则按照显式配置的路由映射模式匹配
    1
    2
    3
    4
    5
    6
    7
    application.yml:

    zuul:
    ignoredServices: '*'
    routes:
    users: /myusers/**

    只开放users服务,请求路径就是/myusers/**,所有前缀是/myusers的HTTP请求都指向users服务。

  • 要对路由进行更细粒度的控制,可以单独指定路径和serviceId
    1
    2
    3
    4
    5
    6
    application.yml:

    routes:
    users:
    path: /myusers/**
    serviceId: users_service

    所有前缀为/myusers的HTTP请求都指向users_service服务。

    物理地址模式

  • 制定地址url
    1
    2
    3
    4
    5
    6
    application.yml:

    routes:
    users:
    path: /myusers/**
    url: https://example.com/users_service

    这些简单的url-routes不会作为HystrixCommand执行,也不会使用Ribbon对多个URL进行负载均衡。

Zuul 请求

Zuul使用的默认HTTP客户端现在由Apache HTTP Client支持,而不是不推荐使用的Ribbon RestClient。
要使用RestClient或okhttp3.OkHttpClient,请分别设置ribbon.restclient.enabled = true或ribbon.okhttp.enabled = true。

通过 Zuul实现文件上传

如果您使用@EnableZuulProxy,您可以使用代理路径上传文件,只要文件很小,它就可以工作。对于大型文件,有一个替代路径绕过 zuul 中的Spring DispatcherServlet(以避免多部分处理)。
换句话说,如果你有zuul.routes.customers = /customers / *,那么你可以将大文件POST到/zuul / customers / *。
servlet路径通过zuul.servletPath外部化。
*
如果代理路由引导您完成功能区负载平衡器,则极大文件也需要提升超时设置**

1
2
3
4
5
6
application.yml. 

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 60000
ribbon:
ConnectTimeout: 3000
ReadTimeout: 60000

Zuul Timeout

如果您想为通过Zuul代理的请求配置套接字超时和读取超时,您有两种选择,具体取决于您的配置:
如果Zuul使用服务发现,则需要使用功能区属性配置这些超时。

  • ribbon.ReadTimeout
  • ribbon.SocketTimeout

如果通过指定URL配置了Zuul路由,则需要使用

  • zuul.host.connect-timeout-millis
  • zuul.host.socket-timeout-millis。

Zuul内部使用Ribbon来调用远程URL,并且在第一次调用时,Spring Cloud会默认懒加载Ribbon客户端。
可以使用以下配置更改Zuul的此行为,并将导致在应用程序启动时急切地加载子功能区相关的应用程序上下文。

  • application.yaml
    1
    2
    3
    4
    zuul:
    ribbon:
    eager-load:
    enabled: true
  • application.properties
    1
    zuul.ribbon.eager-load.enabled= true
    服务发现配置—如果Zuul正在使用服务发现,则需要关注两个超时,Hystrix超时(因为默认情况下所有路由都包含在Hystrix命令中)和功能区超时。
    Hystrix超时需要考虑功能区读取和连接超时PLUS将为该服务发生的重试总次数。
    默认情况下,Spring Cloud Zuul会尽力为您计算Hystrix超时,除非您明确指定Hystrix超时。

Hystrix的熔断超时计算方式

1
2
(ribbon.ConnectTimeout + ribbon.ReadTimeout) * (ribbon.MaxAutoRetries + 1) * 
(ribbon.MaxAutoRetriesNextServer + 1)

application.yaml

1
2
3
4
5
ribbon:
ReadTimeout:100 //读取等待时间
ConnectTimeout:500 //连接建立时间
MaxAutoRetries:1 //最大重试次数
MaxAutoRetriesNextServer:1 // 重试服务器个数

如上配置,Hystrix的熔断超时时间为2400ms

禁用Hystrix的熔断超时功能

1
hystrix.command.default.execution.timeout.enabled = false

@EnableZuulProxy Filters

创建DiscoveryClientRouteLocator,用于从DiscoveryClient(例如Eureka)以及属性加载路径定义。
为DiscoveryClient中的每个serviceId创建一个路由。添加新服务后,将刷新路由。
除了前面描述的过滤器之外,还安装了以下过滤器(与普通的Spring Bean一样):

  • Pre filters:
    • PreDecorationFilter:根据提供的RouteLocator确定路由的位置和方式。它还为下游请求设置各种与代理相关的标头。
  • Route filters:
    • RibbonRoutingFilter:使用Ribbon,Hystrix和可插入HTTP客户端发送请求。服务ID位于RequestContext属性FilterConstants.SERVICE_ID_KEY中。此过滤器可以使用不同的HTTP客户端:
    1.Apache HttpClient:默认客户端。
    2.Squareup OkHttpClient v3:通过在类路径上设置com.squareup.okhttp3:okhttp库并设置ribbon.okhttp.enabled = true来启用。
    3.Netflix Ribbon HTTP客户端:通过设置ribbon.restclient.enabled = true启用。
    此客户端具有限制,包括它不支持PATCH方法,但它也具有内置重试。
    • SimpleHostRoutingFilter:通过Apache HttpClient向预定URL发送请求。URL位于RequestContext.getRouteHost()中。