上一篇介绍了服务的调用,这篇接着之前的话题,来说说SpringCloud中zuul的使用及搭建网关的那点事。
首先,我们要知道什么是网关?
网关,是一个系统中前置的统一入口,介于客户端和服务器端之间的中间层,主要用来处理非业务功能,提供路由请求、鉴权、监控、缓存、限流等功能。客户端发起的请求首先通过网关,进行非业务功能处理,在根据路径的路由,定位到具体的服务节点上。
同时系统使用服务路由的功能,可以在对外提供服务时,只暴露网关中配置的调用地址,而调用方就不需要了解后端具体的微服务主机。可以有效的保护真实的服务地址信息。Zuul是一个微服务网关,首先是一个微服务。也是会在Eureka注册中心中进行服务的注册和发现。也是一个网关,请求应该通过Zuul来进行路由。Zuul网关不是必要的。是推荐使用的。SpringCloud zuul的相关介绍
1,为什么要使用微服务网关?
不同的微服务一般会有不同的网络地址,而客户端可能需要调用多个服务接口才能完成一个业务需求,若让客户端直接与各个微服务通信,会有以下问题:
1)客户端会多次请求不同微服务,增加了客户端复杂性;
2)存在跨域请求,处理相对复杂;
3)认证复杂,每个服务都需要独立认证;
4)难以重构,多个服务可能将会合并成一个或拆分成多个;
2,使用网关的优缺点?
优点:
-
所有的外部请求先经过微服务网关进行交互,无需调用特定微服务接口,简化了开发;
-
服务网关=路由转发+过滤器
-
路由转发:接收请求,转发到后端的微服务上;
-
过滤器:可在服务网关中可以完成一系列的横切功能(权限校验)
缺点:增加了网关,多了一层转发,服务性能会下降;
3,使用zuul 的作用?Zuul可以通过加载动态过滤机制,从而实现以下各项功能:
- 验证与安全保障: 识别面向各类资源的验证要求并拒绝那些与要求不符的请求。
- 审查与监控: 在边缘位置追踪有意义数据及统计结果,从而为我们带来准确的生产状态结论。
- 动态路由: 以动态方式根据需要将请求路由至不同后端集群处。
- 压力测试: 逐渐增加指向集群的负载流量,从而计算性能水平。
- 负载分配: 为每一种负载类型分配对应容量,并弃用超出限定值的请求。
- 静态响应处理: 在边缘位置直接建立部分响应,从而避免其流入内部集群。
- 多区域弹性: 跨越AWS区域进行请求路由,旨在实现ELB使用多样化并保证边缘位置与使用者尽可能接近。
4,zuul的工作原理?
zuul的核心是一系列的filters, 其作用可以类比Servlet框架的Filter,或者AOP。zuul把Request route到 用户处理逻辑 的过程中,这些filter参与一些过滤处理,比如Authentication,Load Shedding等。
Zuul提供了一个框架,可以对过滤器进行动态的加载,编译,运行。
Zuul的过滤器之间没有直接的相互通信,他们之间通过一个RequestContext的静态类来进行数据传递的。RequestContext类中有ThreadLocal变量来记录每个Request所需要传递的数据。
Zuul的过滤器是由Groovy写成,这些过滤器文件被放在Zuul Server上的特定目录下面,Zuul会定期轮询这些目录,修改过的过滤器会动态的加载到Zuul Server中以便过滤请求使用。
下面有几种标准的过滤器类型:
Zuul大部分功能都是通过过滤器来实现的。Zuul中定义了四种标准过滤器类型,这些过滤器类型对应于请求的典型生命周期。
1) PRE:这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等。
2) ROUTING 务。这种过滤器用于构建发送给微服务的请求,并使用Apache HttpClient或Netfilx Ribbon请求微服务。
3) POST:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等。
4) ERROR:在其他阶段发生错误时执行该过滤器。
内置的特殊过滤器
zuul还提供了一类特殊过滤器,分别为:StaticResponseFilter和SurgicalDebugFilter;
-
StaticResponseFilter:StaticResponseFilter允许从Zuul本身生成响应,而不是将请求转发到源。
-
SurgicalDebugFilter:SurgicalDebugFilter允许将特定请求路由到分隔的调试集群或主机。
自定义的过滤器
除了默认的过滤器类型,Zuul还允许我们创建自定义的过滤器类型。
5,Zuul和Nginx的区别相同点:Zuul和Nginx都可以实现负载均衡、反向代理(隐藏真实ip地址),过滤请求,实现网关的效果不同点:
-
Nginx–c语言开发
-
Zuul–java语言开发
-
Zuul负载均衡实现:采用ribbon+eureka实现本地负载均衡
-
Nginx负载均衡实现:采用服务器实现负载均衡
-
Nginx相比zuul功能会更加强大,因为Nginx整合一些脚本语言(Nginx+lua)
-
Nginx适合于服务器端负载均衡
-
Zuul适合微服务中实现网关
Zuul服务搭建
我们先在父级项目里引入zuul的依赖服务
再创建Zuul微服务模块,并添加pom依赖如下:
添加yml配置:
然后添加启动类:
启动所有服务:
测试:
推荐阅读:SpringCloud微服务项目实战 - 微服务调用详解(附面试题)
SpringCloud微服务项目实战,服务注册与发现(附面试题)
Spring Cloud微服务项目实战--Eureka服务搭建
扫码关注公众号,发送关键词获取相关资料:
-
发“Springboot”领取电商项目实战源码;
-
发“SpringCloud”领取学习实战资料;
- 发“SpringCloud实战”领取SpringCloud实战源码;