SpringCloud学习(九)--使用Zuul组件构建微服务网关

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当前映射的路由列表.(强制刷新)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值