Spring Cloud Gateway Nacos 实现动态路由
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.gateway.event.RefreshRoutesEvent;
import org.springframework.cloud.gateway.route.RouteDefinition;
import org.springframework.cloud.gateway.route.RouteDefinitionWriter;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Component;
import com.alibaba.fastjson.JSON;
import com.alibaba.nacos.api.config.annotation.NacosValue;
import com.alibaba.nacos.api.config.annotation.NacosConfigListener;
import java.util.List;
import java.util.stream.Collectors;
@Component
public class NacosRouteDefinitionRepository {
@NacosValue(value = "${spring.cloud.gateway.nacos.routes:[]}", groupId = "${spring.cloud.nacos.groupId:DEFAULT_GROUP}", type = JSON.class)
private List<RouteDefinition> routes;
private final RouteDefinitionWriter routeDefinitionWriter;
private final ApplicationEventPublisher publisher;
public NacosRouteDefinitionRepository(RouteDefinitionWriter routeDefinitionWriter, ApplicationEventPublisher publisher) {
this.routeDefinitionWriter = routeDefinitionWriter;
this.publisher = publisher;
}
@PostConstruct
public void init() {
// 初始化时注册Nacos配置监听器
registerNacosListener();
}
private void registerNacosListener() {
// 注册Nacos配置监听器,动态更新路由规则
NacosConfigListener nacosConfigListener = new NacosConfigListener() {
@Override
public void receiveConfigInfo(String configInfo) {
// 接收到配置变化后,更新路由定义
List<RouteDefinition> routeDefinitions = JSON.parseArray(configInfo, RouteDefinition.class);
this.refreshRoute(routeDefinitions);
}
@Override
public Executor getExecutor() {
return null; // 使用默认线程池
}
};
// 注册监听器
// NacosConfigService nacosConfigService = ...;
// nacosConfigService.addListener(...);
}
private void refreshRoute(List<RouteDefinition> routeDefinitions) {
this.routes = routeDefinitions;
this.routeDefinitionWriter.deleteAll();
for (RouteDefinition routeDefinition : this.routes) {
this.routeDefinitionWriter.save(Mono.just(routeDefinition)).subscribe();
}
this.publisher.publishEvent(new RefreshRoutesEvent(this))
评论已关闭