jeecgboot启动gateway找不到路由的问题(跨域访问的问题)

将nacos改为本地,并且将gateway获取路由的方式改为从nacos获取,结果无法获取。

开始排查问题,首先看打印日志,发现已经连接本地nacos但是没有找到路由。

2021-10-05 21:51:58.483 [main] INFO  org.jeecg.loader.DynamicRouteLoader:70 - 初始化路由,dataType:nacos
2021-10-05 21:52:00.477 [main] INFO  o.s.c.gateway.route.RouteDefinitionRouteLocator:139 - Loaded RoutePredicateFactory [After]
2021-10-05 21:52:00.477 [main] INFO  o.s.c.gateway.route.RouteDefinitionRouteLocator:139 - Loaded RoutePredicateFactory [Before]
2021-10-05 21:52:00.478 [main] INFO  o.s.c.gateway.route.RouteDefinitionRouteLocator:139 - Loaded RoutePredicateFactory [Between]
2021-10-05 21:52:00.478 [main] INFO  o.s.c.gateway.route.RouteDefinitionRouteLocator:139 - Loaded RoutePredicateFactory [Cookie]
2021-10-05 21:52:00.478 [main] INFO  o.s.c.gateway.route.RouteDefinitionRouteLocator:139 - Loaded RoutePredicateFactory [Header]
2021-10-05 21:52:00.478 [main] INFO  o.s.c.gateway.route.RouteDefinitionRouteLocator:139 - Loaded RoutePredicateFactory [Host]
2021-10-05 21:52:00.478 [main] INFO  o.s.c.gateway.route.RouteDefinitionRouteLocator:139 - Loaded RoutePredicateFactory [Method]
2021-10-05 21:52:00.479 [main] INFO  o.s.c.gateway.route.RouteDefinitionRouteLocator:139 - Loaded RoutePredicateFactory [Path]
2021-10-05 21:52:00.479 [main] INFO  o.s.c.gateway.route.RouteDefinitionRouteLocator:139 - Loaded RoutePredicateFactory [Query]
2021-10-05 21:52:00.479 [main] INFO  o.s.c.gateway.route.RouteDefinitionRouteLocator:139 - Loaded RoutePredicateFactory [ReadBodyPredicateFactory]
2021-10-05 21:52:00.479 [main] INFO  o.s.c.gateway.route.RouteDefinitionRouteLocator:139 - Loaded RoutePredicateFactory [RemoteAddr]
2021-10-05 21:52:00.479 [main] INFO  o.s.c.gateway.route.RouteDefinitionRouteLocator:139 - Loaded RoutePredicateFactory [Weight]
2021-10-05 21:52:00.479 [main] INFO  o.s.c.gateway.route.RouteDefinitionRouteLocator:139 - Loaded RoutePredicateFactory [CloudFoundryRouteService]
2021-10-05 21:52:00.540 [boundedElastic-1] INFO  com.alibaba.nacos.client.naming:64 - initializer namespace from System Property :null
2021-10-05 21:52:00.540 [boundedElastic-1] INFO  com.alibaba.nacos.client.naming:73 - initializer namespace from System Environment :null
2021-10-05 21:52:00.541 [boundedElastic-1] INFO  com.alibaba.nacos.client.naming:83 - initializer namespace from System Property :null
2021-10-05 21:52:00.541 [main] INFO  com.alibaba.nacos.client.config.impl.ClientWorker:262 - [fixed-192.168.0.2_8848] [subscribe] jeecg-gateway-router.json+DEFAULT_GROUP
2021-10-05 21:52:00.542 [main] INFO  com.alibaba.nacos.client.config.impl.CacheData:93 - [fixed-192.168.0.2_8848] [add-listener] ok, tenant=, dataId=jeecg-gateway-router.json, group=DEFAULT_GROUP, cnt=1
2021-10-05 21:52:00.621 [boundedElastic-3] INFO  com.alibaba.nacos.client.naming:191 - new ips(1) service: DEFAULT_GROUP@@jeecg-gateway -> [{"instanceId":"192.168.0.2#9999#DEFAULT#DEFAULT_GROUP@@jeecg-gateway","ip":"192.168.0.2","port":9999,"weight":1.0,"healthy":true,"enabled":true,"ephemeral":true,"clusterName":"DEFAULT","serviceName":"DEFAULT_GROUP@@jeecg-gateway","metadata":{"preserved.register.source":"SPRING_CLOUD"},"instanceHeartBeatTimeOut":15000,"instanceHeartBeatInterval":5000,"ipDeleteTimeout":30000}]
2021-10-05 21:52:00.621 [boundedElastic-4] INFO  com.alibaba.nacos.client.naming:191 - new ips(1) service: DEFAULT_GROUP@@jeecg-system -> [{"instanceId":"192.168.0.2#7001#DEFAULT#DEFAULT_GROUP@@jeecg-system","ip":"192.168.0.2","port":7001,"weight":1.0,"healthy":true,"enabled":true,"ephemeral":true,"clusterName":"DEFAULT","serviceName":"DEFAULT_GROUP@@jeecg-system","metadata":{"preserved.register.source":"SPRING_CLOUD"},"instanceHeartBeatTimeOut":15000,"instanceHeartBeatInterval":5000,"ipDeleteTimeout":30000}]
2021-10-05 21:52:00.621 [boundedElastic-2] INFO  com.alibaba.nacos.client.naming:191 - new ips(1) service: DEFAULT_GROUP@@jeecg-activiti -> [{"instanceId":"192.168.0.2#8099#DEFAULT#DEFAULT_GROUP@@jeecg-activiti","ip":"192.168.0.2","port":8099,"weight":1.0,"healthy":true,"enabled":true,"ephemeral":true,"clusterName":"DEFAULT","serviceName":"DEFAULT_GROUP@@jeecg-activiti","metadata":{"preserved.register.source":"SPRING_CLOUD"},"instanceHeartBeatTimeOut":15000,"instanceHeartBeatInterval":5000,"ipDeleteTimeout":30000}]
2021-10-05 21:52:00.627 [boundedElastic-2] INFO  com.alibaba.nacos.client.naming:228 - current ips:(1) service: DEFAULT_GROUP@@jeecg-activiti -> [{"instanceId":"192.168.0.2#8099#DEFAULT#DEFAULT_GROUP@@jeecg-activiti","ip":"192.168.0.2","port":8099,"weight":1.0,"healthy":true,"enabled":true,"ephemeral":true,"clusterName":"DEFAULT","serviceName":"DEFAULT_GROUP@@jeecg-activiti","metadata":{"preserved.register.source":"SPRING_CLOUD"},"instanceHeartBeatTimeOut":15000,"instanceHeartBeatInterval":5000,"ipDeleteTimeout":30000}]
2021-10-05 21:52:00.627 [boundedElastic-3] INFO  com.alibaba.nacos.client.naming:228 - current ips:(1) service: DEFAULT_GROUP@@jeecg-gateway -> [{"instanceId":"192.168.0.2#9999#DEFAULT#DEFAULT_GROUP@@jeecg-gateway","ip":"192.168.0.2","port":9999,"weight":1.0,"healthy":true,"enabled":true,"ephemeral":true,"clusterName":"DEFAULT","serviceName":"DEFAULT_GROUP@@jeecg-gateway","metadata":{"preserved.register.source":"SPRING_CLOUD"},"instanceHeartBeatTimeOut":15000,"instanceHeartBeatInterval":5000,"ipDeleteTimeout":30000}]
2021-10-05 21:52:00.627 [boundedElastic-4] INFO  com.alibaba.nacos.client.naming:228 - current ips:(1) service: DEFAULT_GROUP@@jeecg-system -> [{"instanceId":"192.168.0.2#7001#DEFAULT#DEFAULT_GROUP@@jeecg-system","ip":"192.168.0.2","port":7001,"weight":1.0,"healthy":true,"enabled":true,"ephemeral":true,"clusterName":"DEFAULT","serviceName":"DEFAULT_GROUP@@jeecg-system","metadata":{"preserved.register.source":"SPRING_CLOUD"},"instanceHeartBeatTimeOut":15000,"instanceHeartBeatInterval":5000,"ipDeleteTimeout":30000}]
2021-10-05 21:52:01.522 [main] WARN  com.netflix.config.sources.URLConfigurationSource:121 - No URLs will be polled as dynamic configuration sources.
2021-10-05 21:52:01.522 [main] INFO  com.netflix.config.sources.URLConfigurationSource:122 - To enable URLs as dynamic configuration sources, define System property archaius.configurationSource.additionalUrls or make config.properties available on classpath.
2021-10-05 21:52:01.525 [main] WARN  com.netflix.config.sources.URLConfigurationSource:121 - No URLs will be polled as dynamic configuration sources.
2021-10-05 21:52:01.526 [main] INFO  com.netflix.config.sources.URLConfigurationSource:122 - To enable URLs as dynamic configuration sources, define System property archaius.configurationSource.additionalUrls or make config.properties available on classpath.
2021-10-05 21:52:02.889 [main] INFO  c.a.c.s.gateway.scg.SentinelSCGAutoConfiguration:144 - [Sentinel SpringCloudGateway] register SentinelGatewayFilter with order: -2147483648
2021-10-05 21:52:03.110 [main] INFO  o.s.b.actuate.endpoint.web.EndpointLinksResolver:58 - Exposing 21 endpoint(s) beneath base path '/actuator'
2021-10-05 21:52:03.183 [main] INFO  c.a.c.s.gateway.scg.SentinelSCGAutoConfiguration:134 - [Sentinel SpringCloudGateway] register SentinelGatewayBlockExceptionHandler
2021-10-05 21:52:04.615 [main] INFO  o.s.boot.web.embedded.netty.NettyWebServer:109 - Netty started on port(s): 9999
2021-10-05 21:52:06.182 [main] INFO  com.alibaba.nacos.client.naming:81 - [BEAT] adding beat: BeatInfo{port=9999, ip='192.168.0.2', weight=1.0, serviceName='DEFAULT_GROUP@@jeecg-gateway', cluster='DEFAULT', metadata={preserved.register.source=SPRING_CLOUD}, scheduled=false, period=5000, stopped=false} to beat map.
2021-10-05 21:52:06.183 [main] INFO  com.alibaba.nacos.client.naming:223 - [REGISTER-SERVICE] public registering service DEFAULT_GROUP@@jeecg-gateway with instance: Instance{instanceId='null', ip='192.168.0.2', port=9999, weight=1.0, healthy=true, enabled=true, ephemeral=true, clusterName='DEFAULT', serviceName='null', metadata={preserved.register.source=SPRING_CLOUD}}
2021-10-05 21:52:06.186 [main] INFO  c.a.cloud.nacos.registry.NacosServiceRegistry:71 - nacos registry, DEFAULT_GROUP jeecg-gateway 192.168.0.2:9999 register finished
2021-10-05 21:52:06.401 [main] INFO  org.jeecg.JeecgGatewayApplication:61 - Started JeecgGatewayApplication in 12.123 seconds (JVM running for 13.387)
2021-10-05 21:52:06.402 [main] INFO  org.jeecg.loader.DynamicRouteLoader:70 - 初始化路由,dataType:nacos
2021-10-05 21:52:06.479 [main] INFO  com.alibaba.nacos.client.config.impl.ClientWorker:262 - [fixed-192.168.0.2_8848] [subscribe] jeecg-gateway-router.json+DEFAULT_GROUP
2021-10-05 21:52:06.479 [main] INFO  com.alibaba.nacos.client.config.impl.CacheData:93 - [fixed-192.168.0.2_8848] [add-listener] ok, tenant=, dataId=jeecg-gateway-router.json, group=DEFAULT_GROUP, cnt=1
2021-10-05 21:52:06.482 [main] INFO  com.alibaba.nacos.client.config.impl.ClientWorker:262 - [fixed-192.168.0.2_8848] [subscribe] jeecg.yaml+DEFAULT_GROUP
2021-10-05 21:52:06.482 [main] INFO  com.alibaba.nacos.client.config.impl.CacheData:93 - [fixed-192.168.0.2_8848] [add-listener] ok, tenant=, dataId=jeecg.yaml, group=DEFAULT_GROUP, cnt=1
2021-10-05 21:52:06.482 [main] INFO  com.alibaba.nacos.client.config.impl.ClientWorker:262 - [fixed-192.168.0.2_8848] [subscribe] jeecg+DEFAULT_GROUP
2021-10-05 21:52:06.482 [main] INFO  com.alibaba.nacos.client.config.impl.CacheData:93 - [fixed-192.168.0.2_8848] [add-listener] ok, tenant=, dataId=jeecg, group=DEFAULT_GROUP, cnt=1

日志已经打印,初始化路由,dataType:nacos,于是从这里继续排查。

找到代码中的这个日志输出位置。

@PostConstruct
    public void init() {
        String dataType = GatewayRoutersConfiguration.DATA_TYPE;
        log.info("初始化路由,dataType:"+ dataType);
        if (RouterDataType.nacos.toString().endsWith(dataType)) {
            loadRoutesByNacos();
        }
        //从数据库加载路由
        if (RouterDataType.database.toString().endsWith(dataType)) {
            loadRoutesByRedis();
        }
    }

进入loadRoutesByNacos这个方法。

/**
     * 从nacos中读取路由配置
     *
     * @return
     */
    private void loadRoutesByNacos() {
        List<RouteDefinition> routes = Lists.newArrayList();
        configService = createConfigService();
        if (configService == null) {
            log.warn("initConfigService fail");
        }
        try {
            String configInfo = configService.getConfig(GatewayRoutersConfiguration.DATA_ID, GatewayRoutersConfiguration.ROUTE_GROUP, GatewayRoutersConfiguration.DEFAULT_TIMEOUT);
            if (StringUtils.isNotBlank(configInfo)) {
                log.info("获取网关当前配置:
{}", configInfo);
                routes = JSON.parseArray(configInfo, RouteDefinition.class);
            }
        } catch (NacosException e) {
            log.error("初始化网关路由时发生错误", e);
            e.printStackTrace();
        }
        for (RouteDefinition definition : routes) {
            log.info("update route : {}", definition.toString());
            dynamicRouteService.add(definition);
        }
        this.publisher.publishEvent(new RefreshRoutesEvent(this));
        dynamicRouteByNacosListener(GatewayRoutersConfiguration.DATA_ID, GatewayRoutersConfiguration.ROUTE_GROUP);
    }

走到标红的地方,再往下走就是空了,所以问题基本定位到这一行,开始检查三个参数。

第一个DATA_ID,就发现了这行代码,通过配置获取data-id之后,他这里又进行了一次处理,拼接了“.json”,坑人!!!。

@Value("${jeecg.route.config.data-id:#{null}}")
    public void setRouteDataId(String dataId) {
        DATA_ID = dataId + ".json";
    }

敲黑板了!!!我是这样配的,以前没用过nacos,以为这个dataId是data ID+配置格式(也就是后缀),结果啪啪打脸了,想的太多了,后台找的是jeecg-gateway-router.json,咱们配的没有.json这个后缀,所以肯定找不到咯!!!

 于是使用克隆,克隆时data ID加上.json后缀就可以了,完美解决问题!!!

 以下总结了这次排查问题的步骤流程图。

原文地址:https://www.cnblogs.com/qcq0703/p/15369754.html