微服务项目之电商--6.zuul架构图和项目搭建及面向服务的路由网关配置及过滤器

本文深入解析Zuul微服务网关的工作原理,包括其架构、配置、过滤器机制、负载均衡与熔断策略,以及如何实现高可用性。通过实例演示,展示Zuul在微服务架构中的关键作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

 

一、Zuul网关

1、zuul架构图

2、zuul项目搭建

3、面向服务的路由网关配置

 取消前缀

4、过滤器

 zuulFilter4个最重要的方法

 正常流程:

异常处理:

 自定义过滤器

负载均衡和熔断

 zuul的高可用

 总结组件


一、Zuul网关

Zuul是Netflix开源的微服务网关,它可以和eureka、ribbon、hytrix等组件配合使用。Zuul的核心是一系列的过滤器,这些过滤器可以完成以下功能。

身份认证与安全:识别每个资源验证要求,并拒绝那些与要求不符合的请求。

审查与监控:在边缘位置追踪有意义的验证的数据和统计结果,从而带来精确的生产视图。

动态路由:动态的将请求路由到不同的后端集群。

压力测试:逐渐增加指向集群的流量,以了解性能。

负载分配:为每一种负载类型分配对应容量,并启用超出限定值的请求。

静态响应处理:在边缘位置直接建立部分响应,从而避免其转发到内部集群

多区域弹性:跨越AWS Region 进行请求路由,旨在实现ELB(elastic load balancing)使用的多样化,以及让系统的边缘更加贴近系统的使用者。

1、zuul架构图

2、zuul项目搭建

创建gateway项目,引入zuul依赖

 @EnableZuulServer的功能过于单一,缺少很多过滤器

所以使用@EnableZuulProxy

 路由名:hehe(随便配置)

path:拦截路径

url:转发的地址即端口

 运行访问

3、面向服务的路由网关配置

引入eureka客户端,拉取对应的服务

 配置yml文件,由于通过eureka客户端管理了多个服务地址,所以对应的zuul应该只需要配置对应的user-service

 我们看底层依赖可以看到它,在没有指定对应服务的地址,就能直接访问,说明它肯定实现了负载均衡

 为了简化配置,路由名直接是user-service(与服务名同),后面直接根路径

运行,访问

 

在没有配置consumer-service的时候,直接访问

由于zuul能够将所有的列表全部拉取下来,而且在正常配置的时候基本上路由名都是和服务名一样,所以zuul底层就将他们拉取下来,直接配置好了。所以上面的配置其实是多余的

 但是有的时候为了访问者的方便,就会直接修改服务名为方便使用的

但是我们还是可以直接访问user-service因为默认的映射还在

 但是对于一些服务,不想暴露给外界,只提供给内部开发者调用

 取消前缀

在之前我们写了user/user两个重复的

但是这样写也挺麻烦的,所以可以修改取消前缀映射 

 

4、过滤器

zuul作为网关的其中一个重要功能,就是实现请求的鉴权。而这个动作我们往往是通过zuul提供的过滤器来实现的。

zuulFilter类

 

 zuulFilter4个最重要的方法

是过滤器的顶级父类。在这里我们看一下其中定义的4个最重要的方法

public abstract ZuulFilter implements IZuulFilter{

     abstract public String filterType(); //过滤器类型

     abstract public int filterOrder();  //过滤器顺序

     boolean shouldFilter();  //来自IZuulFilter,是否开启过滤

     Object run() throws ZuulException;  //IZuulFilter  过滤逻辑

}

filterType:返回字符串,代表过滤器的类型。包含以下4种:

pre:请求在被路由之前执行

routing:在路由请求时调用

post:在routing和error过滤之后调用

error:处理请求时发生错误调用

 正常流程:

请求到达首先会经过pre类型过滤器,而后到达routing类型,进行路由,请求就到达真正的服务提供者,执行请求,返回结果后,会到达post过滤器,而后返回响应。

异常处理:

整个过程中,pre或者routing过滤器出现异常,都会直接进入error过滤器,再error处理完毕后,会将请求交给POST过滤器,最后返回给用户。

如果error过滤器自己出现了异常,最终也会进入post过滤器,而后返回。

如果post过滤器出现异常,会跳转到error过滤器,但是与pre和routing不同的是,请求不会再到达POST过滤器了。

内置过滤器

 自定义过滤器

业务场景:模拟一个登陆的校验。基本逻辑:如果请求中有access-token参数,则认为请求有效,放行。

创建LoginFilter类继承ZuulFilter方法

 规定过滤器类型

选择过滤器级别,在其对请求装饰之前进行过滤处理

 开启过滤器

查看源码我们看到它是如何获取request的

 引入工具jar

 判断是否为空,以及是否存在空格

底层的判断 

 返回对应信号状态

 在access-token存在的情况下就能够访问

负载均衡和熔断

zuul中默认是已经集成了ribbon负载均衡和hystrix熔断机制。但是所有的超时策略都是走的默认,比如熔断超时时间只有1s,很容易就触发了。因此建议我们手动进行配置:

大小写非常重要!否则会出现配置不生效

配置的对应类 

 

 

 超时的时长配置是:(ribbonreadtimeout+ribbonconnecttimeout)*2

所以下面readtimeout=(2000+500)*2=5000 < timeoutinMilliseconds  (必须小于hytrix时长)

 

 zuul的高可用

启动多个zuul服务,自动注册到eureka,形成集群。如果是服务内部访问,你访问zuul,自动负载均衡,没问题、

但是,zuul更多是外部访问,pc端、移动端等。他们无法通过eureka进行负载均衡,那么该怎么办?

此时,我们会使用其他的服务网关,来对zuul进行代理。比如:Nginx

现在的zuul集群架构

 使用Nginx实现集群的主从复制

 总结组件

如今来说我们学了springcloud的五个组件:eureka、ribbon、hystrix、feign、zuul

其他还有很多组件:

spring-cloud-config:统一配置中心,自动去git拉取最新的配置,缓存。使用Git的Webhook钩子,去通知配置中心,说配置发送了变化,配置中心会通过消息总线去通知所有的微服务,更新配置。

spring-cloud-bus:消息总线

spring-cloud-stream:消息通信

spring-cloud-hytrix-dashboard:容错统计,形成图形化界面

spring-cloud-sleuth:链路追踪 结合zipkin

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值