Solon v3.3.3

Route 的配置与注册方式

</> markdown

路由的配置与注册有三种方式:手动配置;自动发现配置;代码注册。

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);
    }
}