spring-cloud-gateway - spring cloud gateway - 创建动态 java 路由
问题描述
我像这样创建了我的bean:
@Bean
public RouteLocator routes(RouteLocatorBuilder builder, LoggingGatewayFilterFactory loggingFactory) {
return builder.routes()
.route("configuracionApp",
r -> r.path("/configuracion")
.and().readBody(String.class, requestBody -> true)
.filters(
f -> f
.filter(loggingFactory.apply(new Config("My Custom Message", true, true)))
.modifyResponseBody(String.class, String.class, bodyRewrite)
)
.uri("lb://msapp")
)
.route("configuracionHorario",
r -> r.path("/configuracion/horario")
.filters(
f -> f
.filter(loggingFactory.apply(new Config("My Custom Message", true, true)))
.modifyResponseBody(String.class, String.class, bodyRewrite)
)
.uri("lb://msapp")
)
.build();
}
一切都很完美,我唯一的疑问是我是否可以从列表中创建这些路由,并将该列表保存在 yml 文件中,例如,
提前致谢
解决方案
我在application.yml中定义了一个路由列表
application:
routes:
-
id: referential
path: /referential/**
uri: https://referential.p.rapidapi.com
-
id: muslimsalat
path: /muslimsalat/**
uri: https://muslimsalat.p.rapidapi.com
我定义了一个配置属性类来映射
RouteConfigProperties.java中的属性
import java.util.List;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import lombok.Data;
@Configuration
@ConfigurationProperties(prefix = "application")
@Data
public class RouteConfigProperties
{
private List<CustomRoute> routes;
@Data
public static class CustomRoute
{
private String id;
private String path;
private String uri;
}
}
最后我在 RouteConfig.java 中定义了我的 GatewayRouteConfig
类
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder.Builder;
@Configuration
public class RouteConfig {
private final RouteConfigProperties routeConfigProperties;
public RouteConfig(RouteConfigProperties routeConfigProperties) {
this.routeConfigProperties = routeConfigProperties;
}
@Bean
RouteLocator staticRoutes(RouteLocatorBuilder builder)
{
Builder build = builder.routes();
routeConfigProperties.getRoutes().forEach(customRoute -> {
build.route(
customRoute.getId(),
route -> route.path(customRoute.getPath())
.filters(filter -> filter.addRequestHeader("x-rapidapi-host", String.format("%s.p.rapidapi.com", customRoute.getId()))
.addRequestHeader("x-rapidapi-key", "2bb4b6cd95msh13bd91f0c332909p10dc79jsn9e98442d4457")
.rewritePath(String.format("/%s/(?<segment>.*)", customRoute.getId()), "/${segment}"))
.uri(customRoute.getUri()));
});
return build.build();
}
}
不要忘记启用配置属性:
GatewayServiceApplication.java
import org.sid.gatewayservice.config.RouteConfigProperties;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
@SpringBootApplication
@EnableConfigurationProperties({ RouteConfigProperties.class })
public class GatewayServiceApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayServiceApplication.class, args);
}
}
推荐阅读
- unity3d - 更改我的 mac 后在 Unity 中看不到我的项目
- c++ - 检查图连通性的程序会产生分段错误
- c# - xUnit 并行测试集合
- spring-boot - 带有 Spring Boot 单元测试设置的 Apache Camel
- android - 无法使用自定义适配器从 firebase 获取数据,“Сan't pass null for argument pathString in child ()”
- vba - 当用户选择组合框时验证 2 个文本框是否为空
- android - java.net.ConnectException:连接失败
- spring - 蜂窝 + 弹簧靴 2 排除标准字段
- git - 所有提交的 clang-format 以修复缩进并删除尾随空格
- python - 如何自动生成 Turtle 对象?