目录
一、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