微服务网关 —— SpringCloud Netflix Zuul

这篇具有很好参考价值的文章主要介绍了微服务网关 —— SpringCloud Netflix Zuul。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述

Spring Cloud Zuul 是 Spring Cloud Netflix 子项目的核心组件之一,可以作为微服务架构中的 API 网关使用,有以下用途:

  • 鉴权:对于访问每个服务的请求进行鉴权,拒绝鉴权失败的请求
  • 监控:对系统的请求进行监控,记录请求响应日志,实时统计当前系统的访问量以及监控状态
  • 压力测试:帮助对集群进行可控的压力测试
  • 灰度测试:灰度发布可以保证整体系统的稳定,在初始灰度时就可以发现问题并进行调整
  • 动态路由:基于请求路径,将请求分发到指定的客户端
  • 负载控制:统一控制客户端请求压力,超过压力的请求直接拒绝
  • 静态响应处理:在边缘位置直接建立部分响应,避免其流入内部集群

构建 Zuul 网关

创建 zuul-service 项目,引入依赖,本项目基于 SpringBoot 2.3.1,SpringCloud Hoxton.SR12

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>

在 application.yml 配置文件中添加如下配置:

server:
  port: 9080 # 指定运行端口

spring:
  application:
    name: zuul-service # 指定服务名称
    
zuul:
  routes:
    blog:
      path: /baidu/**
      url: https://www.baidu.com  # url用于配置符合path的请求路径路由到的服务地址

在启动类中添加 @EnableZuulProxy 注解

@EnableZuulProxy
@SpringBootApplication
public class ZuulServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(ZuulServiceApplication.class, args);
    }
}

Spring Cloud Netflix Zuul 提供了许多过滤器,具体取决于启用的 Zuul 的注解,@EnableZuulProxy@EnableZuulServer 的超集,包含 @EnableZuulServer 安装的所有过滤器

启动项目,在浏览器中输入访问地址 http://localhost:9080/baidu,发现请求被路由到百度界面,Zuul 服务搭建成功


Zuul 路由配置

上一节,我们使用路径的方式匹配路由规则,path 的结构如下

# 其中customName 为用户自定义名称
zuul:
  routes:
    customName:
      # 可使用的通配符有以下几种:
      # ?:单个字符
      # *:任意多个字符,不包含多级路径
      # **:任意多个字符,包含多级路径
      path: xxx

对于 url 路径匹配,还可以使用服务名称匹配

zuul:
  routes:
    # users为用户自定义名称
    users:
      path: /users/**
      # serviceId用于配置符合path的请求路径路由到的服务名称
      serviceId: users-service

服务名称匹配也可以使用简化的配置

zuul:
  routes:
    service-provider:
      path: /users/**

如果只配置 path 不配置 serviceld,则 customName 相当于服务名称,即 service-provider 会被当作服务名称,使用 serviceId 要将 zuul 服务注册到注册中心使用,比如 Eureka,从而拉取注册服务列表名称完成调用

如果想排查配置,可以使用 ignored-services

zuul:
  ignoredServices: "*"
  routes:
    users:
      path: /users/**

ignored-services 可以配置不被 zuul 管理的服务列表,多个服务名称使用号分隔,配置的的务将不被 Zuul代理,在上面的实例中,除了用户服务外,所有的服务均被忽略

可以通过 zuul.prefix 配置路由前缀,例如:

zuul:
  prefix: /api
  routes:
    users:
      path: /users/**

配置请求路径前缀,所有基于此前缀的请求都由 Zuul 网关提供代理


Zuul 过滤器

Zuul 定义过滤器用来过滤代理请求,提供额外功能逻辑,如权限验证、日志记录等,filter 与 filter 之间不直接通信,在请求线程中会通过 RequestContext 来共享状态,它内部是用 ThreadLocal 实现的

Zuul 过滤器分为前置过滤、路由后过滤、后置过滤以及异常过滤:

  • 前置过滤:在请求进入 Zuul 后,立刻执行的过滤逻辑
  • 路由后过滤:在请求进入 Zuul 后,Zuul 实现请求路由,并在远程服务调用之前执行过滤逻辑
  • 后置过滤:远程服务调用结束后执行过滤逻辑
  • 异常过滤:任意一个过滤器发生异常或远程服务调用无结果反馈时(调用超时)执行过滤逻辑

ZuulFilter 类及其父类 IZuulFilter 共提供了四种抽象方法:

  • filterType:返回字符串数据,代表当前过滤器的类型,可选值有:
    • pre:前置过滤器,在请求被路由前执行,通常用于处理身份认证、日志记录等
    • route:在路由执行后,服务调用前被调用
    • error:任意一个 filter 发生异常或远程服务调用没有反馈时执行(超时),通常用于处理异
    • post:在 route 或 error 执行后被调用,一般用于收集服务信息、统计服务性能指标等,也可以对 response 结果做特殊处理
  • filterOrder:返回 int 数据,用于为同一种 filterType 的多个过滤器定制执行顺序,返回值越小,执行顺序越优先
  • shouldFilter:返回 boolean 数据,代表当前 filter 是否生效
  • run:具体的过滤执行逻辑

具体实例如下:文章来源地址https://www.toymoban.com/news/detail-675173.html

@Component
public class tokenFilter extends ZuulFilter {

    @Override
    public String filterType() {
        //定义过滤器的类型,pre 表示在请求被路由前执行
        return "pre";
    }

    @Override
    public int filterOrder() {
        //返回int 数据,用于为同一种 filterType 的多个过滤器定制执行顺序
        //返回值越小,执行顺序越优先
        return 0;
    }

    @Override
    public boolean shouldFilter() {
        //判断过滤器是否生效,true 代表生效
        return true;
    }

    @Override
    public Object run() throws ZuulException {
        //获取上下文
        RequestContext currentContext = RequestContext.getCurrentContext();
        //获取 request 对象
        HttpServletRequest request = currentContext.getRequest();
        //从请求头获取 token 的参数
        String userToken = request.getParameter("token");
        if (StringUtils.isEmpty(userToken)) {
            //返回错误提示
            //false:表示不会继续往下执行,不会调用服务接口,直接响应给客户
            currentContext.setSendZuulResponse(false);
            currentContext.setResponseBody("token is null");
            currentContext.setResponseStatusCode(401);
            return null;
        }
        //否则正常执行,调用服务接口...
        return null;
    }
}

到了这里,关于微服务网关 —— SpringCloud Netflix Zuul的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 在Spring Cloud中使用组件Zuul网关,并注册到Eureka中去

    在上一篇中,我们搭建了Spring Cloud的父子模块,并实现了一个Eureka子模块的启动,可以通过浏览器地址去访问Eureka主页了,相信了解过的童鞋应该看到,主页上并未有任何服务去注册,那么我们就在这篇,使用zuul网关作为第一个注册到Eureka注册中心的服务吧。 上一篇博文地

    2024年02月05日
    浏览(34)
  • Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】

    Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】 跳转 Java之SpringCloud Alibaba【二】【微服务调用组件Feign】 跳转 Java之SpringCloud Alibaba【三】【微服务Nacos-config配置中心】 跳转 Java之SpringCloud Alibaba【四】【微服务 Sentinel服务熔断】 跳转 Java之SpringCloud Alibaba【五】【微服务

    2024年02月06日
    浏览(42)
  • 微服务 springcloud 08.zuul框架,API网关,整合ribbon和hystrix框架

    01.zuul是作为springcloud中的一个网关框架来使用的。 zuul API 网关,为微服务应用提供统一的对外访问接口。 zuul 还提供过滤器,对所有微服务提供统一的请求校验。 在项目中的位置: 02.新建 sp11-zuul 项目 03.pom.xml 需要添加 sp01-commons 依赖 04.application.yml zuul 路由配置可以省略,

    2024年02月09日
    浏览(28)
  • springcloud五大组件:Eureka:注册中心、Zuul:服务网关、Ribbon:负载均衡、Feign:服务调用、Hystix:熔断器

    Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。 SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。 Eureka包含两个组件:Eureka Server和Eure

    2024年04月10日
    浏览(33)
  • 导入SpringCloud-Eureka依赖的问题Cannot resolve org.springframework.cloud:spring-cloud-starter-netflix-eure

    今天使用SpringCloud时遇到导入SpringCloud-Eureka依赖的问题 Cannot resolve org.springframework.cloud:spring-cloud-starter-netflix-eureka-server:unknown 网上搜了一下,回答多的五花八门,但是不够简单粗暴,这里介绍一个简单的方法,只需要在项目的pom文件中做些设置即可 把大象放进冰箱里需要几步

    2024年02月14日
    浏览(30)
  • Spring Cloud Netflix微服务组件-Eureka

    目录 CAP理论 注册中心对比 为什么注册中心更适合用AP? 分布式系统AP和CP如何取舍? Eureka核心功能点 Euraka server启动的主线流程 总体流程图 @EnableEurekaServer 流程图 EurekaServerAutoConfiguration EurekaServerInitializerConfiguration Euraka client启动的主线流程 总体流程图 EurekaClientAutoConfigurat

    2024年02月01日
    浏览(48)
  • 【SpringCloudNetflix】一图理解Spring Cloud Netflix解决了那些微服务问题?

    注册中心:Eureka 负载均衡:Ribbon、Feign 服务熔断:Hystrix 服务降级:Hystrix 服务监控:Hystrix Dashboard 路由网关:Zuul 配置中心:Config git资源仓库:Spring Cloud Netflix 参考文章:https://zhuanlan.zhihu.com/p/353806201 坑:依赖版本对应问题 不断学习补充中,如理解有偏差的点,烦请指教!

    2024年02月08日
    浏览(31)
  • 云原生微服务治理 第四章 Spring Cloud Netflix 服务注册/发现组件Eureka

    第一章 Java线程池技术应用 第二章 CountDownLatch和Semaphone的应用 第三章 Spring Cloud 简介 第四章 Spring Cloud Netflix 之 Eureka 今天我们讲解Spring Cloud微服务的第一代实现:Spring Cloud Netflix Eureka 是 Netflix 公司开发的一款开源的服务注册与发现组件。 Spring Cloud 使用 Spring Boot 思想为 Eur

    2024年02月08日
    浏览(42)
  • 云原生微服务 第五章 Spring Cloud Netflix Eureka集成负载均衡组件Ribbon

    第一章 Java线程池技术应用 第二章 CountDownLatch和Semaphone的应用 第三章 Spring Cloud 简介 第四章 Spring Cloud Netflix 之 Eureka 第五章 Spring Cloud Netflix 之 Ribbon Spring Cloud Ribbon 是一套基于 Netflix Ribbon 实现的客户端负载均衡和服务调用工具,其主要功能是提供客户端的负载均衡算法和服务

    2024年02月08日
    浏览(33)
  • SpringCloud - Spring Cloud 之 Gateway网关,Route路由,Predicate 谓词/断言,Filter 过滤器(十三)

    阅读本文前可先参考 ​​​​​​SpringCloud - Spring Cloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客 SpringCloud - Spring Cloud 之 Gateway网关(十三)_MinggeQingchun的博客-CSDN博客 Web 有三大组件(监听器 过滤器 servlet),Spring Cloud GateWay 最主要的功能就是路由转发,而在定义

    2024年02月14日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包