SpringCloud之Zuul服务网关详解

 更新时间:2023年08月29日 10:20:15   作者:疯狂的帆  
这篇文章主要介绍了SpringCloud之Zuul服务网关详解,服务网关是微服务架构中一个不可或缺的部分,通过服务网关统一向外系统提供REST API的过程中,除了具备服务路由、均衡负载功能之外,它还具备了权限控制(鉴权)等功能,需要的朋友可以参考下

ZUUL服务网关是什么

服务网关是微服务架构中一个不可或缺的部分。

通过服务网关统一向外系统提供REST API的过程中,除了具备服务路由、均衡负载功能之外,它还具备了权限控制(鉴权)等功能。

Spring Cloud Netflix中的Zuul就担任了这样的一个角色,为微服务架构提供了前门保护的作用,同时将权限控制这些较重的非业务逻辑内容迁移到服务路由层面,使得服务集群主体能够具备更高的可复用性和可测试性。

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

ZUUL服务架构

在这里插入图片描述

在这里插入图片描述

ZUUL 路由(Router)

ZUUL的简单使用

1)新建一个服务

在这里插入图片描述

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服务,再启动其他服务

在这里插入图片描述

访问 //localhost:8885/consumer/queryUserList

在这里插入图片描述

可以看出,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 中生成响应,而不将请求转发到后端的微服务。

在这里插入图片描述

  • 正常流程:
    • 请求到达首先会经过pre类型过滤器,而后到达routing类型,进行路由,请求就到达真正的服务提供者,执行请求,返回结果后,会到达post过滤器。而后返回响应。
  • 异常流程:
    • 整个过程中,pre或者routing过滤器出现异常,都会直接进入error过滤器,再error处理完毕后,会将请求交给POST过滤器,最后返回给用户。
    • 如果是error过滤器自己出现异常,最终也会进入POST过滤器,而后返回。
    • 如果是POST过滤器出现异常,会跳转到error过滤器,但是与pre和routing不同的时,请求不会再到达POST过滤器了。

Zuul中Filter的默认执行顺序

在这里插入图片描述

到此这篇关于SpringCloud之Zuul服务网关详解的文章就介绍到这了,更多相关Zuul服务网关内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java基础篇之serialVersionUID用法及注意事项详解

    Java基础篇之serialVersionUID用法及注意事项详解

    这篇文章主要给大家介绍了关于Java基础篇之serialVersionUID用法及注意事项的相关资料,SerialVersionUID属性是用于序列化/反序列化可序列化类的对象的标识符,我们可以用它来记住可序列化类的版本,以验证加载的类和序列化对象是否兼容,需要的朋友可以参考下
    2024-02-02
  • springboot获取根目录下lib目录下文件位置

    springboot获取根目录下lib目录下文件位置

    在 Spring Boot 项目中,如果你有一个 lib 目录,并且需要访问这个目录下的文件,你可以通过几种不同的方式来获取该文件的位置,下面小编就来和大家详细讲讲
    2024-12-12
  • java开发实现五子棋游戏

    java开发实现五子棋游戏

    这篇文章主要为大家详细介绍了java开发实现五子棋游戏,具有双人对战和人机对战功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • java8 stream自定义分组求和并排序的实现

    java8 stream自定义分组求和并排序的实现

    这篇文章主要介绍了java8 stream自定义分组求和并排序的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • java并发编程之cas详解

    java并发编程之cas详解

    这篇文章主要介绍了java并发编程之cas详解,涉及cas使用场景和cas用作原子操作等内容,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • @RequestParam 和@RequestBody注解的区别解析

    @RequestParam 和@RequestBody注解的区别解析

    在 Spring MVC 中,我们可以使用 @RequestParam 和 @RequestBody 来获取请求参数,但它们在用法和作用上有一些区别,这篇文章主要介绍了@RequestParam 和@RequestBody注解的区别,需要的朋友可以参考下
    2023-06-06
  • Java实现经典游戏推箱子的示例代码

    Java实现经典游戏推箱子的示例代码

    《推箱子》推箱子是一个古老的游戏,目的是在训练你的逻辑思考能力。本文将利用Java实现这一经典的小游戏,并采用了swing技术进行了界面化处理,需要的可以参考一下
    2022-02-02
  • FeignClient实现接口调用方式(不同参数形式)

    FeignClient实现接口调用方式(不同参数形式)

    这篇文章主要介绍了FeignClient实现接口调用方式(不同参数形式),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 图解Springboot集成七牛云并实现图片上传功能过程

    图解Springboot集成七牛云并实现图片上传功能过程

    在实际开发中 ,基本都会有应用到文件上传的场景,但随着或多或少的需求问题,之前有在springboot上用过七牛云实现图片上传,今天因为某些原因又重新使用了下七牛云因此想总结下七牛云
    2021-11-11
  • Java swing仿酷狗音乐播放器

    Java swing仿酷狗音乐播放器

    这篇文章主要为大家详细介绍了Java swing实现音乐播放器,Java开发图形界面程序音乐播放器仿酷狗音乐播放器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06

最新评论