基于Apollo对SpingCloudGateWay实现动态路由

我的个人网站:等不见天亮等时光
  • 基于Redis缓存的可查看:基于Redis对SpringCloudGateWay实现动态化路由
  • 安装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实现路由的刷新
  • 有问题可留言,看到就会回复
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值