首页 > 其他分享 >SpringCloud gatewayeFilter之一

SpringCloud gatewayeFilter之一

时间:2023-05-04 21:14:42浏览次数:43  
标签:之一 producer SpringCloud hello gatewayeFilter Path segment id 路由

1、AddRequestHeader GatewayFilter

AddRequestHeader GatewayFilter采用名称和值参数。例如:

spring:
  cloud:
    gateway:
      enabled: true
      routes:
        - id: Goods-Server  # 路由 id,唯一标识
          uri: lb://producer
          predicates:
            #  - Path=/**  # 断言,路由匹配条件,匹配 /product 开头的所有 api
              - Path=/producer/**
          filters:
              - StripPrefix=1
              - AddRequestHeader=X-Request-red, blue

此列表将X-Request-red:blue标头添加到所有匹配请求的下游请求标头中。

Producer服务的controller:

@RequestMapping("/hello")
public String hello(String name, HttpServletRequest request) {
    System.out.println(request.getHeader("x-request-red"));
    return "hello," + name + "," + port;
}

访问http://localhost:8500/producer/hello,看到
 

 

AddRequestHeader也用于匹配路径或主机的URI变量:

spring:
  cloud:
    gateway:
      enabled: true
      routes:
        - id: Goods-Server  # 路由 id,唯一标识
          uri: lb://producer
          predicates:
            #  - Path=/**  # 断言,路由匹配条件,匹配 /product 开头的所有 api
              - Path=/producer/{segment}
          filters:
              - StripPrefix=1
              - AddRequestHeader=X-Request-red, Blue-{segment}

访问http://localhost:8500/producer/hello,看到
 

 

2、AddRequestParameter GatewayFilter

AddRequestParameter GatewayFilter采用名称和值参数。例如:

spring:
  cloud:
    gateway:
      enabled: true
      routes:
        - id: Goods-Server  # 路由 id,唯一标识
          uri: lb://producer
          predicates:
            #  - Path=/**  # 断言,路由匹配条件,匹配 /product 开头的所有 api
              - Path=/producer/{segment}
          filters:
              - StripPrefix=1
              - AddRequestHeader=X-Request-red, Blue-{segment}
              - AddRequestParameter=red, blue

这将为所有匹配请求的下游请求的查询字符串添加red=blue。

 

Producer服务controller:

@RequestMapping("/hello")
public String hello(String name, HttpServletRequest request) {
    System.out.println(request.getHeader("x-request-red"));
    System.out.println(request.getParameter("red"));
    return "hello," + name + "," + port;
}

访问http://localhost:8500/producer/hello,看到
 

 

AddRequestParameter也用于匹配路径或主机的URI变量:

spring:
  cloud:
    gateway:
      enabled: true
      routes:
        - id: Goods-Server  # 路由 id,唯一标识
          uri: lb://producer
          predicates:
            #  - Path=/**  # 断言,路由匹配条件,匹配 /product 开头的所有 api
              - Path=/producer/{segment}
          filters:
              - StripPrefix=1
              - AddRequestHeader=X-Request-red, Blue-{segment}
              - AddRequestParameter=red, bar-{segment}

访问http://localhost:8500/producer/hello,看到
 

 

3、AddResponseHeader GatewayFilter

AddResponseHeader GatewayFilter采用名称和值参数。这会将响应头添加到所有匹配请求的下游响应标头中。例如:

spring:
  cloud:
    gateway:
      enabled: true
      routes:
        - id: Goods-Server  # 路由 id,唯一标识
          uri: lb://producer
          predicates:
            #  - Path=/**  # 断言,路由匹配条件,匹配 /product 开头的所有 api
              - Path=/producer/{segment}
          filters:
              - StripPrefix=1
              - AddResponseHeader=X-Response-Red, Blue

访问http://localhost:8500/producer/hello,从浏览器控制台中可看到响应头:
 

 
AddResponseHeader也用于匹配路径或主机的URI变量:

spring:
  cloud:
    gateway:
      enabled: true
      routes:
        - id: Goods-Server  # 路由 id,唯一标识
          uri: lb://producer
          predicates:
            #  - Path=/**  # 断言,路由匹配条件,匹配 /product 开头的所有 api
              - Path=/producer/{segment}
          filters:
              - StripPrefix=1
              - AddResponseHeader=X-Response-Red, Blue-{segment}

访问http://localhost:8500/producer/hello,从浏览器控制台中可看到响应头:
 

 

4、DedupeResponseHeader GatewayFilter

DedupeResponseHeader GatewayFilter采用名称参数和可选策略参数。name可以包含一个以空格分隔的标头名称列表。例如:

spring:
  cloud:
    gateway:
      enabled: true
      routes:
        - id: Goods-Server  # 路由 id,唯一标识
          uri: lb://producer
          predicates:
            #  - Path=/**  # 断言,路由匹配条件,匹配 /product 开头的所有 api
              - Path=/producer/{segment}
          filters:
              - StripPrefix=1
              - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin

将删除Access-Control-Allow-Credentials和Access-Control-Allow-Origin头的重复值。

5、Spring Cloud CircuitBreaker GatewayFilter

Spring Cloud CircuitBreaker GatewayFilter工厂使用Spring Cloud CircutBreaker API将网关路由封装在断路器中。Spring Cloud CircuitBreaker支持可与Spring Cloud Gateway一起使用的多个库。Spring Cloud支持开箱即用的Resilience4J。在GatewayServer模块加入依赖:

<dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-circuitbreaker-reactor-resilience4j</artifactId>
    </dependency>

并添加controller:

@RestController
public class Fallback {

    private String dateStr(){
        return new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
    }

    /**
     * 返回字符串类型
     * @return
     */
    @GetMapping("/myfallback")
    public String helloStr() {
        return "myfallback, " + dateStr();
    }
}

在application.yml配置:

spring:
  cloud:
    gateway:
      enabled: true
      routes:
        - id: Goods-Server  # 路由 id,唯一标识
          uri: lb://producer
          predicates:
            #  - Path=/**  # 断言,路由匹配条件,匹配 /product 开头的所有 api
              - Path=/producer/{segment}
          filters:
              - StripPrefix=1
              - name: CircuitBreaker
                args:
                    name: myCircuitBreaker
                    fallbackUri: forward:/myfallback

fallbackUri中的url要和上面controller中的url相同。当出现异常时会转发到fallbackUri。现在关闭Producer服务,访问http://localhost:8500/producer/hello,看到myfallback, 2023-05-04 08:27:53。

 

也可以根据响应状态码列表来触发熔断开关。可以配置响应状态码,也可以配置HttpStatus枚举。例如:

spring:
  cloud:
    gateway:
      enabled: true
      routes:
        - id: Goods-Server  # 路由 id,唯一标识
          uri: lb://producer
          predicates:
            #  - Path=/**  # 断言,路由匹配条件,匹配 /product 开头的所有 api
              - Path=/producer/{segment}
          filters:
              - StripPrefix=1
              - AddRequestHeader=X-Request-red, Blue-{segment}
              - AddRequestParameter=red, bar-{segment}
              - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin
              - name: CircuitBreaker
                args:
                    name: myCircuitBreaker
                    fallbackUri: forward:/myfallback
                    statusCodes:
                      - 500

修改Producer的controller:

 @RequestMapping("/hello")
public String hello(String name, HttpServletRequest request, HttpServletResponse response) {
    System.out.println(request.getHeader("x-request-red"));
    System.out.println(request.getParameter("red"));
    response.setStatus(500);
    return "hello," + name + "," + port;
}

访问http://localhost:8500/producer/hello,看到myfallback, 2023-05-04 08:48:07。将response.setStatus(500);改成response.setStatus(404);重新访问http://localhost:8500/producer/hello,看到hello,null,8002。

修改gateway的application.yml配置

spring:
  cloud:
    gateway:
      enabled: true
      routes:
        - id: Goods-Server  # 路由 id,唯一标识
          uri: lb://producer
          predicates:
            #  - Path=/**  # 断言,路由匹配条件,匹配 /product 开头的所有 api
              - Path=/producer/{segment}
          filters:
              - StripPrefix=1
              - AddRequestHeader=X-Request-red, Blue-{segment}
              - AddRequestParameter=red, bar-{segment}
              - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin
              - name: CircuitBreaker
                args:
                    name: myCircuitBreaker
                    fallbackUri: forward:/myfallback
                    statusCodes:
                      - 500
                      - "NOT_FOUND"

重新访问http://localhost:8500/producer/hello,看到myfallback, 2023-05-04 08:50:27。

标签:之一,producer,SpringCloud,hello,gatewayeFilter,Path,segment,id,路由
From: https://www.cnblogs.com/shigongp/p/17369737.html

相关文章

  • 【SpringCloud】 Eureka 单机模式
    系统配置信息springboot版本:2.1.6.RELEASEjdk:1.8系统:Windows10工程结构父工程halo-cloud-parent子工程<注册中心>halo-cloud-server子工程<服务消费者>halo-cloud-consumer子工程<服务提供者>halo-cloud-providerhalo-coud-parent依赖引入<!--打......
  • PM配置详解之一:企业结构
    1.维护计划工厂功能说明在公司结构中定义维护工厂(通常已经作为后勤工厂存在)和维护计划工厂(简称计划工厂)。维护工厂:设备所安装的位置,如某机组安装在合营公司,那么合营公司就是此机组的维护工厂,而并不是具体负责维护的组织。维护计划工厂:计划工厂指的是制订维护计划的工厂或部门,是......
  • 基于springcloud实现的医院信息系统
    访问【WRITE-BUG数字空间】_[内附完整源码和文档]医疗信息就诊系统,系统主要功能按照数据流量、流向及处理过程分为临床诊疗、药品管理、财务管理、患者管理。诊疗活动由各工作站配合完成,并将临床信息进行整理、处理、汇总、统计、分析等。本系统包括以下工作站:门诊医生工作站、药房......
  • SpringCloud gateway谓词
    1、AfterRoutePredicateFactoryAfter路由谓词工厂接受一个参数,一个日期时间(它是一个javaZonedDateTime)。此谓词匹配在指定日期时间之后发生的请求。例如:spring:cloud:gateway:enabled:trueroutes:-id:Goods-Server#路由id,唯一标识......
  • SpringCloud之gateway使用
    使用SpringCloudGateway是为了取代Zuul而开发出来的新一代网关,采用了响应式编程。 新建ModuleGatewayServer,添加依赖:<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></depe......
  • SpringCloud服务注册与发现(Eureka)
    0、前言   微服务是近两年比较火的概念,被称为程序员必备技能之一了,可见其运用之广。最近整理下资料进行系统的学习,与大家一一分享。    微服务是相对于传统单体式架构而言的。单体式架构是一份代码,部署都是基于单个单元进行的,它的优点是易于部署,但面临的就是可用性低......
  • SpringCloud服务注册中心双节点集群(Eureka集群)
    0、前言    最近在进行重构一个新项目,为了后续更好的落地,适应于日新月异的技术更新,进行了各方的技术选型及技术预研,最终选型基于微服务架构体系进行开发重构。项目构建前最重要的一步就是要想清楚,整体的部署架构、高可用性(HA)等等,做好前期的部署架构技术调研,确定最终方案......
  • SpringCloud之Seata(一)
    思维导图1.概述1.1概念Seata是一款开源的分布式事务解决方案,提供高性能和简单易用的分布式事务服务。2.事务概述2.1角色TC((TransactionCoordinator)):事务协调者:维护全局和分支事务的状态,驱动全局事务提交或回滚。TM(TransactionManager):事务管理器:定义全局事务的范围:开......
  • ibatis学习之一对多关联
    基于本人的这篇文章http://chenzheng8975.iteye.com/blog/1718765的基础上,对ibatis进行深入的学习:Clazz.java:packagecom.cz.model;importjava.util.ArrayList;importjava.util.List;publicclassClazz{ privateintid; privateStringclassname; privateList<Stud......
  • SpringCloud学习笔记
    Eureka基本知识Eureka主要学习的是微服务的一些基本概念之类的,至于具体的操作其实都是在配置appolication.yml文件了,多看文档以及自己写过的demo就懂了。Eureka在微服务中承担的角色有三个,一个是注册中心server,一个是服务供给方porvider,以及接受用户请求的consumer,如果从启动类......