springcloud:网关组件zuul的功能介绍、运行机制

Spring Cloud集群中,用于内部通信的组件有服务管理组件Eureka、负载均衡组件Ribbon。不过如果是集群提供了Api或者WEB服务的话,就需要与外部进行通信。这时候需要一个代理层作为集群的大门,网关可以将集群的服务隐藏在后面,而对于外部客户端来说只需关心网关的配置,不许关系集群的内部结构。

官方定义:Zuul 是在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。Zuul 相当于是设备和 Netflix 流应用的 Web 网站后端所有请求的前门。Zuul为微服务集群提供代理、过滤和路由等功能。

一、Zuul的功能

Zuul会把外部的请求过程分为不同阶段,每个阶段提供一系列的过滤器,这些过滤器实现了以下功能:

1、身份验证和安全性

对需要身份验证的资源进行过滤,拒绝处理不符合身份认证的请求。

2、观察和监控

跟踪重要的数据,为我们展示准确的请求状况

3、动态路由

将请求动态路由到不同的服务集群

4、负载均衡

设置每种请求的处理能力,删除那些超出限制的请求

5、静态响应处理

提供静态的过滤器,直接响应一些请求,而不将它们转发到集群内部

6、路由多样化

除了将请求路由到Spring Cloud集群内部,还可以将请求路由到其他服务

二、过滤器运行机制

当程序被@EnableZuul修饰后,Spring容器进行初始化时会将zuul的相关配置初始化(包括Springboot中用于注册Servlet的ServletRegistrationBean),而ZuulServlet的service方法用于执行各类过滤器。下图为http请求在ZuulServlet内的生命周期。

ZuulServlet.service()接收到请求后,首先执行pre阶段的过滤器,执行routing阶段的过滤器

,最后执行post阶段的过滤器。routing阶段的过滤器将请求转发到源服务(第三方的web服务或spring cloud的集群服务)。如果pre或者routing阶段的过滤器时,如果出现异常,则执行error过滤器。而整个过程中Http请求、响应、状态等信息都会封装再一个RequestContext对象中。

而过滤器的执行优先级由其序号大小决定的,优先级顺序号越小,有限度越高。

三、路由配置

zuul提供强大的路由功能,其按照一定的规则进行请求转发。集中在routing阶段:

1、简单路由

外部访问的所有请求都被转发到源服务上,使用SimpleHostRoutingFilter过滤器实现。其中path可以省略。url是以http:或者https:开头的。

zuul: 
  routes:
    test:
      path: /test/163
      url: http://www.163.com

实现机制:过滤器使用HttpClient进行转发。先把HttpServletRequest是相关数据转成HttpClient的请求实体(HttpRequest),再使用CloseableHttpClient进行转发。

为了保证性能,使用了HttpClient的线程池功能,对目标主机的最大连接数(默认200)和初始连接数(默认20)可以进行修改。

2、跳转路由

外部访问网关的A地址,会跳转到B地址上。这类路由使用SendForwardFilter 实现。url是以forward开头的。

  routes:
    sale:
      path: /test/**
      url: forward: /source/b

实现机制:调用RequestDispatcher的forward方法进行跳转。

3、Ribbon路由

当网关作为Eureka客户端注册到Eureka服务器时,可以通过配置serviceid将请求转发到集群的服务中,此类路由使用 RibbonRoutingFilter实现。

zuul:
  routes:
    restTestRoute:
      path: /rest-tpl-sale/**
      serviceId: zuul-sale-service

当路由配置,不是简单路由格式也不是挑战路由格式,那么就会默认使用Ribbon过滤器,并将url作为serviceid。

4、自定义路由规则

如果内置的三种路由配置无法满足用户需求,可以进行自定义路由规则。操作也非常简单,只需要在自定义的配置类中创建一个PatternServiceRouteMapper

@Configuration
public class MyConfig {

	/**
	 * 访问网关的 /xxxxx/**,将会被路由到 zuul-xxxxx-service 服务进行处理
	 */
	@Bean
	public PatternServiceRouteMapper patternServiceRouteMapper() {
		return new PatternServiceRouteMapper(
				"(zuul)-(?<module>.+)-(service)", "${module}/**");
	}
}

第一个参数是serviceid,第二参数是path。例如访问test/**的请求都被路由到zuul-test-service上面去。

5、忽略路由

这种路由用于设计若干个服务不被路由的情景,使用zuul.ignoredPatterns属性来配置。

zuul:
  ignoredPatterns: /test/noRoute

配置后,除了/test/noroute的访问外,其他/test路径的请求都被路由到zuul-test-service。

四、集群

上图是一个简单的Spring cloud集群。zuul作为网关,服务提供方提供/service/{id}的查找服务,服务调用者对外提供/consume/{id}服务,并通过调用服务提供方服务实现逻辑。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值