微服务如何通过springgateway调用python服务

Blade 未结 2 278
879569726
879569726 2025-09-26 14:53

微服务如何通过springgateway调用python服务,现在通过服务名调用一直出现

{

    "msg": "Failed to handle request [GET http://10.24.0.163:8081/zjl-knowledge-service/api/v1/health]: 503 SERVICE_UNAVAILABLE \"Unable to find instance for zjl-knowledge-service\"",

    "code": 503,

    "data": null

}

image.png

2条回答
  •  admin
    admin (楼主)
    2025-09-26 15:09

    python本身有这个API可以访问到么?  /api/v1/health 

    注册到nacos是需要对提供health接口给nacos心跳检测的,如果获取不到就会出现服务不可用的情况


    你脱离Gateway,直接访问这个API地址看看返回的是什么,看看是否符合nacos的检测要求。



    本地简单测了下,可以调用成功,你加个这个配置类试试

    package org.springblade.gateway.config;
    
    import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
    import com.alibaba.nacos.api.naming.NamingService;
    import com.alibaba.nacos.api.naming.pojo.Instance;
    import lombok.RequiredArgsConstructor;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.cloud.gateway.route.RouteLocator;
    import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import java.net.URI;
    import java.util.List;
    
    /**
     * Python服务动态路由配置
     *
     * @author BladeX
     */
    @Slf4j
    @Configuration
    @RequiredArgsConstructor
    public class DirectRouteConfig {
    
        private final NacosDiscoveryProperties nacosProperties;
    
        private static final String SERVICE_NAME = "bladex-python-demo";
        private static final String SERVICE_PATH = "/bladex-python-demo/**";
        private static final String ROUTE_ID = "bladex-python-demo-direct";
    
        @Bean
        public RouteLocator pythonServiceRoute(RouteLocatorBuilder builder) {
           return builder.routes()
              .route(ROUTE_ID, r -> r
                 .path(SERVICE_PATH)
                 .filters(f -> f
                    .stripPrefix(1)
                    .addRequestHeader("X-Service-Type", "Python")
                 )
                 .uri(getServiceUri()))
              .build();
        }
    
        /**
         * 动态获取服务URI
         * 从Nacos实时获取服务地址,支持服务地址变更
         */
        private URI getServiceUri() {
           try {
              NamingService namingService = nacosProperties.namingServiceInstance();
              String group = nacosProperties.getGroup() != null ?
                 nacosProperties.getGroup() : "DEFAULT_GROUP";
    
              List instances = namingService.selectInstances(SERVICE_NAME, group, true);
    
              if (!instances.isEmpty()) {
                 Instance instance = instances.get(0);
                 String uri = String.format("http://%s:%d", instance.getIp(), instance.getPort());
                 log.info("Dynamic route to {} service: {}", SERVICE_NAME, uri);
                 return URI.create(uri);
              }
           } catch (Exception e) {
              log.error("Failed to get service instance from Nacos, using fallback", e);
           }
    
           // 仅作为最后的备用方案
           log.warn("Using fallback URI for {} service", SERVICE_NAME);
           return URI.create("http://127.0.0.1:8090");
        }
    }


    CleanShot20250926163100@2x.png

    CleanShot20250926163015@2x.png

    CleanShot20250926163043@2x.png

    CleanShot20250926163233@2x.png

提交回复