Zuul 应用手册

Zuul Java Springboot 微服务

Posted by gomyck on August 15, 2019

持续更新在工作中使用zuul遇到的问题以及一些配置说明

—-集成篇—-

Zuul组件为微服务体系提供软路由能力, 统一了流量入口, 通过zuul, 可以把声明的URI动态路由到指定的服务提供者, zuul本身具备负载均衡能力, 可以通过配置负载策略以及服务降级策略, 有效控制高并发冲击, 使下层应用具备高弹性, 高安全性(出口隔离), 高级的zuul应用可以跨AWS区域(云服务器地理区域)做路由, 使前端服务请求更加接近服务节点

通过统一流量入口, 可以在zuul服务中做一些数据分析工作, 跟踪用户行为, 记录请求链路日志, 监控系统整体健康状况等工作

使用zuul服务非常容易

1. 引入依赖(需要配置springCloud依赖管理)

使用springboot脚手架新建一个springboot空项目

1
2
3
4
5
<!-- 注册中心依赖 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>

2. 在启动类上加入注解

1
2
@EnableZuulProxy

3. 配置yml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
spring:
  application:
    name: GOMYCK-GATEWAY
  profiles:
    active: pro

eureka:
  client:
    #是否把当前应用注册到eureka
    register-with-eureka: true
    #是否获取注册列表
    fetch-registry: true
    #eureka服务地址, 可以有多个, 当有多个时, 会形成集群服务, eureka共享注册表
    service-url:
      defaultZone: http://eureka-8888.com:8888/eureka/ #, http://eureka-8889.com:8889/eureka/
    registry-fetch-interval-seconds: 5
  instance:
    hostname: gomyck-gateway.com
    instance-id: ${spring.application.name}[email protected]@-${spring.cloud.client.ip-address}:${server.port}
    prefer-ip-address: true

server:
  port: 7777

#如果想在页面上访问路由节点: /actuator/routes /actuator/routes/details 需要配置以下属性(高版本需要)
management:
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
      health:
        show-details: ALWAYS

hystrix:
  metrics:
    enabled: true
    polling-interval-ms: 50000
  command:
    default:
      execution:
        isolation:
          thread:
            #超时后熔断
            timeoutInMilliseconds: 10000

zuul:
  #手动配置一些路由信息
  routes:
    projectManager:
      path: /xxx/**
      serviceId: xxx-xxx
  sensitive-headers:
  host:
    #socket超时时间
    socket-timeout-millis: 5000
    #请求响应超时时间
    connection-request-timeout-millis: 5000

gomyck:
  zuul:
    white-url-list:
      - /gomyck-auth/authorization/login
      - /gomyck-auth/authorization/logout

ribbon:
  eureka:
    enabled: true
  #请求响应超时时间
  ReadTimeout: 5000
  #socket超时时间
  SocketTimeout: 5000

4.启动服务

在启动之前, 请确保有注册中心存在, 本文配置使用Eureka为服务发现注册中心, 具体使用方式请看上一篇博文

确保Eureka server服务启动后, 启动本项目

访问 http://eureka-8888.com:8888 即可进入注册中心管理页面

可以看到服务列表中存在:

GOMYCK-GATEWAY n/a (1) (1) UP (1) - GOMYCK-GATEWAY-0.0.1-SNAPSHOT-192.168.x.xxx:7777

—-总结篇—-

1.查看zuul路由表的URI: {contextPath}:{port}/actuator/routes/

2.zuul默认集成了actuator组件, 可以通过配置来打开对应的配置

1
2
3
4
5
6
7
8
9
10
11
management:
  endpoints:
    web:
      exposure:
        #暴露的端点(health info beans httptrace shutdown)
        include: '*'
  endpoint:
      #健康状态端点配置
      health:
        #服务健康状态展示
        show-details: ALWAYS

3.actuator端点列表 点我查看

4.zuul在路由请求的时候, 默认会把客户端的请求头忽略, 在实际应用中, 认证服务会需要透传一些请求头信息, 需要修改zuul配置, 来把前端上送的请求头透传到下层服务:

1
2
3
zuul:
  #冒号后边什么都不用写, 写这个配置, zuul会把所有前端请求头透传到服务提供者
  sensitive-headers:

5.如果使用Eureka的服务列表, 一定要记得开启以下配置, 否则当服务下线重新上线时, zuul不能及时更新路由表, 在路由请求时, 会抛异常:

com.netflix.client.ClientException: Load balancer does not have available server for client

1
2
3
ribbon:
  eureka:
    enabled: true

6.zuul里的一些超时配置(熔断器的超时时间配置, 通常来说要大于以下配置)

1
2
3
4
5
6
7
#如果使用serviceId进行路由, 那么以下配置生效
ribbon:
  #请求响应超时时间
  ReadTimeout: 5000
  #socket超时时间
  SocketTimeout: 5000

1
2
3
4
5
6
7
8
9
10
11
12
13
#如果使用url进行路由, 那么以下配置生效
zuul:
  routes:
    xxx:
      path: /xxx/**
      #url路由
      url: http://xxx.com/xxx
  host:
    #socket超时时间
    socket-timeout-millis: 5000
    #请求响应超时时间
    connection-request-timeout-millis: 5000

7.@EnableZuulProxy @EnableZuulServer的区别

EnableZuulProxy是EnableZuulServer的超集, 使用EnableZuulServer开启zuul服务时, 会开启一些zuul内置的一些filter, 如果使用EnableZuulProxy开启zuul服务, 会在EnableZuulServer的filter基础上, 额外增加一些其他的filter

官网是这么说的:

@EnableZuulProxy vs. @EnableZuulServer Spring Cloud Netflix installs a number of filters, depending on which annotation was used to enable Zuul. @EnableZuulProxy is a superset of @EnableZuulServer. In other words, @EnableZuulProxy contains all the filters installed by @EnableZuulServer. The additional filters in the “proxy” enable routing functionality. If you want a “blank” Zuul, you should use @EnableZuulServer.

8.zuul拦截器的使用

点我查看

9.zuul context 的 setSendZuulResponse 方法的作用:

追踪这个方法, 可以看到是设置 requestContext 类的 sendZuulResponse 属性的值, 而这个属性在两个 filter 中使用到了,