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

因为zuul2.0连续跳票和zuul1的性能表现不是很理想,所以催生了spring团队开发了Gateway项目

一、Zuul

Zuul是netflix公司的项目,本质上是web servlet,基于JavaEE Servlet技术栈,使用阻塞API,处理的是http请求,没有提供异步支持,不支持任何长连接,比如websocket

依赖:

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

核心配置

server.port=81#eureka注册中心首页的Application这一栏
spring.application.name=springcloud-7-service-eureka-zuul#每间隔5s,向Eureka服务注册中心发送一次心跳,证明服务是否依然“存活”
eureka.instance.lease-renewal-interval-in-seconds=2
#告诉服务端,如果10s之内没有发送心跳,就代表故障,将本服务踢出
eureka.instance.lease-expiration-duration-in-seconds=10
#告诉服务端,服务实例以IP作为链接,不是取机器名
eureka.instance.prefer-ip-address=false#注册服务实例ID,,服务ID必须唯一
eureka.instance.instance-id=springcloud-7-service-eureka-zuul
#注册中心的链接地址  http://localhost:8761/eureka
eureka.client.service-url.defaultZone=http://eureka8761:8761/eureka,http://eureka8762:8762/eureka,http://eureka8763:8763/eureka#设置Zuul超时时间
zuul.host.connect-timeout-millis=6000
zuul.host.socket-timeout-millis=6000#配置路由规则
#/ **代表是所有(多个)层级   如:/springcloud/eureka/hystrix/goodHystrixList
#/ * 是代表一层; 如: /hystrix/goodHystrixList 就不会被路由
zuul.routes.portal.service-id=springcloud-6-service-eureka-hystrix-consumer
zuul.routes.portal.path=/web/**
#接口调用需要一定的规范,如调用微服务的API URL前缀需要加上/api
#http://localhost:81/api/web/springcloud/eureka/hystrix/goodList1
zuul.prefix=/api#通过自定义的规则进行访问,但是依然能用之前的微服务名调用,这是不合理的,第一是有多重地址了, 第二一般微服务名这种最好不要暴露在外,所以我们一般会禁用微服务名方式调用
# 一个一个通过微服务名来配置难免有点复杂,所以一般这样配置来禁用所有
# 禁用微服务名方式调用
zuul.ignored-services=*
#zuul.ignored-services=springcloud-6-service-eureka-hystrix-consumer#禁用过滤器
zuul.LogFilter.route.disable=true
#禁用 zuul 默认的异常处理 SendErrorFilter 过滤器,然后自定义 Errorfilter 过滤器
zuul.SendErrorFilter.error.disable=true 

二、Gateway

Spring Boot和Spring Webflux提供的Netty底层环境,不能和传统的Servlet容器一起使用,也不能打包成一个WAR包,使用非阻塞API,支持websocket。

依赖

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

核心配置

application.properties文件

# 网关一般是80
server.port=81#eureka注册中心首页的Application这一栏
spring.application.name=springcloud-7-service-eureka-gateway#每间隔5s,向Eureka服务注册中心发送一次心跳,证明服务是否依然“存活”
eureka.instance.lease-renewal-interval-in-seconds=2
#告诉服务端,如果10s之内没有发送心跳,就代表故障,将本服务踢出
eureka.instance.lease-expiration-duration-in-seconds=10
#告诉服务端,服务实例以IP作为链接,不是取机器名
eureka.instance.prefer-ip-address=false#注册服务实例ID,,服务ID必须唯一 springcloud-7-service-eureka-gateway
eureka.instance.instance-id=${spring.application.name}:${server.port}
#注册中心的链接地址  http://eureka8761:8761/eureka,http://eureka8762:8762/eureka,http://eureka8763:8763/eureka
eureka.client.service-url.defaultZone=http://localhost:8761/eureka#网关路由配置
#开启网关,默认开启
spring.cloud.gateway.enabled=true
#节点 routes 是一个List 对象,其中 routes 集合中中又包含多个对象,每个对象有三个属性(一个 索引[0]代表一个对象)
#路由 id,没有固定规则,但唯一
spring.cloud.gateway.routes[0].id=login-service-route
#匹配后提供服务的路由地址;uri统一资源定位符   url 统一资源标识符
#uri 的协议为 lb(load Balance),表示启用 Gateway 的负载均衡功能
#lb://serviceName 是 spring cloud gateway 在微服务中自动为我们创建的负载均衡 uri;serviceName要和启动的微服务名保持一致
spring.cloud.gateway.routes[0].uri=lb://springcloud-7-service-eureka-gateway-login
#spring.cloud.gateway.routes[0].uri=http://localhost:9001
#以下是断言条件,必选全部符合条件;断言是给某一个路由来设定的一种匹配规则 默认不能作用在动态路由上
#断言,路径匹配,只要Path匹配上了/doLogin 就往 uri 转发 并且将路径带上 注意:Path 中 P 为大写
#也可以全局匹配,如 /service/**
spring.cloud.gateway.routes[0].predicates[0]=Path=/doLogin
#只能是 GET 请求时,才能访问
spring.cloud.gateway.routes[0].predicates[0]=Method=GET,POST# 这个是过滤器的名称
spring.cloud.gateway.routes[0].filters[0].name=RequestRateLimiter
# 这个过滤器的参数
# 用于限流的键的解析器的 Bean 对象的名字。它使用 SpEL 表达式根据#{@beanName}从 Spring 容器中获取 Bean 对象
spring.cloud.gateway.routes[0].filters[0].args.key-resolver=#{@apiKeyResolver}
# 生成令牌的速度,令牌桶每秒填充平均速率
spring.cloud.gateway.routes[0].filters[0].args.redis-rate-limiter.replenishRate=1
# 令牌桶总容量
spring.cloud.gateway.routes[0].filters[0].args.redis-rate-limiter.burstCapacity=3#配置第二个路由规则
spring.cloud.gateway.routes[1].id=admin-service-route
spring.cloud.gateway.routes[1].uri=lb://springcloud-7-service-eureka-gateway-login
#spring.cloud.gateway.routes[1].uri=http://localhost:9001
spring.cloud.gateway.routes[1].predicates[0]=Path=/doAdmin
spring.cloud.gateway.routes[1].predicates[0]=Method=GET,POST#表明gateway开启服务注册和发现的功能,并且spring cloud gateway自动根据服务发现为每一个服务创建了一个router,这个router将以服务名开头的请求路径转发到对应的服务
spring.cloud.gateway.discovery.locator.enabled=true
#是将请求路径上的服务名配置为小写(服务注册的时候,向注册中心注册时将服务名转成大写了),如以/service/*的请求路径被路由转发到服务名为service的服务上
spring.cloud.gateway.discovery.locator.lower-case-service-id=true

application.yml文件

server:# 网关一般是80port: 81#eureka注册中心首页的Application这一栏
spring:application:name: springcloud-7-service-eureka-gateway#网关路由配置cloud:gateway:#开启网关,默认开启enabled: true#节点 routes 是一个List 对象,其中 routes 集合中中又包含多个对象,每个对象有三个属性(一个 索引[0]代表一个对象)routes:#路由 id,没有固定规则,但唯一- id: login-service-route#匹配后提供服务的路由地址;uri统一资源定位符   url 统一资源标识符#uri: http://localhost:9001#uri 的协议为 lb(load Balance),表示启用 Gateway 的负载均衡功能#lb://serviceName 是 spring cloud gateway 在微服务中自动为我们创建的负载均衡 uri;serviceName要和启动的微服务名保持一致uri: lb://springcloud-7-service-eureka-gateway-login#以下是断言条件,必选全部符合条件;断言是给某一个路由来设定的一种匹配规则 默认不能作用在动态路由上predicates:#断言,路径匹配,只要Path匹配上了/doLogin 就往 uri 转发 并且将路径带上 注意:Path 中 P 为大写#也可以全局匹配,如 /service/**- Path=/doLogin#只能是 GET,POST 请求时,才能访问- Method=GET,POSTfilters:- name: RequestRateLimiter  # 这个是过滤器的名称args: # 这个过滤器的参数key-resolver: '#{@apiKeyResolver}' # 用于限流的键的解析器的 Bean 对象的名字。它使用 SpEL 表达式根据#{@beanName}从 Spring 容器中获取 Bean 对象redis-rate-limiter.replenishRate: 1  # 生成令牌的速度,令牌桶每秒填充平均速率redis-rate-limiter.burstCapacity: 3  # 令牌桶总容量#配置第二个路由规则- id: admin-service-route#uri: http://localhost:9001uri: lb://springcloud-7-service-eureka-gateway-loginpredicates:- Path=/doAdmin- Method=GET,POST#表明gateway开启服务注册和发现的功能,并且spring cloud gateway自动根据服务发现为每一个服务创建了一个router,这个router将以服务名开头的请求路径转发到对应的服务discovery:locator:enabled: true#是将请求路径上的服务名配置为小写(服务注册的时候,向注册中心注册时将服务名转成大写了),如以/service/*的请求路径被路由转发到服务名为service的服务上lower-case-service-id: true# redis 配置redis:# 地址host: localhost# 端口,默认为6379port: 6379# 数据库索引database: 0# 密码password:# 连接超时时间timeout: 10s#Java中著名客户端: Jedis,lettuce,Redissonlettuce:pool:# 连接池中的最小空闲连接min-idle: 0# 连接池中的最大空闲连接max-idle: 8# 连接池的最大数据库连接数max-active: 8# #连接池最大阻塞等待时间(使用负值表示没有限制)max-wait: -1mseureka:instance:#每间隔5s,向Eureka服务注册中心发送一次心跳,证明服务是否依然“存活”lease-renewal-interval-in-seconds: 2#告诉服务端,如果10s之内没有发送心跳,就代表故障,将本服务踢出lease-expiration-duration-in-seconds: 10#告诉服务端,服务实例以IP作为链接,不是取机器名prefer-ip-address: false#注册服务实例ID,,服务ID必须唯一 springcloud-7-service-eureka-gatewayinstance-id: ${spring.application.name}:${server.port}#注册中心的链接地址  http://eureka8761:8761/eureka,http://eureka8762:8762/eureka,http://eureka8763:8763/eurekaclient:service-url:defaultZone: http://localhost:8761/eureka

相同点:

1、底层都是servlet

2、两者均是web网关,处理的是http请求

不同点:

1、内部实现:

gateway对比zuul多依赖了spring-webflux,在spring的支持下,功能更强大,内部实现了限流、负载均衡等,扩展性也更强,但同时也限制了仅适合于Spring Cloud套件

zuul则可以扩展至其他微服务框架中,其内部没有实现限流、负载均衡等。

2、是否支持异步

Zuul仅支持同步

Zuul1.0 使用的是 BIO(Blocking IO,同步阻塞) tomcat7.0 以前都是 BIO 性能一般

Zuul2.0 性能好,使用 NIO(Non-Blocking IO,同步非阻塞)

Gateway支持异步,使用的 AIO(a+nio = aio = async + no blocking io,异步非阻塞)。理论上Gateway则更适合于提高系统吞吐量(但不一定能有更好的性能),最终性能还需要通过严密的压测来决定

3、框架设计的角度

gateway具有更好的扩展性,并且其已经发布了2.0.0的RELESE版本,稳定性也是非常好

4、性能

WebFlux 模块的名称是 spring-webflux,名称中的 Flux 来源于 Reactor 中的类 Flux。

Spring webflux 有一个全新的非堵塞的函数式 Reactive Web 框架,可以用来构建异步的、非堵塞的、事件驱动的服务,在伸缩性方面表现非常好。使用非阻塞API。 Websockets得到支持,并且由于它与Spring紧密集成,所以将会是一个更好的 开发 体验。

Zuul 1.x,是一个基于阻塞io的API Gateway。Zuul已经发布了Zuul 2.x,基于Netty,也是非阻塞的,支持长连接,但Spring Cloud暂时还没有整合计划

SpringCloud - Spring Cloud 之 Zuul和Gateway网关(十四)相关推荐

  1. Spring Cloud微服务之Gateway网关(十三)

    Gateway网关 一.网关基本概念 1.API网关介绍 2.Spring Cloud Gateway 3.Spring Cloud Gateway核心概念 4.我们在没有网关下,怎么解决客户端直接与 ...

  2. SpringCloud - Spring Cloud Netflix 之 Zuul网关;路由(十一)

    阅读本文前可先参考 SpringCloud - Spring Cloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客 一.API网关 引自百度百科 API网关,软件术语 ...

  3. SpringCloud - Spring Cloud 之 Gateway网关(十三)

    阅读本文前可先参考 ​​​​​​SpringCloud - Spring Cloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客 一.API网关 引自百度百科 API网 ...

  4. SpringCloud - Spring Cloud根/父项目,开发准备(二)

    一.Spring Cloud开发项目工程说明 在后续的 Spring Cloud 工程项目开发,以及博文中,都要注意此文说明! 1.Spring Cloud 本身并不是一个拿来即可用的框架,它是一套微 ...

  5. 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 提供动态路由 ...

  6. Spring Cloud Netflix Zuul中的速率限制

    来源:SpringForAll社区 1.引言 Spring Cloud Netflix Zuul 是一个包含Netflix Zuul的开源网关.它为Spring Boot应用增加了一些特别的特性.不幸 ...

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

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

  8. SpringCloud - Spring Cloud Netflix 之 Hystrix熔断器(七)

    阅读本文前可先参考 SpringCloud - Spring Cloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客 在微服务架构中,一个应用往往由多个服务组成,这些服 ...

  9. SpringCloud - Spring Cloud Netflix 之 Hystrix ;turbine(十)

    阅读本文前可先参考 SpringCloud - Spring Cloud根/父项目,开发准备(二) https://blog.csdn.net/MinggeQingchun/article/detai ...

最新文章

  1. Timer TimeTask Handler
  2. MyBatis 插件原理与自定义插件-用代理模式我们就要解决几个问题
  3. [C++] - C++11 多线程 - Thread
  4. 特斯拉股价,真的“血崩”!
  5. 华为telnet的两种连接方式
  6. 红帽发布虚拟化策略 产品即将上市
  7. 「leetcode」216.组合总和【回溯算法】详解!
  8. 2-set 1823: [JSOI2010]满汉全席
  9. easyui 动态添加标签页,总结
  10. ArcGIS地形图地形标注详解(附练习数据下载)
  11. 【智库解读】明天系、安邦系、海航系、复星系、联想系、中植系、三胞系、宝能系等27个超级民营金融巨头名单及其持股图揭秘!
  12. Java毕设项目房地产管理系统登录计算机(附源码+系统+数据库+LW)
  13. 【Qt】Qt6系列教程汇总
  14. 数学之美番外篇:进化论中的概率论
  15. (二十一)查询我的订单
  16. 何为“定向融资计划”?适合你投资吗?
  17. Ajax介绍和基本使用
  18. 今日头条推广精品栏助力场景破壁
  19. 知识产权律师介绍企业涉外法律服务
  20. C#模仿腾讯QQ源码下载(附效果图)_张童瑶的博客

热门文章

  1. 【彩彩只能变身队】第七次会议
  2. 极兔速递快递批量查询工具箱
  3. 语文高数英语计算机,江苏专转本高数、英语、计算机、语文复习方法.docx
  4. CVE-2016-3081
  5. 概率统计Python计算:总体未知参数的矩估计
  6. swagger2maven依赖_swagger配置
  7. html5基础知识第四章其他标签
  8. 全国计算机等级考试忘了准考证号码怎么查询
  9. 对外经贸大学金融专业考研21级分享
  10. 30岁后学oracle还有前途吗,程序员入门学习_程序员30岁后的出路