当前位置 : 首页 » 文章分类 :  开发  »  Spring-Cloud-Netflix-Zuul

Spring-Cloud-Netflix-Zuul

Spring Cloud Zuul 笔记
Zuul 是 Netflix 开源的微服务网关,它可以和 Eureka、Ribbon、Hystrix等组件配合使用。Zuul的核心是一系列的过滤器,这些过滤器帮助我们实现路由转发和认证等功能。

zuul工作流程

在zuul中, 整个请求的过程是这样的,首先将请求给 zuulservlet 处理,zuulservlet 中有一个 zuulRunner 对象,该对象中初始化了 RequestContext :作为存储整个请求的一些数据,并被所有的zuulfilter共享。zuulRunner中还有 FilterProcessor,FilterProcessor作为执行所有的zuulfilter的管理器。FilterProcessor从filterloader 中获取zuulfilter,而zuulfilter是被filterFileManager所加载,并支持groovy热加载,采用了轮询的方式热加载。有了这些filter之后,zuulservelet首先执行的 Pre 类型的过滤器,再执行 route 类型的过滤器,最后执行的是 post 类型的过滤器,如果在执行这些过滤器有错误的时候则会执行 error 类型的过滤器。执行完这些过滤器,最终将请求的结果返回给客户端。

maven添加依赖

<dependencyManagement>
  <dependencies>
    <!-- 管理Spring Cloud生态各组件的版本 -->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-dependencies</artifactId>
      <version>Finchley.SR3</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency<name />
  </dependencies>
</dependencyManagement>

<!-- Netflix Zuul 微服务网关 -->
<dependencies>
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
  </dependency>
</dependencies>

Spring Boot 中启用 Zuul

应用主类使用 @EnableZuulProxy 注解开启Zuul

@EnableZuulProxy
@SpringCloudApplication
public class Application {
    public static void main(String[] args) {
        new SpringApplicationBuilder(Application.class).web(true).run(args);
    }
}

EnableZuulProxy 源码如下

package org.springframework.cloud.netflix.zuul;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.context.annotation.Import;

@EnableCircuitBreaker
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(ZuulProxyMarkerConfiguration.class)
public @interface EnableZuulProxy {
}

路由转发

application.properties

zuul.routes.route-name.path: /backend/**
zuul.routes.route-name.url: http://localhost:${server.port}

或 application.yml

zuul:
  routes:
    route-name:
      path: /backend/**
      url: http://localhost:${server.port}

其中 route-name 是路由的名字,可以任意定义,每个路由规则由一个 path 和一个 url 组成, 匹配path的请求会被转发到 url

之后,所有 /backend/** 的请求都会自动转发到 http://localhost:${server.port}

过滤器

定义过滤器只需要继承 ZuulFilter 抽象类实现其定义的四个抽象函数就可对请求进行拦截与过滤。

filterType():返回一个字符串代表过滤器的类型,在zuul中定义了四种不同生命周期的过滤器类型,具体如下:

  • PRE:该类型的filters在Request routing到源web-service之前执行。可以进行一些权限认证,日志记录,或者额外给Request增加一些属性供后续的filter使用;
  • ROUTING:该类型的filters用于把Request routing到源web-service,源web-service是实现业务逻辑的服务。这里使用HttpClient请求web-service; 一般用于构建发送给微服务的请求,并使用Apache HttpClient或Netflix Ribbon构建和发送原始HTTP请求的位置。
  • POST:该类型的filters在ROUTING返回Response后执行。用来实现对Response结果进行修改,收集统计数据以及把Response传输会客户端;
  • ERROR:上面三个过程中任何一个出现错误都交由ERROR类型的filters进行处理。

filterOrder():通过int值来定义过滤器的执行顺序

shouldFilter():返回一个boolean类型来判断该过滤器是否要执行,所以通过此函数可实现过滤器的开关。

run():过滤器的具体逻辑。需要注意,这里我们通过ctx.setSendZuulResponse(false)令zuul过滤该请求,不对其进行路由,然后通过ctx.setResponseStatusCode(401)设置了其返回的错误码,当然我们也可以进一步优化我们的返回,比如,通过ctx.setResponseBody(body)对返回body内容进行编辑等。

服务网关Spring Cloud Zuul(Finchley版本)
https://www.jianshu.com/p/f5cdce29890d

跟我学Spring Cloud(Finchley版)-16-Zuul
http://www.itmuch.com/spring-cloud/finchley-16/

Spring Cloud构建微服务架构(五)服务网关(Brixton版,比较老旧)
http://blog.didispace.com/springcloud5/

Spring Cloud 4.8 Router and Filter: Zuul (路由配置讲的比较多)
https://my.oschina.net/roccn/blog/826655

上一篇 Vue

下一篇 HikariCP

阅读
评论
1,013
阅读预计4分钟
创建日期 2019-05-21
修改日期 2019-05-21
类别

页面信息

location:
protocol:
host:
hostname:
origin:
pathname:
href:
document:
referrer:
navigator:
platform:
userAgent:

评论