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

news/2024/9/29 5:31:42/

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

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

server:port: 7101servlet:context-path: /
spring:application:name: spring-cloud-gatewaycloud:gateway:discovery:locator:enabled: true   #开启Eureka服务发现lower-case-service-id: trueroutes:- id: baidu_routeuri: http://www.baidu.compredicates:- Path=/baidu/**filters:- StripPrefix=1- id: hello_routeuri: http://localhost:7002predicates:- Path=/hellofilters:- CustomRewriteRouteFilter=true     # ##自定义过滤器必须有eureka:client:service-url:defaultZone: ${EUREKA_URI:http://localhost:8761/eureka}instance:prefer-ip-address: truelogging: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);@Overridepublic 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:成功


http://www.ppmy.cn/news/1530775.html

相关文章

使用宝塔部署项目在win上

项目部署 注意&#xff1a; 前后端部署项目&#xff0c;需要两个域名&#xff08;二级域名&#xff0c;就是主域名结尾的域名&#xff0c;需要在主域名下添加就可以了&#xff09;&#xff0c;前端一个&#xff0c;后端一个 思路&#xff1a;访问域名就会浏览器会加载前端的代…

【计算机网络 - 基础问题】每日 3 题(二十三)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

在 Postman 中模拟 HTTPS 请求

在 Postman 中模拟 HTTPS 请求 在 Postman 中模拟 HTTPS 请求非常简单。以下是一个基本示例&#xff0c;说明如何发送 HTTPS 请求。 示例&#xff1a;发送 HTTPS GET 请求 打开 Postman。创建一个新的请求&#xff1a; 点击左上角的“”按钮&#xff0c;打开一个新的请求标签…

1.pytest基础知识(默认的测试用例的规则以及基础应用)

一、pytest单元测试框架 1&#xff09;什么是单元测试框架 单元测试是指再软件开发当中&#xff0c;针对软件的最小单位&#xff08;函数&#xff0c;方法&#xff09;进行正确性的检查测试。 2&#xff09;单元测试框架 java&#xff1a;junit和testing python&#xff1a;un…

微信小程序-分包加载

文章目录 微信小程序-分包加载概述基本使用打包和引用原则独立分包分包预下载 微信小程序-分包加载 概述 小程序的代码通常是由许多页面、组件以及资源等组成&#xff0c;随着小程序功能的增加&#xff0c;代码量也会逐渐增加&#xff0c;体积过大就会导致用户打开速度变慢&a…

Flink Lookup Join的工作原理、性能优化和应用场景

目录 1 Flink Lookup Join的工作原理 1.1 数据流处理与维表关联 1.2 键值对查询 1.3 数据时效性与准确性 2 Flink Lookup Join的实现方法 2.1 SQL语句编写 2.2 系统架构与数据流 3 Flink Lookup Join的性能优化 3.1 数据存储与索引 3.2 连接算法优化 3.3 资源配置与…

小程序视频编辑SDK解决方案,轻量化视频制作解决方案

面对小程序、网页、HTML5等多样化平台&#xff0c;如何轻松实现视频编辑的轻量化与高效化&#xff0c;成为了众多开发者和内容创作者共同面临的挑战。正是洞察到这一市场需求&#xff0c;美摄科技推出了其领先的小程序视频编辑SDK解决方案&#xff0c;为创意插上翅膀&#xff0…

CSS基本概念以及CSS的多种引入方式

CSS基本概念 CSS是层叠样式表&#xff0c;又叫级联样式表&#xff0c;简称样式表。CSS的文件后缀为.css&#xff0c;CSS用于HTML文档中元素样式的定义。 CSS的基本语法 CSS的规则由2个主要的部分构成&#xff1a;选择器以及一条或者多条声明。 选测器通常是你血药改变样式的…