`
valiant025
  • 浏览: 17098 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

SpringCloud:Spring Cloud Gateway服务化和过滤器

 
阅读更多

1. 注册中心

1.1 准备服务和注册中心

上篇主要讲解了网关代理单个服务的使用语法,在实际的工作中,服务的相互调用都是依赖于服务中心提供的入口来使用,服务中心往往注册了很多服务,如果每个服务都需要单独配置的话,这将是一份很枯燥的工作。Spring Cloud Gateway 提供了一种默认转发的能力,只要将 Spring Cloud Gateway 注册到服务中心,Spring Cloud Gateway 默认就会代理服务中心的所有服务,下面用代码演示。(了解源码可+求求: 1791743380)

在介绍Zuul的时候,我们用到了Eureka和producer,本次演示还是需要他们两个,将他们两个CV过来。

1.2 服务网关注册到注册中心

上一篇用到的gateway也CV过来,在依赖文件里面加入:

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

 添加对eureka的依赖,在启动文件加入注解@EnableEurekaClient。

修改配置文件application.yml:

server:
  port: 8080
spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
logging:
  level:
    org.springframework.cloud.gateway: debug

 配置说明:

  • spring.cloud.gateway.discovery.locator.enabled:是否与服务注册于发现组件进行结合,通过 serviceId 转发到具体的服务实例。默认为 false,设为 true 便开启通过服务中心的自动根据 serviceId 创建路由的功能。
  • eureka.client.service-url.defaultZone指定注册中心的地址,以便使用服务发现功能
  • logging.level.org.springframework.cloud.gateway 调整相 gateway 包的 log 级别,以便排查问题

修改完成后启动 gateway 项目,访问注册中心地址 http://localhost:8761/ 即可看到名为 API-GATEWAY的服务。

1.3 测试

将 gateway 注册到服务中心之后,网关会自动代理所有的在注册中心的服务,访问这些服务的语法为:

http://网关地址:端口/服务中心注册 serviceId/具体的url

 比如我们的 producer 项目有一个 /hello 的服务,访问此服务的时候会返回:"hello "+name+",producer is ready"。

比如访问地址:http://localhost:8081/hello?name=spring,页面返回:hello spring,producer is ready。

按照上面的语法我们通过网关来访问,浏览器输入:http://localhost:8080/SPRING-CLOUD-PRODUCER/hello?name=spring 同样返回:hello spring,producer is ready。证明服务网关转发成功。

我们将项目 producer 复制一份为 producer1,将/hello服务的返回值修改为 hello spring,producer1 is ready。修改端口号为 8082 ,修完完成后重启,这时候访问注册中心后台会发现有两个名为 SPRING-CLOUD-PRODUCER的服务。

在浏览器多次访问地址:http://localhost:8888/SPRING-CLOUD-PRODUCER/hello,页面交替返回以下信息

hello spring,producer is ready。
hello spring,producer1 is ready。

 说明后端服务自动进行了均衡负载。

2. 基于 Filter(过滤器) 实现的高级功能

在Zuul高级篇中大概介绍过 Filter 的概念。

Spring Cloud Gateway 的 Filter 的生命周期不像 Zuul 的那么丰富,它只有两个:“pre” 和 “post”。

  • PRE: 这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等。
  • POST:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的 HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等。

Spring Cloud Gateway 的 Filter 分为两种:GatewayFilter 与 GlobalFilter。GlobalFilter 会应用到所有的路由上,而 GatewayFilter 将应用到单个路由或者一个分组的路由上。

Spring Cloud Gateway 内置了9种 GlobalFilter,比如 Netty Routing Filter、LoadBalancerClient Filter、Websocket Routing Filter 等,根据名字即可猜测出这些 Filter 的作者,具体大家可以参考官网内容:Global Filters

利用 GatewayFilter 可以修改请求的 Http 的请求或者响应,或者根据请求或者响应做一些特殊的限制。 更多时候我们会利用 GatewayFilter 做一些具体的路由配置,下面我们做一些简单的介绍。

2.1 快速上手 Filter 使用

我们以 AddRequestParameter GatewayFilter 来演示一下,如何在项目中使用 GatewayFilter,AddRequestParameter GatewayFilter 可以在请求中添加指定参数。

2.1.1 配置application.yml示例

server:
  port: 8080
spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
      routes:
        - id: add_request_parameter_route
          uri: http://localhost:8081
          filters:
            - AddRequestParameter=foo, bar
          predicates:
            - Method=GET
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
logging:
  level:
    org.springframework.cloud.gateway: debug

 这里的 routes 手动指定了服务的转发地址,设置所有的 GET 方法都会自动添加foo=bar,http://localhost:8081 是 producer 项目,我们在此项目中添加一个 foo() 方法,用来接收转发中添加的参数 foo。

@RequestMapping("/foo")
public String foo(String foo) {
    return "hello "+foo+"!";
}

 修改完成后重启 gateway、producer 项目。访问地址 http://localhost:8081/foo 页面返回:hello null!,说明并没有接受到参数 foo;通过网关来调用此服务,浏览器访问地址 http://localhost:8080/foo 页面返回:hello bar!,说明成功接收到参数 foo 参数的值 bar ,证明网关在转发的过程中已经通过 filter 添加了设置的参数和值。

2.2 服务化路由转发

面我们使用 uri 指定了一个服务转发地址,单个服务这样使用问题不大,但是我们在注册中心往往会使用多个服务来共同支撑整个服务的使用,这个时候我们就期望可以将 Filter 作用到每个应用的实例上,spring cloud gateway 工了这样的功能,只需要简单配置即可。

为了测试两个服务提供者是否都被调用,我们在 producer1 项目中也同样添加 foo() 方法。

@RequestMapping("/foo")
public String foo(String foo) {
    return "hello "+foo+"!@@@@";
}

 为了和 producer 中 foo() 方法有所区别,这里使用了多加了4个@。同时将 gateway 项目配置文件中的 uri 内容修改如下:

#格式为:lb://应用注册服务名
uri: lb://spring-cloud-producer

 修改完之后,重新启动项目 gateway、producer1,浏览器访问地址: http://localhost:8080/foo 页面交替出现:

hello bar!
hello bar!@@@@

 证明请求依据均匀转发到后端服务,并且后端服务均接收到了 filter 增加的参数 foo 值。

这里其实默认使用了全局过滤器 LoadBalancerClient ,当路由配置中 uri 所用的协议为 lb 时(以uri: lb://spring-cloud-producer为例),gateway 将使用 LoadBalancerClient 把 producer 通过 eureka 解析为实际的主机和端口,并进行负载均衡。

分享到:
评论

相关推荐

    最新Spring Cloud Gateway 官方参考指南-中文版-3.x

    总之,Spring Cloud Gateway是构建现代云原生应用的重要工具,它提供了高效、可扩展的API管理和路由策略,同时利用了Spring生态的优势,如Spring Boot的自动化配置和Spring WebFlux的反应式编程模型。在理解和使用...

    springcloud Gateway网关-压测用.zip

    而"简单路由及默认过滤器"则意味着Gateway已经配置了一些基础的路由规则,将请求导向不同的微服务,同时使用了SpringCloud Gateway提供的默认过滤器链,这些过滤器可能包括请求限流、身份验证等。 接下来,我们看到...

    SpringCloud项目源码下载.docx

    - **自动化配置**:理解Spring Cloud是如何通过注解和属性自动配置服务的。 - **集成测试**:研究如何编写单元测试和集成测试来验证代码逻辑。 通过以上介绍,我们不仅了解了Spring Cloud的基本概念和核心组件,还...

    Spring Cloud Gateway的全局异常处理

    Spring Cloud Gateway作为一款基于Spring Framework 5、Project Reactor和Spring Boot 2.0构建的云原生网关框架,它提供了强大的路由转发能力和灵活的过滤器模型,能够很好地满足微服务网关的各种需求。然而,在实际...

    spring cloud gateway 例子

    Spring Cloud Gateway 是一款基于 Spring Framework 5 和 Spring Boot 2 设计的云原生微服务网关,它旨在提供一种简单而有效的方式来对 API 进行路由,同时提供了过滤器功能,可以进行权限验证、限流、日志记录等...

    SpringBoot+SpringCloud+nacos+gateway+mybatis搭建微服务

    同时,通过Spring Cloud Gateway设置路由规则和过滤器,实现动态路由、熔断、限流等功能,增强系统的健壮性。 总的来说,这个项目旨在利用Spring Boot的便利性,结合Spring Cloud的分布式能力,借助Nacos实现服务...

    微服务书籍管理系统springcloud.rar

    《微服务书籍管理系统springcloud.rar》是一个包含使用Spring Cloud构建微服务架构的书籍管理系统的资源压缩包。Spring Cloud是基于Spring Boot实现的服务发现、配置、路由、熔断、负载均衡等全套微服务解决方案,它...

    spring_cloud_gateway初始demo

    3. **Filter(过滤器)**:过滤器是 Spring Cloud Gateway 实现功能的核心,它允许在请求被路由到下游服务之前或之后执行自定义逻辑。过滤器可以用于修改请求或响应,添加额外的头部,实现认证、限流等功能。 在...

    spring-cloud项目_springcloud_springcloud项目_springcloud_spring-clou

    9. **Spring Cloud Gateway**: Spring Cloud Gateway 是新一代的 API 网关,取代了 Zuul,提供更高效、更灵活的路由、过滤器等功能,同时具备更好的性能和扩展性。 10. ** Sleuth 和 Zipkin**: Sleuth 是一个分布式...

    Spring Cloud实战 _springcloud实战_springcloud_

    Spring Cloud Gateway是新一代的API网关,它替代了Zuul,提供了更强大的路由规则、过滤器等功能,能够更灵活地处理请求和响应。 此外,Spring Cloud OpenFeign是声明式服务调用的组件,简化了服务之间的调用,使得...

    SpringCloud+eureka+gateway.zip

    2. 过滤器:Gateway支持自定义过滤器,可以在请求转发前或转发后执行操作,如认证、日志记录、响应修改等。 3. 集成其他Spring Cloud组件:例如,与Eureka结合,实现动态路由到注册的服务实例。 4. 高性能:基于...

    spring-cloud-gateway-demo.zip

    Spring Cloud Gateway 是一款基于 Spring Framework 5 和 Spring Boot 2 设计的现代化微服务路由网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。在本示例 "spring-cloud-gateway-demo.zip" 中...

    SpringCloudGateway2.1使用手册中文版.rar

    在使用 SpringCloudGateway2.1 使用手册中文版时,你可以找到关于如何配置路由、使用过滤器、集成服务发现、安全设置等方面的详细指导。手册中应该会包含以下内容: 1. **快速入门**:介绍如何创建基本的 Spring ...

    SpringCloud-Gateway demo.rar

    这个“SpringCloud-Gateway demo.rar”文件很可能是包含了演示如何设置和使用 Spring Cloud Gateway 的一个示例项目。 在Spring Cloud Gateway中,核心概念有以下几点: 1. **路由(Route)**:路由是 Gateway 的...

    7天学会spring cloud教程.pdf.zip

    2. Spring Cloud Gateway:对比Zuul,理解Spring Cloud Gateway的优势,学习其动态路由、过滤器链等功能。 第三天:服务间通信与负载均衡 1. Ribbon与Feign:了解Ribbon作为客户端负载均衡器的工作原理,学习如何...

    基于spring cloud项目源码源码.rar

    4. Zuul或Spring Cloud Gateway源码:了解它们如何处理请求转发,实现API路由和过滤器,以及安全策略的集成。 四、实战应用 1. 分析配置中心Config Server和Client的交互过程,理解如何实现配置的实时更新。 2. ...

    springcloud gateway

    3. **自定义过滤器**:如果需要定制化的过滤器逻辑,可以在项目中编写自定义的 Filter 类,实现 Spring Cloud Gateway 所需的接口。 4. **POM 文件**:依赖管理,包含了 Spring Cloud Gateway 相关的依赖以及可能的...

    spring cloud gateway跨域实现

    Spring Cloud Gateway 是Spring官方推出的一款现代化的网关服务,它构建于Spring Framework 5、Project Reactor 和 Spring Boot 2之上,提供了高性能、易用的API路由管理、过滤器等功能,是Spring Cloud生态中的重要...

    SpringCloud基本框架+完整示例工程.rar

    4. **SpringCloud Zuul**:Zuul是API Gateway,它作为一个边缘服务,负责路由转发、过滤器(如安全控制、监控、动态路由等)和统一的认证。开发者可以通过Zuul对微服务架构中的所有请求进行集中式处理。 5. **...

    springcloud视频学习,学习springcloud推荐的视频,讲的真的很好

    2. **API网关**:Zuul或Spring Cloud Gateway作为系统的统一入口,可以实现路由转发、过滤器等功能,提供安全控制、限流、降级等服务。 3. **负载均衡**:Ribbon是客户端负载均衡器,可以在请求服务时动态选择合适...

Global site tag (gtag.js) - Google Analytics