Zuul,空耳"Z勇".是Netfilx开源的微服务网关,它可以作为所有微服务请求的入口,即消费者优先请求Zuul微服务,由Zuul微服务进行请求的统一调度转发.一般在微服务数量较多、对服务的管理有严格的要求等情况下推荐使用.
Zuul整合了Ribbon,通过Ribbon来定位注册在EurekaServer中的微服务.
Zuul还整合了Hystrix,从而实现了容错监控,所有经过Zuul的请求都会在Hystrix命令中执行.
Zuul的核心是一系列的过滤器,这些过滤器包含的基础功能如下:
身份认证与安全:识别每个资源的验证要求,并拒绝那些与要求不符的请求.
动态路由:动态地将请求路由到不同的后端集群.
压力测试:逐渐增加指向集群的流量,便于了解性能.
负载分配:为每种类型的请求分配容量,当请求超过容量时自动丢弃.
Zuul的整合使用
第一步,按照以下步骤创建一个名为zuul的SpringBoot项目.
1.在springcloud-demo项目处,右键选择"New"--"Module"
2.在左侧的项目选择框中选择"Spring Initializr",创建一个Springboot项目.
3.输入心仪的项目信息
4.选择三个依赖:Spring Web、EurekaClient、Zuul
5.然后一直next下去即可.
6.项目创建好后,检查一下以下依赖是否引入进来了.
第二步,在启动类上添加注解@EnableZuulProxy,表示开启路由代理.
第三步,配置application.yml文件,启动时将其注册到EurekaServer上.
至此,Zuul便已经配置好了.实例名称springcloud-zuul.端口占用8762.
测试之前,需要将消费者的调用方式由原来的"消费者--->生产者"修改为"消费者--->Zuul--->生产者".
默认情况下,Zuul会代理所有注册到EurekaServer上的微服务,Zuul的路由规则如下:
http://Zuul_HOST:Zuul_PORT/微服务在Eureka上的serviceId/**
注意:上图的Zuul调用地址为http://springcloud-zuul/springcloud-provider/user/{id},其中Zuul的serviceId--"springcloud-zuul"被用来代替Zuul的IP地址,是因为消费者服务的restTemplate整合了Ribbon并且添加了@LoadBalanced负载均衡策略的注解,若此处为原本Zuul的IP地址,则会出现No instances available for localhost的错误.
启动eureka、zuul、consumer、provider四个服务.
在浏览器输入http://localhost:8181/user/2,调用消费者获取用户信息的接口.调用结果如下:
浏览器展示:
Zuul后台输出展示:
2020-10-15 16:35:28.152 INFO 12348 --- [nio-8762-exec-1] c.netflix.config.ChainedDynamicProperty : Flipping property: springcloud-provider.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 2147483647
2020-10-15 16:35:28.191 INFO 12348 --- [nio-8762-exec-1] c.n.u.concurrent.ShutdownEnabledTimer : Shutdown hook installed for: NFLoadBalancer-PingTimer-springcloud-provider
2020-10-15 16:35:28.192 INFO 12348 --- [nio-8762-exec-1] c.netflix.loadbalancer.BaseLoadBalancer : Client: springcloud-provider instantiated a LoadBalancer: DynamicServerListLoadBalancer:{NFLoadBalancer:name=springcloud-provider,current list of Servers=[],Load balancer stats=Zone stats: {},Server stats: []}ServerList:null
2020-10-15 16:35:28.200 INFO 12348 --- [nio-8762-exec-1] c.n.l.DynamicServerListLoadBalancer : Using serverListUpdater PollingServerListUpdater
2020-10-15 16:35:28.236 INFO 12348 --- [nio-8762-exec-1] c.netflix.config.ChainedDynamicProperty : Flipping property: springcloud-provider.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 2147483647
2020-10-15 16:35:28.238 INFO 12348 --- [nio-8762-exec-1] c.n.l.DynamicServerListLoadBalancer : DynamicServerListLoadBalancer for client springcloud-provider initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=springcloud-provider,current list of Servers=[192.16.17.116:8081],Load balancer stats=Zone stats: {defaultzone=[Zone:defaultzone; Instance count:1; Active connections count: 0; Circuit breaker tripped count: 0; Active connections per server: 0.0;]
},Server stats: [[Server:192.16.17.116:8081; Zone:defaultZone; Total Requests:0; Successive connection failure:0; Total blackout seconds:0; Last connection made:Thu Jan 01 08:00:00 CST 1970; First connection made: Thu Jan 01 08:00:00 CST 1970; Active Connections:0; total failure count in last (1000) msecs:0; average resp time:0.0; 90 percentile resp time:0.0; 95 percentile resp time:0.0; min resp time:0.0; max resp time:0.0; stddev resp time:0.0]
]}ServerList:org.springframework.cloud.netflix.ribbon.eureka.DomainExtractingServerList@7172ca1
2020-10-15 16:35:29.204 INFO 12348 --- [erListUpdater-0] c.netflix.config.ChainedDynamicProperty : Flipping property: springcloud-provider.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 2147483647
说明Zuul微服务成功地将消费者请求路由到了生产者provider服务上.
zuul服务、生产者服务可拓展为集群服务,消费者的请求流程图将如下:
Zuul的负载均衡测试
Zuul默认整合了Ribbon且利用Ribbon来定位注册在EurekaServer上的微服务,便于动态路由(Ribbon,是Netflix提供的负载均衡器.在SpringCloud中Ribbon可以自动获取服务提供者的地址列表).
为了验证Zuul是否具备负载均衡的能力,那么可以通过以下方案验证:
1.启动多个provider服务,分别占用不同端口,搭建一个小集群.
2.消费者(consumer)通过网关(zuul)调用生产者(provider)集群进行业务处理.
3.根据生产者服务输出的端口号便可判断zuul是否具备负载均衡能力.
验证步骤:
将provider按照不同端口进行启动,然后依次启动eureka、consumer、zuul服务即可.
浏览器访问 http://localhost:8181/user/3,然后多次刷新页面,查看页面响应结果.
多次刷新页面会发现,处理请求的生产者8081和8082会交替执行请求.说明zuul在路由请求时,会按照一定策略进行负载均衡.
Zuul路由端点
Zuul整合Actuator模块后,将会暴露一个路由管理端点/routes,该端点可以方便、直观地查看以及管理Zuul的路由地址.
当启动了consumer服务和provider-8081服务后,浏览器访问http://localhost:8762/actuator/routes可看到路由地址.
ps:值得注意的是,如果provider-8082服务也启动以后(即provider服务存在8081、8082两个实例),provider的路由只会存在一个.
以上便是/routes端点的使用.
当使用GET方法请求此端点即可返回Zuul当前映射的路由列表.(自动刷新)
当使用POST方法请求此端点即可强制刷新Zuul当前映射的路由列表.(强制刷新)