spring cloud gateway的stripPrefix配置

本文主要研究下spring cloud gateway的stripPrefix配置

使用zuul的配置

zuul:
  routes:
    demo:
      sensitiveHeaders: Access-Control-Allow-Origin,Access-Control-Allow-Methods    
      path: /demo/**
      stripPrefix: true
      url: http://demo.com.cn/
复制代码

这里的stripPrefix默认为true,也就是所有/demo/xxxx的请求转发给http://demo.com.cn/xxxx ,去除掉demo前缀

使用spring cloud gateway的配置

spring:
  cloud:
    gateway:
      default-filters:
      - AddResponseHeader=X-Response-Default-Foo, Default-Bar
      routes:
      - id: demo
        uri: http://demo.com.cn:80
        order: 8999 ## 越小越优先
        predicates: 
        - Path=/demo/**
        filters:
        - RewritePath=/demo/(?<segment>.*), /$\{segment}
复制代码

spring cloud gateway貌似没有现成的stripPrefix的配置,不过可以通过rewritepath来实现

spring-cloud-gateway-core-2.0.0.M6-sources.jar!/org/springframework/cloud/gateway/filter/factory/RewritePathGatewayFilterFactory.java

public class RewritePathGatewayFilterFactory implements GatewayFilterFactory {

	public static final String REGEXP_KEY = "regexp";
	public static final String REPLACEMENT_KEY = "replacement";

	@Override
	public List<String> argNames() {
		return Arrays.asList(REGEXP_KEY, REPLACEMENT_KEY);
	}

	@Override
	public GatewayFilter apply(Tuple args) {
		final String regex = args.getString(REGEXP_KEY);
		String replacement = args.getString(REPLACEMENT_KEY).replace("$\\", "$");
		return apply(regex, replacement);
	}

	public GatewayFilter apply(String regex, String replacement) {
		return (exchange, chain) -> {
			ServerHttpRequest req = exchange.getRequest();
			addOriginalRequestUrl(exchange, req.getURI());
			String path = req.getURI().getPath();
			String newPath = path.replaceAll(regex, replacement);

			ServerHttpRequest request = mutate(req)
					.path(newPath)
					.build();

			exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, request.getURI());

			return chain.filter(exchange.mutate().request(request).build());
		};
	}
}
复制代码

主要是这段String newPath = path.replaceAll(regex, replacement),这里相当于regex是/demo/(?<segment>.*),replacement是/${segment}

小结

spring cloud gateway利用RewritePath可以实现原来的zuul的stripPrefix的效果,而且功能更强大。

doc

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Cloud Gateway可以与Ribbon组件整合,以实现负载均衡的功能。下面是一个示例,演示了如何使用Spring Cloud Gateway整合Ribbon: 1. 首先,确保你已经在项目的pom.xml文件中添加了Spring Cloud Gateway和Ribbon的依赖。 2. 创建一个Spring Boot应用程序,并在启动类上添加`@EnableEurekaClient`注解,以便将应用程序注册到Eureka Server。 3. 在应用程序的配置文件中,配置Eureka Server的地址和端口号。 4. 创建一个`@Configuration`类,用于配置Spring Cloud Gateway和Ribbon。 ```java @Configuration public class GatewayConfig { @Autowired private DiscoveryClient discoveryClient; @Bean public RouteLocator customRouteLocator(RouteLocatorBuilder builder) { return builder.routes() .route("service-route", r -> r.path("/api/**") .filters(f -> f.stripPrefix(1)) .uri("lb://service")) .build(); } @Bean public LoadBalancerClient loadBalancerClient() { return new RibbonLoadBalancerClient(discoveryClient); } } ``` 在上面的配置中,我们创建了一个`RouteLocator` bean,用于定义路由规则。在这个例子中,我们将所有以`/api/`开头的请求转发到名为`service`的微服务上。同时,我们还创建了一个`LoadBalancerClient` bean,用于实现负载均衡。 5. 创建一个Controller类,用于处理请求并返回响应。 ```java @RestController public class GatewayController { @GetMapping("/api/hello") public String hello() { return "Hello from service!"; } } ``` 在上面的例子中,我们创建了一个`/api/hello`的GET请求处理方法,返回一个简单的字符串。 6. 启动应用程序,并访问`http://localhost:8080/api/hello`,你将会看到从`service`微服务返回的响应。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值