文章目录

  • 1 概述
    • 1.1 什么是Zuul
    • 1.2 为什么要建造Zuul
    • 1.3 Zuul有哪些功能
    • 1.4 理解
  • 2 Zuul路由功能
    • 2.1 创建zuul服务
    • 2.2 测试
    • 2.3 路由访问映射规则
      • 2.3.1 修改配置文件
      • 2.3.2 修改后测试
  • 3 自定义zuul过滤器
    • 3.1 编写代码
    • 3.2 测试
  • 4 整合Feign Hystrix,通过客户端访问
    • 4.1 新建consumer hystrix zuul服务(复制consumer hystrix)
    • 4.2 测试
  • 5 Zuul 服务降级
    • 5.1 新建MyZuulFallbackProvider类,并加入容器
    • 5.2 测试

1 概述

1.1 什么是Zuul

Zuul是所有设备和网站请求Netflix流应用程序后端的前门。作为一个边缘服务应用程序,Zuul旨在实现动态路由,监控,弹性和安全性。它还可以恰当的将请求路由到多个Amazon弹性集群中。

1.2 为什么要建造Zuul

大量不同的Netflix API流量有时会导致迅速而无预警地出现问题。我们需要一个能够迅速改变行为的系统,以应对这些情况。

1.3 Zuul有哪些功能

Zuul使用一系列不同类型的过滤器,使我们能够快速灵活地将这些功能应用于我们的边缘服务。这些过滤器可帮助我们执行以下功能:

  1. Authentication and Security(身份验证和安全性 ):识别每个资源的认证要求并拒绝不满足它们的请求。
  2. Insights and Monitoring(洞察和监控 ): 在边缘跟踪有意义的数据和统计数据,以便给我们一个准确的生产视图。
  3. Dynamic Routing(动态路由):根据需要动态地向不同的后端集群路由请求。
  4. Stress Testing(压力测试):逐渐向集群增加流量压力来评估性能。
  5. Load Shedding(甩负荷):为每种类型的请求分配容量,并删除超出限制的请求。
  6. Static Response handling(静态响应处理):直接在边缘建立一些响应,而不是将它们转发到内部集群。
  7. Multiregion Resiliency(多区域弹性):跨越AWS区域路由请求,以使我们ELB的使用多样化,并使我们的优势更靠近我们的成员。

1.4 理解

  1. Zuul路由功能负责将外部的请求转发到具体的微服务实例上,是实现外部访问统一入口的基础。而过滤功能负责队请求的处理过程进行干预,是实现请求校验、服务聚合等功能的基础。
  2. Zuul需要和Eureka整合,将Zuul注册为Eureka服务治理下的应用,同时从Eureka中获取其它微服务的消息,即以后对微服务的访问都通过Zuul跳转后获得。
  3. Zuul就像大楼的保安,你可以请他找人(代理),找的人在外面叫什么名字(路由),是否允许你进入大楼(过滤)。因为保安属于物业公司,所以保安要在物业公司注册,所获得的信息也来源于物业公司(与Eureka的关系)。

2 Zuul路由功能

2.1 创建zuul服务

  1. 导入依赖。
<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zuul</artifactId></dependency>
</dependencies>
  1. 配置文件。
server:port: 9999
spring:application:name: spring-cloud-zuul-gateway   #为这个服务取名,非常重要!!!!!
eureka:client:service-url:defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/instance:instance-id: zuul.comprefer-ip-address: true
  1. 修改hosts文件。
127.0.0.0 zuul.com
  1. 创建主启动类,并加入@EnableZuulProxy注解。
@SpringBootApplication
@EnableZuulProxy
public class SpringCloudZuulApplication9999 {public static void main(String[] args) {SpringApplication.run(SpringCloudZuulApplication9999.class, args);}
}

2.2 测试

  1. 依次启动uereka、一个provider、zuul服务,可以看到注册了两个微服务。
  2. 通过http://[服务ip]:[服务端口]/[路径] 访问,访问成功。
  3. 通过http://[网关服务ip]:[网关服务端口]/[微服务名称]/[路径] 访问,访问成功。

    可以理解为,Zuul在微服务里找到了名为spring-cloud-provider的微服务,然后通过改为服务的访问路径访问服务

2.3 路由访问映射规则

2.3.1 修改配置文件

server:port: 9999spring:application:name: spring-cloud-zuul-gateway   #为这个服务取名,非常重要!!!!!eureka:client:service-url:defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/instance:instance-id: zuul.comprefer-ip-address: true
zuul:ignored-services: spring-cloud-provider #禁止通过微服务名访问,可以使用通配符*,需要加“\”转义prefix: /mysevice #访问前缀,如果没有该配置,则访问路径不能以/zuul/开头routes:spring-cloud-provider:  /myzuul/**   #routes参数格式为Map,前者是key 为被代理服务名-spring-cloud-provider,后者是value为代理路径-/myzuul/** ;可以配置多个服务代理#spring-cloud-provider1:  /myzuul1/**

2.3.2 修改后测试

重行启动zuul服务,访问:http://zuul.com:9999/mysevice/myzuul/hello/jack

证明:只能通过http://[网关服务ip]:[网关服务端口]/[前缀][自己设置的路径]/[路径] 进行访问,不加前缀或者通过服务名访问都失败。

3 自定义zuul过滤器

3.1 编写代码

//使该类成为配置类,注入spring容器
@Configuration
public class MyZuulFilter extends ZuulFilter {/*** pre:在请求路由之前执行过滤。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等。* route:这种过滤器将请求路由到微服务。这种过滤器用于构建发送给微服务的请求,并使用Apache HttpClient或Netfilx Ribbon请求微服务。* post:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等。* error:在其他阶段发生错误时执行该过滤器。* 除了默认的过滤器类型,Zuul还允许我们创建自定义的过滤器类型。例如,我们可以定制一种STATIC类型的过滤器,直接在Zuul中生成响应,而不将请求转发到后端的微服务。* to classify a filter by type. Standard types in Zuul are "pre" for pre-routing filtering,* "route" for routing to an origin, "post" for post-routing filters, "error" for error handling.* We also support a "static" type for static responses see  StaticResponseFilter.* Any filterType made be created or added and run by calling FilterProcessor.runFilters(type)** @return A String representing that type*/@Overridepublic String filterType() {return "pre";}/*** 必须定义过滤器顺序,如果该过滤器的优先级不是很重要,过滤器顺序命令可以相同,过滤器命令不需要是连续的。* 命令从0,1,2...优先级依次降低* filterOrder() must also be defined for a filter. Filters may have the same  filterOrder if precedence is not* important for a filter. filterOrders do not need to be sequential.* @return the int order of a filter*/@Overridepublic int filterOrder() {return 0;}/*** 返回true run()方法将要执行,false将不执行,可以作为run() 方法执行开关。* a "true" return from this method means that the run() method should be invoked* @return true if the run() method should be invoked. false will not invoke the run() method*/@Overridepublic boolean shouldFilter() {return true;}/*** 可以自己编写任意的业务逻辑* if shouldFilter() is true, this method will be invoked. this method is the core method of a ZuulFilter* @return Some arbitrary artifact may be returned. Current implementation ignores it.*/@Overridepublic Object run() {System.out.println("shouldFilter() is true");ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = requestAttributes.getRequest();String requestURL = request.getRequestURL().toString();int index = requestURL.lastIndexOf('/')+1;String username = requestURL.substring(index);//判定长度小于三为非法用户名if (username.length() >2 ) {return true;}else{throw new RuntimeException("非法用户名,请检查!");}}
}

Zuul中默认实现了DebugFilter、StaticResponseFilter等过滤器,具体信息可以看源码,可以以以下方式禁用某种过滤器

zuul:FormBodyWrapperFilter:pre:disable: true

3.2 测试

  1. 访问:http://zuul.com:9999/mysevice/myzuul/hello/jack
  2. 访问:http://zuul.com:9999/mysevice/myzuul/hello/ja

4 整合Feign Hystrix,通过客户端访问

4.1 新建consumer hystrix zuul服务(复制consumer hystrix)

改写feign调用接口。

@FeignClient(name= "spring-cloud-zuul-gateway", fallback = HelloRemoteFallback.class)
public interface HelloRemote {String ZUUL_URL_PREFIX = "/mysevice/myzuul";@RequestMapping(value = ZUUL_URL_PREFIX+"/hello/{name}")String hello(@RequestParam(value = "name") String name);
}

4.2 测试

  1. 依次启动uereka、provider、zuul、consumer hystrix zuul服务。
  2. 访问:http://localhost/consumer/hello/jack
  3. 访问:http://localhost/consumer/hello/ja

5 Zuul 服务降级

Zuul 是一个代理服务,如果被代理的服务突然宕机(如停掉provider 8001服务),那么zuul将会报错。但是consumer hystrix zuul服务已经有Feign降级服务,所以该服务不会报错,所有只有zuul报错,因此应该配置zuul的降级服务。

5.1 新建MyZuulFallbackProvider类,并加入容器

//注入容器
@Component
public class MyZuulFallbackProvider implements ZuulFallbackProvider {/*** 必须设置好处理的失败的服务路由* @return*/@Overridepublic String getRoute() {return "spring-cloud-provider";}@Overridepublic ClientHttpResponse fallbackResponse() {return new ClientHttpResponse() {/*** 服务调用失败后返回* @return* @throws IOException*/@Overridepublic InputStream getBody() throws IOException {return new ByteArrayInputStream("被代理服务故障,此结果由Zuul Gateway静态提供!".getBytes());}@Overridepublic HttpHeaders getHeaders() {HttpHeaders headers = new HttpHeaders() ;headers.set("Content-Type", "text/html; charset=UTF-8");return headers;}@Overridepublic HttpStatus getStatusCode() throws IOException {return HttpStatus.BAD_REQUEST;}@Overridepublic int getRawStatusCode() throws IOException {return HttpStatus.BAD_REQUEST.value();}@Overridepublic String getStatusText() throws IOException {return HttpStatus.BAD_REQUEST.getReasonPhrase();}@Overridepublic void close() {}};}
}

5.2 测试

  1. 停掉provider 8001服务,访问:http://localhost/consumer/hello/jack
  2. 访问:http://zuul.com:9999/mysevice/myzuul/hello/jack

    看源码点这里

Spring Cloud(八)Zuul路由网关相关推荐

  1. Spring Cloud Netfilx Zuul : API网关服务

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

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

    文章目录 Spring Cloud入门系列汇总 摘要 Gateway 简介 相关概念 创建 api-gateway模块 在pom.xml中添加相关依赖 两种不同的配置路由方式 使用yml配置 使用Ja ...

  3. SpringCloud - Spring Cloud 之 Zuul和Gateway网关(十四)

    Spring Cloud Gateway是Spring Cloud的一个子项目.而zuul则是Netflix公司的项目,只是Spring 将zuul集成在Spring Cloud中使用而已. 因为zu ...

  4. SpringCloud 2020版本教程2:使用spring cloud gateway作为服务网关

    点击关注公众号,Java干货及时送达 Spring Cloud Gateway是Spring Cloud官方推出的第二代网关框架,取代Zuul网关.网关作为流量的,在微服务系统中有着非常作用,网关常见 ...

  5. Spring Cloud Gateway(路由)

    本篇文章主要介绍了什么是 Spring Cloud Gateway,并基于 Spring Cloud Gateway 的 Finchley.RC1 版本编写一个 Spring Cloud Gatewa ...

  6. 【Java进阶】Spring Cloud中Zuul配置与案例实现

    目录 Zuul是什么 zuul 能做什么 过滤器的生命周期 zuul组件 搭建一个注册Eureka中心的Web服务 项目截图 pom application.yml配置 启动项ZuulApplicat ...

  7. SpringCloud学习系列之七 ----- Zuul路由网关的过滤器和异常处理

    前言 在上篇中介绍了SpringCloud Zuul路由网关的基本使用版本,本篇则介绍基于SpringCloud(基于SpringBoot2.x,.SpringCloud Finchley版)中的路由 ...

  8. Spring Cloud实战Zuul统一异常处理

    Spring Cloud实战Zuul统一异常处理 Spring Cloud Zuul中自己实现的一些核心过滤器,以及这些过滤器在请求生命周期中的不同作用.我们会发现在这些核心过滤器中并没有实现erro ...

  9. 520、Java Spring Cloud Alibaba -【Spring Cloud Alibaba Zuul】 2021.11.02

    目录 1. Zuul 简介 2.Zuul 网关的引入 3.Zuul 网关的快速搭建 4.参考链接 1. Zuul 简介 Zuul 微服务网关是为 Spring Cloud Netflix 提供动态路由 ...

  10. 跟着狂神学SpringCloud(Rest环境搭建+Eureka服务注册与发现+ribbon+Feign负载均衡+Hystrix+服务熔断+Zuul路由网关+SpringCloud config分布)

    跟着狂神学SpringCloud SpringCloud 回顾之前的知识- JavaSE 数据库 前端 Servlet Http Mybatis Spring SpringMVC SpringBoot ...

最新文章

  1. php mongodb execute,php简单操作mongodb
  2. 将前台日期格式转成与数据库日期格式相对应,后台java转数据库日期格式
  3. Java学习总结:36(日期处理类)
  4. 如何利用遗传算法进行自变量降维
  5. H5网站接入支付宝的支付接口
  6. 《计算机组成与设计(ARM版)》读书笔记-第二章指令2
  7. Windows Phone开发(35):使用Express Blend绘图 转:http://blog.csdn.net/tcjiaan/article/details/7493010...
  8. python学习之路day1
  9. 使用opencv和python进行智能图像处理_使用OpenCV在Python中进行图像处理
  10. FPGA车牌数字识别系统设计verilog实现(带上板录制视频)
  11. 邢不行python资源_邢不行—数字货币python量化投资
  12. Win7系统忘记登入密码的解决方法
  13. 寒假打工去,不能继续写博客,表示好心痛啊。。。
  14. 华为在 5G 初期不考虑盈利;​网易发布数据中台;微软 SQL Server 2019 免费支持 Java | 极客头条...
  15. java ip解析_java域名解析
  16. 在项目里配置数据库驱动
  17. 明翰游戏学笔记V0.2(持续更新)
  18. 网络+系统+ITSM工具Network+system+ITSM tool
  19. 高通驱动程序开发参考(一)
  20. Hibernate新官网下载源码及支持jar

热门文章

  1. 那记悲伤的伤感空间日志:坏男人只会有可怜的女人
  2. C++程序设计:支票代码输出
  3. OpenGL读取3D obj文件进行三角拆分-动漫女孩
  4. 圣歌服务器的维护时间,《圣歌》更新今晚8点发布 未来90天更新计划同步公开...
  5. ACCA AI来袭会议笔记
  6. paddlenlp文本摘要模型实现
  7. linux指定内核版本升级,Ubuntu 14.0 升级内核到指定版本
  8. 优酷视频下载方法(20080506)
  9. php微信自定义分享不生效,微信自定义分享 始终调用不起来是为啥
  10. HTML 基础2021年