微服务之网关

1.网关的选择

 Zuul 和 Spring Cloud Gateway  (其他没用过了)

2. Zuul(Netflix Zuul)与Spring Cloud Gateway对比

  • 性能方面
    • Zuul:Zuul 1.x是基于Servlet的同步阻塞模型,在处理高并发请求时性能相对较弱。每个请求都会占用一个线程,当并发量较大时,线程资源可能会成为瓶颈。不过,Zuul 2.x版本在性能上有所改进,采用了异步非阻塞模型,能够更好地处理高并发场景。
    • Spring Cloud Gateway:从一开始就采用了WebFlux框架,基于Reactor的异步非阻塞模型。这种设计使得它在高并发情况下性能表现优秀,能够高效地利用系统资源,通过少量的线程处理大量的请求,减少了线程上下文切换的开销。例如,在处理大量的HTTP请求时,Spring Cloud Gateway能够更快地响应,吞吐量也相对较高。
  • 功能特性方面
    • Zuul:功能较为全面,除了基本的路由功能外,还提供了过滤器机制。可以通过编写过滤器来实现请求的前置处理(如鉴权、限流)和后置处理(如添加响应头、记录日志)。在服务治理方面,它能够与Netflix的其他组件(如Eureka服务发现)很好地集成,方便在微服务架构中进行服务的发现和调用。
    • Spring Cloud Gateway:同样具有强大的路由功能,并且支持多种路由匹配方式,如基于请求路径、请求头、请求参数等。它的过滤器功能也很灵活,分为全局过滤器和局部过滤器,可以对请求和响应进行细粒度的处理。在配置方面,Spring Cloud Gateway使用了更简洁的配置方式,基于Java代码或者YAML配置文件,能够快速地配置路由规则和过滤器。
  • 生态系统和社区支持方面
    • Zuul:作为Netflix开源的网关组件,曾经在微服务领域有广泛的应用。它与Netflix的一系列微服务框架和工具一起构成了一个相对完整的生态系统。不过,随着Netflix开源策略的调整,Zuul的更新速度有所放缓。但其社区仍然比较活跃,有大量的文档和实践案例可供参考。
    • Spring Cloud Gateway:它是Spring Cloud生态系统的一部分,与Spring Cloud的其他组件(如Spring Cloud Config、Spring Cloud Sleuth)有很好的集成性。Spring Cloud本身拥有庞大的用户群体和活跃的社区,这使得Spring Cloud Gateway在文档更新、问题解决和功能扩展方面有很强的优势。新的功能和优化能够快速地在社区中传播和应用。

3.最终选择 

   使用gateaway,主要还是社区支持和易用性,网上教程多(毕竟内部项目,并发不高)

1. 性能

  • Spring Cloud Gateway: 基于 Spring WebFlux 和 Reactor,采用异步非阻塞模型,性能更高。

  • Zuul: Zuul 1.x 是同步阻塞模型,性能较低;Zuul 2.x 虽然改进了,但社区支持不如 Spring Cloud Gateway。

2. 社区支持和生态系统

  • Spring Cloud Gateway: 作为 Spring Cloud 的一部分,与 Spring 生态系统集成良好,社区活跃,文档丰富。

  • Zuul: Netflix 已停止维护 Zuul,社区支持较弱。

3. 功能特性

  • Spring Cloud Gateway: 提供丰富的功能,如动态路由、限流、熔断、重试、路径重写等,且易于扩展。

  • Zuul: 功能相对较少,扩展性较差。

4. 配置和易用性

  • Spring Cloud Gateway: 配置简单,支持 YAML 和 Java 配置,与 Spring Boot 无缝集成。

  • Zuul: 配置复杂,尤其是 Zuul 2.x 的异步模型增加了配置难度。

5. 可扩展性

  • Spring Cloud Gateway: 基于 Spring 框架,易于扩展和定制。

  • Zuul: 扩展性较差,定制复杂。

6. 文档和资源

  • Spring Cloud Gateway: 文档详细,社区资源丰富,易于上手。

  • Zuul: 文档较少,资源有限,学习曲线较陡。

7. 未来维护

  • Spring Cloud Gateway: 由 Spring 团队维护,未来更新有保障。

  • Zuul: Netflix 已停止维护,未来更新不确定。

总结

选择 Spring Cloud Gateway 主要是因为其性能优越、社区支持强大、功能丰富、配置简单、易于扩展和未来维护有保障。而 Zuul 由于社区支持减弱和维护不确定性,逐渐被 Spring Cloud Gateway 取代。

4.快速使用

4.1添加依赖


    org.springframework.cloud
    spring-cloud-starter-gateway

4.2 添加配置

server:
  port: 8088
spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      routes:
        - id: order_route # 路由id唯一标识  到订单 (明名按照规则)
          uri: http://localhost:8020 #需要转发的地址
          predicates: # 断言规则,用于路由规则匹配
            - Path=/order-server/**
          filters:  # 去掉前缀
            - StripPrefix=1 # 转发前去掉前缀第一层路径
#      路由规则

4.3 整合nacos

server:
  port: 8088
spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      routes:
        - id: order_route
          uri: lb://order-server   # 路由到哪个服务   lb:使用nacos中的本地负载均衡策略
          predicates:
            - Path=/order-server/**
          filters:
            - StripPrefix=1
# 配置nacos
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        username: nacos
        password: nacos

4.4自动配置不用断言 ,按照约定来 访问地址加上服务名(但是一般不用,还是使用断言)

server:
  port: 8088
spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true # 开启服务发现 自动识别nacos服务

5.遇到的实际问题

5.1‌启动报错‌:

排除无关jar包引入‌:确保没有引入不必要的依赖,如spring-boot-starter-web。如果遇到数据源错误,应移除alibaba-druid等相关依赖;如果是JDBC错误,检查是否重复引入了JDBC相关的jar包‌。

5.2自定义断言工厂

  • 必须是一个bean
  • 类必须 以 RoutePredicateFactory 结尾 (底层反射)
  • 继承 extends AbstractRoutePredicateFactory
  • 实现静态内部类 config(接受配置信息)
  • 结合shortcutFieldOrder 进行绑定
  • 通过apply进行判断true 成功 ,false 失败
  • 然后配置文件配置自定义的 (我自定义的叫 CheckAuthorRoutePredicateFactory)
          routes:
            - id: order_route
              uri: lb://order-server   # 路由到哪个服务   lb:使用nacos中的本地负载均衡策略
              predicates:
    #            - Path=/order-server/**  #路径断言
    #            - After=2028-01-01T12:00:00+08:00[Asia/Shanghai] # 时间 断言
    #            - Query=name,zhang|li # 断言参数
                - CheckAuthor=zkm12 # 自定义断言

  • 5.3自定义过滤器

  • 名字还是GatewayFilterFactory 结尾
  • 继承AbstractGatewayFilterFactory
  • apply 中写实现
  • 微服务之网关_第1张图片

5.4配置全局日志

-Dreactor.netty.http.server.accessLogEnable=true

5.5跨域解决

1.网关统一解决

#          跨域配置
      globalcors:
        cors-configurations:
          '[/**]':
            allowedOrigins: "*"
            allowedMethods: "*"
            allowedHeaders: "*"
            allowCredentials: true

2.bean方式解决

微服务之网关_第2张图片

5.6 整合sentinel

1.添加依赖


    org.springframework.cloud
    spring-cloud-starter-gateway



    com.alibaba.cloud
    spring-cloud-starter-alibaba-sentinel

2. 添加配置

#    配置sentinel
    sentinel:
      transport:
        dashboard: localhost:8858 # sentinel控制台地址

你可能感兴趣的:(微服务,负载均衡,架构)