07.Spring Cloud Zuul:API网关服务

Spring Cloud入门-汇总篇(Hoxton版本) 即使是面试跳槽,那也是一个学习的过程。只有全面的复习,才能让我们更好的充实自己,武装自己,为自己的面试之路不再坎坷!今天就给大家分享一个Github上全面的Java面试题大全,就是这份面试大全助我拿下大厂Offer,月薪提至30K!我也是第一时间分享出来给大家,希望可以帮助大家都能去往自己心仪的大厂!为金三银四做准备! 阅读详情

Spring Cloud Zuul:API网关服务

Spring Cloud Zuul 是Spring Cloud Netflix 子项目的核心组件之一,可以作为微服务架构中的API网关使用,支持动态路由与过滤功能,本文将对其用法进行详细介绍。

1.Zuul简介

API网关为微服务架构中的服务提供了统一的访问入口,客户端通过API网关访问相关服务。API网关的定义类似于设计模式中的门面模式,它相当于整个微服务架构中的门面,所有客户端的访问都通过它来进行路由及过滤。它实现了请求路由、负载均衡、校验过滤、服务容错、服务聚合等功能。

2.创建一个zuul-proxy模块

这里我们创建一个zuul-proxy模块来演示zuul的常用功能。

2.1 在pom.xml中添加相关依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
2.2 在application.yml中进行配置
server:
  port: 8801
spring:
  application:
    name: zuul-proxy
eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://localhost:8001/eureka/
2.3 在启动类上添加@EnableZuulProxy注解来启用Zuul的API网关功能
@EnableZuulProxy
@EnableDiscoveryClient
@SpringBootApplication
public class ZuulProxyApplication {

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

}

3.常用功能

3.1 启动相关服务

这里我们通过启动eureka-server,两个user-service,feign-service和zuul-proxy来演示Zuul的常用功能,启动后注册中心显示如下。
在这里插入图片描述

3.2 配置路由规则
3.2.1 我们可以通过修改application.yml中的配置来配置路由规则,这里我们将匹配/userService/**的请求路由到user-service服务上去,匹配/feignService/**的请求路由到feign-service上去。
zuul:
  routes: #给服务配置路由
    user-service:
      path: /userService/**
    feign-service:
      path: /feignService/**
3.2.2 访问http://localhost:8801/userService/user/1可以发现请求路由到了user-service上了;
3.2.3 访问http://localhost:8801/feignService/user/1可以发现请求路由到了feign-service上了。
3.3 默认路由规则
3.3.1 Zuul和Eureka结合使用,可以实现路由的自动配置,自动配置的路由以服务名称为匹配路径,相当于如下配置:
zuul:
  routes: #给服务配置路由
    user-service:
      path: /user-service/**
    feign-service:
      path: /feign-service/**
3.3.2 访问http://localhost:8801/user-service/user/1同样可以路由到了user-service上了;
3.3.3 访问http://localhost:8801/feign-service/user/1同样可以路由到了feign-service上了。
3.3.4 如果不想使用默认的路由规则,可以添加以下配置来忽略默认路由配置:
zuul:
  ignored-services: user-service,feign-service #关闭默认路由配置
3.4 负载均衡功能

多次调用http://localhost:8801/user-service/user/1进行测试,可以发现运行在8201和8202的user-service服务交替打印如下信息。

2019-11-05 22:51:24.891 INFO 8332 — [nio-8202-exec-6] c.allan.cloud.controller.UserController : 根据id获取用户信息,用户名称为:yanglin
2019-11-05 22:53:00.769 INFO 8332 — [nio-8202-exec-8] c.allan.cloud.controller.UserController : 根据id获取用户信息,用户名称为:yanglin

3.5 配置访问前缀

我们可以通过以下配置来给网关路径添加前缀,此处添加了/proxy前缀,这样我们需要访问http://localhost:8801/proxy/user-service/user/1才能访问到user-service中的接口。

zuul:
  prefix: /proxy #给网关路由添加前缀
3.6 Header过滤及重定向添加Host
3.6.1 Zuul在请求路由时,默认会过滤掉一些敏感的头信息,以下配置可以防止路由时的Cookie及Authorization的丢失:
zuul:
  sensitive-headers: Cookie,Set-Cookie,Authorization #配置过滤敏感的请求头信息,设置为空就不会过滤
3.6.2 Zuul在请求路由时,不会设置最初的host头信息,以下配置可以解决:
zuul:
  add-host-header: true #设置为true重定向是会添加host请求头
3.7 查看路由信息

我们可以通过SpringBoot Actuator来查看Zuul中的路由信息。

3.7.1 在pom.xml中添加相关依赖:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
3.7.2 修改application.yaml配置文件,开启查看路由的端点:
management:
  endpoints:
    web:
      exposure:
        include: 'routes'
3.7.3 通过访问http://localhost:8801/actuator/routes查看简单路由信息:

在这里插入图片描述

3.7.4 通过访问http://localhost:8801/actuator/routes/details查看详细路由信息:

在这里插入图片描述
在这里插入图片描述

4.过滤器

路由与过滤是Zuul的两大核心功能,路由功能负责将外部请求转发到具体的服务实例上去,是实现统一访问入口的基础,过滤功能负责对请求过程进行额外的处理,是请求校验过滤及服务聚合的基础。

4.1 过滤器类型

Zuul中有以下几种典型的过滤器类型。

  • pre:在请求被路由到目标服务前执行,比如权限校验、打印日志等功能;

  • routing:在请求被路由到目标服务时执行,这是使用Apache HttpClient或Netflix Ribbon构建和发送原始HTTP请求的地方;

  • post:在请求被路由到目标服务后执行,比如给目标服务的响应添加头信息,收集统计数据等功能;

  • error:请求在其他阶段发生错误时执行。

4.2 过滤器的生命周期

下图描述了一个HTTP请求到达API网关后,如何在各种不同类型的过滤器中流转的过程。

在这里插入图片描述

4.3 自定义过滤器

接下来我们自定义一个过滤器来演示下过滤器的作用。

4.4 添加PreLogFilter类继承ZuulFilter

这是一个前置过滤器,用于在请求路由到目标服务前打印请求日志。

@Component
public class PreLogFilter extends ZuulFilter {
    private Logger LOGGER = LoggerFactory.getLogger(this.getClass());

    /**
     * 过滤器类型,有pre、routing、post、error四种。
     */
    @Override
    public String filterType() {
        return "pre";
    }

    /**
     * 过滤器执行顺序,数值越小优先级越高。
     */
    @Override
    public int filterOrder() {
        return 1;
    }

    /**
     * 是否进行过滤,返回true会执行过滤。
     */
    @Override
    public boolean shouldFilter() {
        return true;
    }

    /**
     * 自定义的过滤器逻辑,当shouldFilter()返回true时会执行。
     */
    @Override
    public Object run() throws ZuulException {
        RequestContext requestContext = RequestContext.getCurrentContext();
        HttpServletRequest request = requestContext.getRequest();
        String host = request.getRemoteHost();
        String method = request.getMethod();
        String uri = request.getRequestURI();
        LOGGER.info("Remote host:{},method:{},uri:{}", host, method, uri);
        return null;
    }
}
4.5 过滤器功能演示

添加过滤器后,我们访问http://localhost:8801/user-service/user/1测试下,会打印如下日志。

2019-11-06 00:32:36.688 INFO 7720 — [nio-8801-exec-5] com.allan.cloud.filter.PreLogFilter : Remote host:0:0:0:0:0:0:0:1,method:GET,uri:/user-service/user/1

需要注意:
下边配置为false或者不配置【默认为false,即可以不显式配置】才会有上边的效果。

  PreLogFilter:
    pre:
      disable: false #控制是否启用过滤器
4.6 核心过滤器

在这里插入图片描述

4.7 禁用过滤器
4.7.1 我们可以对过滤器进行禁用的配置,配置格式如下:
zuul:
  filterClassName:
    filter:
      disable: true 
4.7.2 以下是禁用PreLogFilter的示例配置:
zuul:
  PreLogFilter:
    pre:
      disable: true

5.Ribbon和Hystrix的支持

由于Zuul自动集成了Ribbon和Hystrix,所以Zuul天生就有负载均衡和服务容错能力,我们可以通过Ribbon和Hystrix的配置来配置Zuul中的相应功能。

5.1 可以使用Hystrix的配置来设置路由转发时HystrixCommand的执行超时时间:
hystrix:
  command: #用于控制HystrixCommand的行为
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 1000 #配置HystrixCommand执行的超时时间,执行超过该时间会进行服务降级处理
5.2 可以使用Ribbon的配置来设置路由转发时请求连接及处理的超时时间:
ribbon: #全局配置
  ConnectTimeout: 1000 #服务请求连接超时时间(毫秒)
  ReadTimeout: 3000 #服务请求处理超时时间(毫秒)

6.常用配置

zuul:
  routes: #给服务配置路由
    user-service:
      path: /userService/**
    feign-service:
      path: /feignService/**
  ignored-services: user-service,feign-service #关闭默认路由配置
  prefix: /proxy #给网关路由添加前缀
  sensitive-headers: Cookie,Set-Cookie,Authorization #配置过滤敏感的请求头信息,设置为空就不会过滤
  add-host-header: true #设置为true重定向是会添加host请求头
  retryable: true # 关闭重试机制
  PreLogFilter:
    pre:
      disable: false #控制是否启用过滤器

7.使用到的模块

Spring-Cloud-Greenwich
├── eureka-server – eureka注册中心
├── user-service – 提供User对象CRUD接口的服务
├── feign-service – feign服务调用测试服务
└── zuul-proxy – zuul作为网关的测试服务

8.项目源码地址

https://github.com/yanglin1501804006/spring-cloud-vGreenwich.SR3

Spring Cloud入门-Gateway服务网关(Hoxton版本),linux教程入门教程PDF 这里我们创建一个api-gateway模块来演示Gateway的常用功能。 在pom.xml中添加相关依赖 org.springframework.cloud spring-cloud-starter-gateway 两种不同的配置路由方式 Gateway 提供了两种不同的方式用于配置路由,一种是通过yml文件来配置,另一种是通过Java Bean来配置,下面我们分别介绍下。 使用yml配置 在application.yml中进行配置: server: port: 9201 service-ur. 阅读详情

相关推荐

Spring Cloud入门-Gateway服务网关(Hoxton版本)

在这个部分总结了2019年到目前为止Java常见面试问题,取其面试核心编写成这份文档笔记,从中分析面试官的心理,摸清面试官的“套路”,可以说搞定90%以上的Java中高级面试没一点难度。本节总结的内容涵盖了:消息队列、Redis缓存、分库分表、读写分离、设计高并发系统、分布式系统、高可用系统、SpringCloud微服务架构等一系列互联网主流高级技术的知识点。(上述只是一个整体目录大纲,每个点里面都有如下所示的详细内容,从面试问题——分析面试官心理——剖析面试题——完美解答的一个过程)

2401_84003941的博客 2344

Spring Cloud入门操作手册(Hoxton)

一,spring cloud 介绍 spring cloud 是一系列框架的集合。 它利用 spring boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用 spring boot 的开发风格做到一键启动和部署。 spring cloud 并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过 spring boot 风格进行再封装...

家有喜娟儿的博客 2395

SpringCloud07—API网关服务:Spring Cloud Zuul

将指定路由的敏感头信息设置为空zuul.routes..sensitiveHeaders=[这里设置要过滤的敏感头]7.5 对于HyStrix和Ribbon的设置Zuul天生就拥有线程隔离和断路器的自我保护功能,以及对服务调用的客户端负载均衡功能。但是需要注意,当使用path与ur1的映射关系来配置路由规则的时候,对于路由转发的请求不会采用HystrixCommand来包装,所以这类路由请求没有线程隔离和断路器的保护,并且也不会有负载均衡的能力。

2401_84009579的博客 733

SpringCloud系列教程(一)开篇【Hoxton版】

SpringCloud 作为目前最热门的技术之一,拥有众多的开发者的爱戴,开箱即用,简单配置的特性让开发者只需要关注业务代码的开发,无需在繁琐和架构中挣扎。SpringCloud也成为了java开发人员必须了解和使用的技能。 作为系列的开篇,全系列会介绍hoxton的正式版如何使用,也会对一些组件的原理进行介绍,并且会结合实战中的使用着重讲一讲。本文也会照顾初学者,一些详细的配置会深入浅出。 大纲 为什么要学习Spring Cloud 什么是Spring Cloud 优缺点 需要的版本 组件的介绍 实战中

LuisChen的博客 4252

Spring Cloud Zuul微服务网关的API限流

API限流微服务开发中有时需要对API做限流保护,防止网络攻击,比如做一个短信验证码API,限制客户端的请求速率能在一定程度上抵御短信轰炸攻击,降低损失。微服务网关是每个请求的必经入口,非常适合做一些API限流、认证之类的操作,这里有一个基于zuul微服务网关的API限流库: https://github.com/marcosbarbero/spring-cloud-zuul-ratelimit使

云中采薇 1万+

Spring Cloud系列教程 | 第六篇:Spring Cloud Zuul作为API网关实现请求路由转发教程

Spring Cloud Zuul作为API网关实现请求路由转发教程 &amp;amp;amp;amp;nbsp;&amp;amp;amp;amp;nbsp;&amp;amp;amp;amp;nbsp;&amp;amp;amp;amp;nbsp;&amp;amp;amp;amp;nbsp;当我们的架构实现前后端分离以后,前端和后端之间交互就是通过API网关进行,API网关两个职责: 1.设计上的适配层,或称Facade模式,后端微服务可能过于细粒度,通过API网关

qq_43253123的博客 3592

服务网关配置:Zuul

目录第一章 Zuul介绍1.1、什么是Zuul1.2、为啥用Zuul第二章 Zuul路由功能2.1、项目准备与启动2.2、工程搭建与测试2.3、配置自定义路由2.4、禁止默认的路由2.5、简化自定义路由2.6、统一加路径前缀2.7、路由规则通配符第三章 Zuul过滤功能3.1、过滤器介绍3.2、过滤器类型3.3、过滤器使用场景3.4、过滤器生命周期3.5、内置过滤器列表3.6、自定义的过滤器3.7、禁用指定过滤器3.8、处理全局的异常第四章 Zuul其他功能4.1、负载均衡超时4.2、服务降级熔断4.3、网

轻松的小希 3957

Spring Cloud入门-Zuul服务网关(Hoxton版本)

接下来我们自定义一个过滤器来演示下过滤器的作用。

2401_89317704的博客 951

SpringCloud之Zuul网关服务

Zuul是spring cloud中的微服务网关。网关: 是一个网络整体系统中的前置门户入口。请求首先通过网关,进行路径的路由,定位到具体的服务节点上。   Zuul是一个微服务网关,首先是一个微服务。也是会在Eureka注册中心中进行服务的注册和发现。也是一个网关,请求应该通过Zuul来进行路由。   Zuul网关不是必要的。是推荐使用的。   使用Zuul,一般在微服务数量较多(多于10...

渣渣想逆袭 3366

微服务网关 Spring Cloud Gateway

API网关方式的核心要点是,所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有的非业务功能。现在Spring Cloud中引用的还是Zuul 1.x版本,而这个版本是基于过滤器的,是阻塞IO,不支持长连接。执行所有的“pre”过滤逻辑,然后发出代理请求,最后执行“post”过滤逻辑。像Nginx这类网关,性能肯定是没得说,它适合做那种门户网关,是作为整个全局的网关,是对外的,处于最外层的;优先级最高的过滤器将会是“pre”阶段中的第一个过滤器,同时它也将是“post”阶段中的最后一个过滤器。

2401_86940371的博客 1180

springcloud服务网关Netflix Zuul入门简介

【摘要】Zuul是Netflix开发的API网关组件,类似Nginx的反向代理,但专为微服务设计。作为Spring Cloud套件的一部分,它提供路由转发、负载均衡(集成Ribbon)、权限认证、请求过滤等核心功能,充当微服务架构的"前门"。通过与Eureka注册中心联动,Zuul能动态感知服务状态,自动将外部请求路由到对应服务实例,实现服务保护与统一流量管控。其优势在于将非业务逻辑(如安全验证)集中到网关层处理,提升服务复用性,同时通过配置化路由降低服务变更的维护成本,典型架构表现为&

ywl470812087的博客 11万+

Spring Cloud Zuul:API 网关

Spring Cloud Zuul:API 网关

qq_35763697的博客 1677

Spring Cloud Zuul API服务网关之请求路由

目录 一、Zuul 介绍 二、构建Spring Cloud Zuul网关 构建网关 请求路由 请求过滤 三、路由详解 一、Zuul 介绍 ​ 通过前几篇文章的介绍,我们了解了Spring Cloud Eureka 如何搭建注册中心,Spring Cloud Ribbon 如何做负载均衡,Spring Cloud Hystrix 断路器如何保护我们的服...

编程知识分享 1287

Spring Cloud微服务中的API网关:从Zuul到Spring Cloud Gateway的全面进化

API网关选型指南:Spring Cloud Gateway vs Zuul 摘要:本文对比微服务网关技术,揭示Zuul因阻塞式架构导致的性能瓶颈(仅500-1000 QPS)与维护风险(Netflix已弃用),推荐Spring Cloud Gateway的响应式非阻塞方案(支持10,000+ QPS)。通过电商系统案例,展示Gateway动态路由、JWT认证等核心功能实现,并提供从Zuul迁移的实践路径。关键结论:Gateway在性能、扩展性和生态支持上全面超越Zuul,是微服务网关的现代化选择。

刘一说的IT专栏 1992

error C2039: “int_least8_t”: 不是“`global namespace'”的成员

在向H.265的测试软件HM16.0中配置boost的时候,发现 include &lt;boost/cstdint.hpp&gt;的时候总是会报错:错误 11 error C2039: “int_fast16_t”: 不是“`global namespace'”的成员 D:\Program Files\Caffe\VSContact\boost_1_58_0\boost\cstdint.hpp ...

flyerene的博客 1万+

【论文阅读笔记】One Shot 3D Photography

论文主页:https://facebookresearch.github.io/one_shot_3d_photography/ 代码地址:https://github.com/facebookresearch/one_shot_3d_photography   该3D照片方向,由于刚入门,所以会倾向于翻译文章。每个操作上的选择,及为什么不进行另外操作的原因都如数放上。 论文小结   本作的工作是从单张RGB图片生成一个移动视角的3D照片。   其管道大致如下: 由RGB图像通过单目深度估计网络估计深度图

时光机 °的博客 1839

五分钟学会 Spring Cloud Zuul:API网关服务(小白必看,一看就会教程)

Spring Cloud Zuul:API网关服务 Zuul简介 常用功能 启动相关服务 配置路由规则 默认路由规则 负载均衡功能 配置访问前缀 Header过滤及重定向添加Host 查看路由信息 过滤器 过滤器类型 过滤器的生命周期 自定义过滤器 核心过滤器 禁用过滤器 Ribbon和Hystrix的支持 常用配置 Spring Cloud Zuul 是Spring Cloud Netflix 子项目的核心组件之一,可以作为微服务架构中的API网关使用,支持动态路由与过滤功能,本文将对其用法进行详细介

码上代码的博客 3076

张量分解浅谈(四 Tucker 分解)

学完了SVD算法之后,我们继续回到张量几大分解的学习上来,本期学习的主要内容是张量的 Tucker 分解 以及 前面的CP分解还留下一点没有说完,正好一并补齐!后面的公式我将采用颜色标记,红色代表必须掌握,蓝色尽量掌握! 在这之前先附一张图,包含了各种运算符号的名称含义,大部分是前面说过或者使用过的: Tensor decomposition一 . Tucker 分解公式介绍和原理二 . 张量的 n-Rank 一 . Tucker 分解公式介绍和原理 我们先来看一张被使用过很多次的Trucker 分解图

欢迎来到 豪哥 的博客 1万+
上一篇: 06.Spring Cloud OpenFeign:基于 Ribbon 和 Hystrix 的声明式服务调用
下一篇: 10.Spring Cloud Sleuth:分布式请求链路跟踪
Spring的思念
博客等级 码龄7年 80粉丝 143原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值