天天看点

SpringCloud系列(六)ZUUL服务网关

文章目录

    • ZUUL服务网关是什么
      • ZUUL服务架构
    • ZUUL 路由(Router)
      • ZUUL的简单使用
    • ZUUL 过滤器(Filter )
      • zuulFilter的使用场景
      • Filter 的生命周期

ZUUL服务网关是什么

服务网关是微服务架构中一个不可或缺的部分。通过服务网关统一向外系统提供REST API的过程中,除了具备服务路由、均衡负载功能之外,它还具备了权限控制(鉴权)等功能。Spring Cloud Netflix中的Zuul就担任了这样的一个角色,为微服务架构提供了前门保护的作用,同时将权限控制这些较重的非业务逻辑内容迁移到服务路由层面,使得服务集群主体能够具备更高的可复用性和可测试性。

ZUUL官网:https://github.com/Netflix/zuul

ZUUL服务架构

SpringCloud系列(六)ZUUL服务网关
SpringCloud系列(六)ZUUL服务网关

ZUUL 路由(Router)

ZUUL的简单使用

1)新建一个服务

SpringCloud系列(六)ZUUL服务网关

2)引入依赖

<!-- zuul依赖 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<!-- 导入eureka客户端 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
           

3)编写启动类

@SpringBootApplication
@EnableEurekaClient // 开启Eureka客户端
@EnableZuulProxy    // 开启服务网关
public class ZuulApp {
    public static void main(String[] args) {
        System.out.println("Zuul网关服务启动。。。8885");
        SpringApplication.run(ZuulApp.class, args);
    }
}
           

4)配置zuul

server.port=8885

spring.application.name=springcloud-zuul-gateway

# springcloud-consumer:指定路由ID,名字是自定义的
# path:映射的地址
zuul.routes.springcloud-consumer.path=/consumer/**
# url:springcloud-consumer实际的服务地址,写服务名即可
zuul.routes.springcloud-consumer.url=springcloud-consumer

# 让zuul去eureka获取服务
# 获取服务列表的周期
eureka.client.registry-fetch-interval-seconds=5
# eureka的服务地址
eureka.client.service-url.defaultZone=http://eureka-8888:8888/eureka/
# 当调用getHostname获取实例的hostname时,返回ip而不是host名称
eureka.instance.prefer-ip-address=true
# 指定ip地址
eureka.instance.ip-address=127.0.0.1
           

5)测试

先启动 eureka服务,再启动其他服务

SpringCloud系列(六)ZUUL服务网关

访问 http://localhost:8885/consumer/queryUserList

SpringCloud系列(六)ZUUL服务网关

可以看出,zuul服务网关已经可以正常运作了。

这便是 ZUUL服务网关中路由(Router)的功能。接下来我们来了解zuul的另一大功能—过滤器(Filter)。

ZUUL 过滤器(Filter )

zuulFilter的使用场景

  1. 请求鉴权:一般放在pre类型,如果发现没有访问权限,直接就拦截了
  2. 异常处理:一般会在error类型和post类型过滤器中结合来处理。
  3. 服务调用时长统计:pre和post结合使用。

filter的类型

  • pre:请求在被路由之前执行
  • routing:在路由请求时调用
  • post:在routing和errror过滤器之后调用
  • error:处理请求时发生错误调用

Filter 的生命周期

Filter 的生命周期有 4 个,分别是 “PRE”、“ROUTING”、“POST” 和“ERROR”。

  1. PRE:这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等。
  2. ROUTING:这种过滤器将请求路由到微服务。这种过滤器用于构建发送给微服务的请求,并使用 Apache HttpClient 或 Netfilx Ribbon 请求微服务。
  3. POST:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的 HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等。
  4. ERROR:在其他阶段发生错误时执行该过滤器。 除了默认的过滤器类型,Zuul 还允许我们创建自定义的过滤器类型。例如,我们可以定制一种 STATIC 类型的过滤器,直接在 Zuul 中生成响应,而不将请求转发到后端的微服务。
SpringCloud系列(六)ZUUL服务网关
  • 正常流程:
    • 请求到达首先会经过pre类型过滤器,而后到达routing类型,进行路由,请求就到达真正的服务提供者,执行请求,返回结果后,会到达post过滤器。而后返回响应。
  • 异常流程:
    • 整个过程中,pre或者routing过滤器出现异常,都会直接进入error过滤器,再error处理完毕后,会将请求交给POST过滤器,最后返回给用户。
    • 如果是error过滤器自己出现异常,最终也会进入POST过滤器,而后返回。
    • 如果是POST过滤器出现异常,会跳转到error过滤器,但是与pre和routing不同的时,请求不会再到达POST过滤器了。

Zuul中Filter的默认执行顺序

SpringCloud系列(六)ZUUL服务网关