小伙伴们,你们好呀,我是老寇

目录

1.动态路由

2.实现方式

3.实现过程(apollo已安装,安装地址)

1.动态路由

从注册中心获取元数据,将请求转发到对应的服务上

2.实现方式

(1).新增接口来新增\删除路由,通过redis存储路由信息

(2).使用配置中心刷新路由,新增路由配置,直接动态拉取配置信息(以apollo为例)

(3).使用actuator来动态新增\删除路由,需要开端点

3.实现过程(apollo已安装,安装地址)

(1).编写gateway.json => 需要在apollo里面配置

[
  {
    "id": "AAA",
    "uri": "lb://aaa",
    "predicates": [
      {
        "name": "Path",
        "args": {
          "pattern": "/bbb/**"
        }
      }
    ],
    "filters": [
      {
        "name": "StripPrefix",
        "args": {
          # 这里必须用parts,使用StripPrefix不起效果
          "parts": "1"
        }
      },
      {
        "name": "RequestRateLimiter",
        "args": {
          "key-resolver": "#{@ipKeyResolver}",
          "redis-rate-limiter.replenishRate": "1000",
          "redis-rate-limiter.burstCapacity": "3000"
        }
      }
    ],
    "metadata": {},
    "order": 0
  }
]

 (2).编写拉取apollo代码

@Slf4j
@Configuration
public class ApolloRouteDefinitionRepository implements RouteDefinitionRepository, ApplicationEventPublisherAware {

    private static final String ROUTES = "gateway.routes";

    private ApplicationEventPublisher publisher;

    @ApolloConfig
    private Config config;

    @ApolloConfigChangeListener(value = "application")
    private void changeHandler(ConfigChangeEvent event) {
        log.info("apollo动态拉取配置...");
        if (event.isChanged(ROUTES)) {
            this.publisher.publishEvent(new RefreshRoutesEvent(this));
        }
    }

    @Override
    public Flux<RouteDefinition> getRouteDefinitions() {
        final String property = config.getProperty(ROUTES, null);
        if (StringUtils.isBlank(property)) {
            Flux.fromIterable(Lists.newArrayList());
        }
        final List<RouteDefinition> routeDefinitions = JSON.parseArray(property, RouteDefinition.class);
        return Flux.fromIterable(routeDefinitions);
    }

    @Override
    public Mono<Void> save(Mono<RouteDefinition> route) {
        return null;
    }

    @Override
    public Mono<Void> delete(Mono<String> routeId) {
        return null;
    }

    @Override
    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
        this.publisher = applicationEventPublisher;
    }
}

只需要在apollo里面配置即可,无需重启gateway

大功告成

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐