Route 的配置与注册方式
路由的配置与注册有三种方式:手动配置;自动发现配置;代码注册。
1、手动配置方式
solon.cloud.gateway:
routes: #!必选
- id: demo
target: "http://localhost:8080" # 或 "lb://user-service"
predicates: #?可选
- "Path=/demo/**"
filters: #?可选
- "StripPrefix=1"
2、自动发现配置方式
使用自动发现配置,需要 Solon Cloud Discovery 插件配套。
solon.app:
name: demo-gateway
group: gateway
solon.cloud.nacos:
server: "127.0.0.1:8848" #以nacos为例
solon.cloud.gateway:
discover:
enabled: true
excludedServices:
- "self-service-name"
defaultFilters:
- "StripPrefix=1"
3、代码注册方式
@Configuration
public class DemoConfig {
@Bean
public void init(CloudRouteRegister register) {
register.route("user-service", r -> r.path("/user/**").target("lb://user-service"))
.route("order-service", r -> r.path("/order/**").target("lb://order-service"));
}
}
4、监视 solon cloud config 配置,并同步更新
@CloudConfig("demo.yml")
public class DemoUpdate implements CloudConfigHandler {
private static final String SOLON_CLOUD_GATEWAY = "solon.cloud.gateway";
@Inject
CloudRouteRegister routeRegister;
@Override
public void handle(Config config) {
Properties properties = config.toProps();
final Props gatewayProps = new Props(properties).getProp(SOLON_CLOUD_GATEWAY);
final GatewayProperties gatewayProperties;
if (gatewayProps.size() > 0) {
gatewayProperties = gatewayProps.toBean(GatewayProperties.class);
} else {
gatewayProperties = new GatewayProperties();
}
for (RouteProperties rm : gatewayProperties.getRoutes()) {
update(rm, gatewayProperties);
}
}
private void update(RouteProperties rm, GatewayProperties gatewayProperties) {
RouteSpec route = new RouteSpec(rm.getId());
route.index(rm.getIndex());
route.target(URI.create(rm.getTarget()));
if (LoadBalance.URI_SCHEME.equals(route.getTarget().getScheme())) {
//起到预热加载作用
LoadBalance.get(route.getTarget().getHost());
}
if (rm.getPredicates() != null) {
//route.predicates
for (String predicateStr : rm.getPredicates()) {
route.predicate(RouteFactoryManager.buildPredicate(predicateStr));
}
}
if (rm.getFilters() != null) {
//route.filters
for (String filterStr : rm.getFilters()) {
route.filter(RouteFactoryManager.buildFilter(filterStr));
}
}
if (rm.getTimeout() != null) {
route.timeout(rm.getTimeout());
} else {
route.timeout(gatewayProperties.getHttpClient());
}
routeRegister.route(route);
}
}