微服务如何通过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
}

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");
}
} 



扫一扫访问 Blade技术社区 移动端