两种方式实现 Url映射
第一种:配置文件形式
匹配的路径是 /pro 。就会映射到 EUREKA-CLIENT 服务,并自动做负载均衡
# 路由id
spring.cloud.gateway.routes-id=eurekaClient
# 路由匹配成功,要转发到哪里:转发到eureka-client服务
spring.cloud.gateway.routes[0].uri=lb://EUREKA-CLIENT
spring.cloud.gateway.routes[0].predicates[0]=Path=/pro/**
spring.cloud.gateway.routes[0].filters[0]=StripPrefix=1
yml格式如下
spring:
application:
name: gateway-service
cloud:
gateway:
discovery:
locator:
enabled: true
lower-case-service-id: true
routes:
- id: eurekaClient
uri: lb://EUREKA-CLIENT
predicates:
- Path=/pro/**
filters:
- StripPrefix=1
访问接口地址 : http://localhost:65000/pro/hi 可以看到实现了Url的映射,并自动实现负载均衡
第二种格式:Java代码配置
@Configuration
public class GatewayConfiguration {
@Bean
@Order
public RouteLocator cunstomRoutes(RouteLocatorBuilder builder){
return builder.routes().route(r -> r.path("/java/**")
.and().method(HttpMethod.GET)
.and().header("token") // 请求header里必须有指定的值 token
.filters(f -> f.stripPrefix(1)
.addResponseHeader("java-gateway-param","1122334")//给响应头加个参数
)
.uri("lb://EUREKA-CLIENT")
).build();
}
}
在代码中限制了请求中必须带有请求头,
在返回的 response 中,也看到了返回的数据
配置多个路由规则
需要配置多个路由规则,只需要配置多个 .route
public class GatewayConfiguration {
@Bean
@Order
public RouteLocator cunstomRoutes(RouteLocatorBuilder builder){
return builder.routes().
route(r -> r.path("/java/**")
.and().method(HttpMethod.GET)
.and().header("token") // 请求header里必须有指定的值 token
.filters(f -> f.stripPrefix(1) //过滤第一个路径
.filter(eurekaClientGatewayFilter)
.addResponseHeader("java-gateway-param","1122334") //给响应头加个参数
)
.uri("lb://EUREKA-CLIENT"))
.route(r -> r.path("/seckill/**").and() // 这里又是一个新的 Url 路由
.after(ZonedDateTime.now().plusMinutes(1)). // after 在xx时间之后生效。ZonedDateTime.now() 当前时间 .plusMinutes(1) 延后一分钟
// .before() 在 xx 时间点之前才有效,之后就没效果了
uri("lb://EUREKA-CLIENT")).build();
}
}