持续更新在工作中使用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 中使用到了,