apollo + gateway 实现动态路由(踩坑日记)
2).使用配置中心刷新路由,新增路由配置,直接动态拉取配置信息((1).新增接口来新增\删除路由,通过redis存储路由信息。(3).使用actuator来动态新增\删除路由,需要开端点。从注册中心获取元数据,将请求转发到对应的服务上。小伙伴们,你们好呀,我是老寇。......
·
小伙伴们,你们好呀,我是老寇
目录
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
大功告成
更多推荐




所有评论(0)