- 安装Apollo步骤跳过,此处不再赘述,可自行查找安装步骤;
- 实现原理比较简单,像Apollo和nacos这样的配置中心,都可以以JSON形式保存,我们可以使用key作为路由监听key,value作为路由的一个配置信息
- 这个配置缺点就是界面的可视化比较差,因为都是配置文件,还有就是,在微服务集群机器比较多的情况下,管理起来比较繁琐,可以考虑通过界面化的形式进行改造
- 优点就是对开发人员比较快捷,使用比较简单,下面是具体的实现步骤
- 首先在Apollo创建一个项目

- 然后在项目POM中引入Apollo的maven坐标
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>1.6.0</version>
</dependency>
app:
#Appid
id: XXX
apollo:
#Apollo实例地址
meta: http://127.0.0.1:8080
bootstrap:
enabled: true
- 然后就是动态路由的实现,先在Apollo中在application的namespace下新建一个配置,内容如下,设定key为serverRouter,value如下

[
{
"id": "cloud-auth",
"predicates": [
{
"name": "Path",
"args": {
"pattern": "/api/cloud-auth/**"
}
}
],
"filters": [
{
"name": "RedisRateLimiter",
"args": {
"key-resolver": "#{@hostAddrKeyResolver}",
"redis-rate-limiter.burstCapacity": "100",
"redis-rate-limiter.replenishRate": "200"
}
}
],
"metadata": {},
"uri": "lb://cloud-auth",
"order": 0
},
{
"id": "cloud-auth2",
"predicates": [
{
"name": "Path",
"args": {
"pattern": "/api/cloud-auth2/**"
}
}
],
"filters": [
{
"name": "RedisRateLimiter",
"args": {
"key-resolver": "#{@hostAddrKeyResolver}",
"redis-rate-limiter.burstCapacity": "100",
"redis-rate-limiter.replenishRate": "200"
}
}
],
"metadata": {},
"uri": "lb://cloud-auth2",
"order": 0
}
]
- 代码新增路由刷新实现类,基于SpringCloudGateway的RouteDefinitionRepository类进行实现
@Slf4j
@Component
@Configuration
public class ApolloRoteDefinitionRepository implements RouteDefinitionRepository, ApplicationEventPublisherAware {
@ApolloConfig
private Config config;
private ApplicationEventPublisher publisher;
private final RefreshScope refreshScope;
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher publisher) {
this.publisher=publisher;
}
public ApolloRoteDefinitionRepository(RefreshScope refreshScope) {
this.refreshScope=refreshScope;
}
/**
* 路由配置Key
*/
private static final String SERVER_ROUTER = "serverRouter";
/**
* 应用namespace
*/
private static final String APP_SERVER = "application";
/**
* 监听namespace(application)
*
* @param configChangeEvent ConfigChangeEvent
*/
@ApolloConfigChangeListener(APP_SERVER)
private void onchange(ConfigChangeEvent configChangeEvent) {
if (configChangeEvent.isChanged(SERVER_ROUTER)){
log.info("<-----------------------------[网关-监听到路由配置变化,开始刷新路由信息]----------------------------->");
this.publisher.publishEvent(new RefreshRoutesEvent(this));
log.info("<-----------------------------[网关-监听到路由配置变化,路由信息刷新完毕]----------------------------->");
}
}
@Override
public Flux<RouteDefinition> getRouteDefinitions() {
String property=config.getProperty(SERVER_ROUTER,null);
if (StringUtils.isEmpty(property)) {
log.error("网关路由配置为空,请检查Apollo配置信息,Key:[{}],是否为空",SERVER_ROUTER);
throw new RuntimeException("网关路由配置为空,请检查Apollo配置信息,Key:serverRouterList,是否为空");
}
log.info("<-----------------------------[网关-动态路由刷新执行]----------------------------->");
List<RouteDefinition> routeDefinitionList=JSON.parseArray(property,RouteDefinition.class);
return Flux.fromIterable(routeDefinitionList);
}
@Override
public Mono<Void> save(Mono<RouteDefinition> route) {
return null;
}
@Override
public Mono<Void> delete(Mono<String> routeId) {
return null;
}
- 启动网关,修改Apollo点击发布即可看到@ApolloConfigChangeListener监听到了namespace为application的修改变更,通过isChanged判断变化的key,最后对数据重加载,调用SpringCloudGateWay的RefreshRoutesEvent实现路由的刷新
- 有问题可留言,看到就会回复