网关中有两个重要的概念,那就是路由配置和路由规则,路由配置是指配置某请求路径路由到指定的目的地址。而路由规则是指匹配到路由配置之后,再根据路由规则进行转发处理。 Spring Cloud Gateway作为所有请求流量的入口,在实际生产环境中为了保证高可靠和高可用,尽量避免重启,需要实现Spring Cloud Gateway动态路由配置。
- 路由模块(base-gateway)启动时加载路由配置并开启监听实现动态
@Slf4j
@Configuration
@AllArgsConstructor
public class DynamicRouteInit {
private RouteDefinitionWriter routeDefinitionWriter;
private static final String DATA_ID = "dynamic_routes";
@PostConstruct
public void initRoute() {
try {
ConfigService configService = NacosFactory.createConfigService(ServiceNameConstants.NACOS_SERVICE);
String content = configService.getConfig(DATA_ID, "DEFAULT_GROUP", 5000);
log.info("初始化网关路由开始");
updateRoute(content);
log.info("初始化网关路由完成");
//开户监听,实现动态
configService.addListener(DATA_ID, "DEFAULT_GROUP", new Listener() {
@Override
public void receiveConfigInfo(String configInfo) {
log.info("更新网关路由开始");
updateRoute(configInfo);
log.info("更新网关路由完成");
}
@Override
public Executor getExecutor() {
return null;
}
});
} catch (NacosException e) {
log.error("加载路由出错:{}", e.getErrMsg());
}
}
public void updateRoute(String content){
Yaml yaml = new Yaml();
GatewayRouteList gatewayRouteList = yaml.loadAs(content,GatewayRouteList.class);
gatewayRouteList.getRoutes().forEach(route -> {
log.info("加载路由:{},{}", route.getId(), route);
routeDefinitionWriter.save(Mono.just(route)).subscribe();
});
}
}
2.nacos中配置路由信息(dynamic_routes)