Spring Cloud Gateway 之动态uri 自定义过滤器

背景:第三方公司 请求本公司入参和出参一样的同一个接口,根据业务类型不一样需要不同业务微服务处理 ,和第三方公司协商在请求头中加入业务类型方便我公司在网关成分发请求。

1:在spring cloud gateway yml 中加入路由 重点是 - id: hello_route

复制代码
server:
  port: 7101
  servlet:
    context-path: /
spring:
  application:
    name: spring-cloud-gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true   #开启Eureka服务发现
          lower-case-service-id: true
      routes:
        - id: baidu_route
          uri: http://www.baidu.com
          predicates:
            - Path=/baidu/**
          filters:
            - StripPrefix=1
        - id: hello_route
          uri: http://localhost:7002
          predicates:
            - Path=/hello
          filters:
            - CustomRewriteRouteFilter=true     # ##自定义过滤器必须有

eureka:
  client:
    service-url:
      defaultZone: ${EUREKA_URI:http://localhost:8761/eureka}
  instance:
    prefer-ip-address: true

logging:
  level:
    org.springframework.cloud.gateway: debug

2:过滤器实现

复制代码
package tigee.filter;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.cloud.gateway.route.Route;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.util.MultiValueMap;
import org.springframework.web.util.UriComponentsBuilder;

import java.net.URI;
import java.util.List;

import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR;

@Component
public class CustomRewriteRouteFilter extends AbstractGatewayFilterFactory {
    private static final Log log = LogFactory.getLog(CustomRewriteRouteFilter.class);

    @Override
    public GatewayFilter apply(Object config) {
        return (exchange, chain) -> {
            //获取url地址
            ServerHttpRequest request = exchange.getRequest();
            String rawPath = request.getURI().getRawPath();
            //请求头
            HttpHeaders headers = request.getHeaders();
            //请求方法
            HttpMethod method = request.getMethod();
            //请求参数
            MultiValueMap < String, String > queryParams = request.getQueryParams();

            List<String> serveqp = queryParams.get("serve");
            log.info("serveqp--->:"+serveqp);
            List<String> servehd = headers.get("serve");
            String serve = "";
            if(!CollectionUtils.isEmpty(serveqp)){
                serve =serveqp.get(0);
            }else if(!CollectionUtils.isEmpty(servehd)){
                serve =servehd.get(0);
            }
            log.info("serve--->:"+serve);
            URI uri = UriComponentsBuilder.fromUriString("lb://"+serve).queryParams(queryParams).build().toUri();
            //替换新的url地址
            ServerHttpRequest serverHttpRequest = request.mutate().uri(uri).path(request.getPath().value()).method(method).headers(
                    httpHeaders -> httpHeaders=headers).build();
            Route route = exchange.getAttribute(GATEWAY_ROUTE_ATTR);
            //从新设置Route地址
            Route newRoute =
                    Route.async().asyncPredicate(route.getPredicate()).filters(route.getFilters()).id(route.getId())
                            .order(route.getOrder()).uri(uri).build();
            exchange.getAttributes().put(GATEWAY_ROUTE_ATTR,newRoute);
            return chain.filter(exchange.mutate().request(serverHttpRequest).build());
        };
    }
}

3:user-service 和 order-service 创建hellocontroller

复制代码
@RestController
public class HelloController{

    @Value("${server.port}")
    private int port;
    @Value("${spring.application.name}")
    private String serve;

    @RequestMapping("hello")
    public String hello(String name){
        return "你好:"+serve+":"+port+":"+name;
    }
}

4:启动服务

5:验证

postman 请求 http://localhost:7101/hello?name=name2

header中加入 serve = user-service 或者 order-service

6:成功

相关推荐
地瓜伯伯2 小时前
Nginx终极配置指南:负载均衡、限流、反向代理、IP白名单、SSL、云原生、DNS解析、缓存加速全都有
spring boot·nginx·spring·spring cloud·微服务·云原生·负载均衡
小安同学iter12 小时前
天机学堂day05
java·开发语言·spring boot·分布式·后端·spring cloud·微服务
我是小妖怪,潇洒又自在14 小时前
springcloud alibaba(六)Sentinel 配置
spring·spring cloud·sentinel
摇滚侠15 小时前
2025最新 SpringCloud 教程,接口测试,本地事务,打通链路,笔记65,笔记66,笔记67
笔记·spring·spring cloud
血小溅16 小时前
Spring Cloud 整合 Nacos:注册中心初始化全解析与 Spring 扩展技术揭秘(新增 Spring Boot 版本迭代差异)
spring cloud
Li_76953218 小时前
Spring Cloud —— SkyWalking(三)
spring·spring cloud·skywalking
Li_7695322 天前
Spring Cloud —— SkyWalking (一)
spring·spring cloud·skywalking
Ttang232 天前
【SpringCloud1】从单体架构到分布式系统架构
分布式·spring cloud·架构
摇滚侠2 天前
2025最新 SpringCloud 教程,熔断规则-熔断策略-异常比例,笔记45
redis·笔记·spring cloud
摇滚侠2 天前
2025最新 SpringCloud 教程,Seat-原理-四种事务模式,总结,笔记72,笔记73
笔记·spring·spring cloud·架构