关于spring cloud gateway中可能会出现503 Source Unavailable的问题

本文围绕Spring Cloud Gateway可能出现的503 Source Unavailable问题展开。项目引用Spring Cloud Gateway和Nacos配置中心,在路由第三方服务时报错503。经排查,问题出在路由上,原因是Nacos服务名与本地项目名不一致。解决办法是在Gateway的yml中写Nacos自定义服务名并更新Nacos。

关于spring cloud gateway中可能会出现503 Source Unavailable的问题

项目premise:
1.引用spring cloud gateway+nacos配置中心
2.微服务+分布式(本节与分布式问题无关)项目
3.路由规则:网关端口:88;第三方端口:33000
第三方单独访问路径localhost:33000/oss/policy
希望路由到:localhost:88/api/thirdparty/oss/policy

问题

出现问题的背景是在用阿里云的oss做服务端签名后直传文件的时候,希望将oss相关服务,以及之后会用到的所有第三方服务提炼成一个独立的微服务module。
配置和project结构如下图:

gateway的yml

在这里插入图片描述
为了和服务名一样,于是直接copy了服务名(可能大多数人开发的时候也都是这么直接copy,也确实没什么问题)

问题

当通过gateway路由的时候
在这里插入图片描述
报错503,能肯定的是服务器的问题
当我通过端口,跳过网关路由直接访问后端数据的时候

在这里插入图片描述
ok,一切正常,得到了aliyun返回的oss服务端签名
postman,同样503
在这里插入图片描述
重新检查网关配置
在这里插入图片描述
第三方服务和前一个的product(商品module)配置规则都是一样的,所以,问题已经可以定位到路由的问题,即gateway并没有路由到我的thirdparty的module。

解决

查看nacos
在这里插入图片描述
显然nacos中的服务名称和本地的项目名称(见上文图片,本地项目名称为,market-thirdpartyservice)不一样,而***spring cloud gateway的路由规则是基于nacos配置中心来定位项目的,并不依靠本地工程的maven聚合***。
所以gateway的yml中配置负载均衡(lb://),一定写的是nacos中自定义的服务名称,同时记得更新一下nacos,有时也会因为nacos没有及时更新导致服务没有注册到nacos中,路由也会出现问题。

**Spring Cloud Netflix 2.2.3** 是 Spring Cloud Netflix 项目的一个维护版本,属于 **Spring Cloud Hoxton.SR6** 发布系列的一部分,发布于 **2020 年中**,兼容 **Spring Boot 2.2.x ~ 2.3.x**。它是 Spring Cloud 对 Netflix OSS(Open Source Software)组件的集成封装,旨在为微服务架构提供一套完整的治理能力,包括服务发现、负载均衡、熔断、网关和配置管理等。 --- ### 核心组件与功能 #### ✅ 1. **Eureka Server & Client** —— 服务注册与发现 - 提供去中心化的服务注册中心。 - 服务启动时自动注册,消费者通过 Eureka 获取可用实例列表。 ```java // 启用 Eureka Server @SpringBootApplication @EnableEurekaServer public class EurekaApp { public static void main(String[] args) { SpringApplication.run(EurekaApp.class, args); } } ``` ```yaml # application.yml (Eureka Client) eureka: client: service-url: defaultZone: http://localhost:8761/eureka/ instance: hostname: order-service ``` > 默认开启自我保护模式,防止网络分区导致大量服务被误删。 --- #### ✅ 2. **Ribbon** —— 客户端负载均衡 - 在调用远程服务时自动选择一个健康实例。 - 与 `RestTemplate` 和 `Feign` 无缝集成。 ```java @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } // 使用方式(无需写死 IP) String result = restTemplate.getForObject("http://payment-service/pay", String.class); ``` > Ribbon 支持自定义规则(如轮询、随机、权重等)。 --- #### ✅ 3. **Hystrix** —— 熔断器(Circuit Breaker) - 防止雪崩效应:当某个服务故障时快速失败并降级处理。 - 提供请求缓存、请求合并、线程隔离等功能。 ```java @HystrixCommand(fallbackMethod = "fallbackPayment") public String callPayment() { return restTemplate.getForObject("http://payment-service/pay", String.class); } public String fallbackPayment() { return "Payment service is down. Using cached response."; } ``` ⚠️ 注意:Hystrix 已进入维护模式,官方推荐使用 **Resilience4j** 替代。 --- #### ✅ 4. **Feign** —— 声明式 HTTP 客户端 - 将 HTTP 请求抽象为接口,简化远程调用。 ```java @FeignClient(name = "payment-service", fallback = PaymentFallback.class) public interface PaymentClient { @GetMapping("/pay") String pay(); } @Component public class PaymentFallback implements PaymentClient { @Override public String pay() { return "Service unavailable"; } } ``` 结合 Hystrix 实现服务降级。 --- #### ✅ 5. **Zuul** —— API 网关(边缘服务) - 统一入口,负责路由、过滤、限流、认证等。 ```java @SpringBootApplication @EnableZuulProxy public class GatewayApplication { ... } ``` ```yaml zuul: routes: order: path: /api/orders/** serviceId: order-service payment: path: /api/payment/** serviceId: payment-service ``` 支持自定义过滤器: ```java @Component public class AuthFilter extends ZuulFilter { @Override public Object run() { RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest req = ctx.getRequest(); if (!req.getHeader("Authorization").startsWith("Bearer ")) { ctx.setSendZuulResponse(false); ctx.setResponseStatusCode(401); } return null; } } ``` > ⚠️ Zuul 1 是阻塞式架构,性能有限;Zuul 2 支持异步但未广泛采用。 --- #### ✅ 6. **Archaius** —— 外部化配置管理 - 动态读取配置属性,支持多种源(系统属性、文件、数据库、远程 REST)。 - 被 Eureka 内部使用,也可独立使用。 ```java DynamicStringProperty myProp = DynamicPropertyFactory .getInstance() .getStringProperty("my.config.value", "default"); // 监听变更 myProp.addCallback(() -> System.out.println("Config changed!")); ``` --- ### 快速整合示例(完整微服务体系) #### Maven 依赖(父工程引入 BOM) ```xml <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.SR6</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <!-- 子模块按需引入 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> ``` #### 启动类启用关键注解 ```java @SpringBootApplication @EnableDiscoveryClient @EnableFeignClients @EnableCircuitBreaker public class OrderServiceApplication { ... } ``` --- ### 典型应用场景 | 场景 | 使用组件 | |------|----------| | 微服务注册与发现 | Eureka | | 服务间调用 | Feign + Ribbon | | 故障隔离与降级 | Hystrix | | 统一网关入口 | Zuul | | 动态配置更新 | Archaius + Config Server(外部配合) | --- ### 性能与监控建议 | 工具 | 集成方式 | |------|----------| | **Turbine** | 聚合多个 Hystrix Stream,用于集中监控熔断状态 | | **Hystrix Dashboard** | 可视化查看服务调用延迟、错误率等指标 | | **Sleuth + Zipkin** | 分布式链路追踪,定位性能瓶颈 | ```yaml # 开启 Hystrix 指标流 management: endpoints: web: exposure: include: hystrix-stream,turbine-stream ``` 访问 `http://service/hystrix.stream` 查看实时数据。 --- ### 已知限制与弃用警告 | 组件 | 状态 | 推荐替代方案 | |------|------|----------------| | **Ribbon** | 维护中 | Spring Cloud LoadBalancer | | **Hystrix** | 维护中 | Resilience4j | | **Zuul** | 维护中 | Spring Cloud Gateway | | **Archaius** | 不再推荐 | Spring Boot Actuator + Config | > ⚠️ 自 **Spring Cloud 2020** 起,**Spring Cloud Netflix 项目整体进入维护模式**,不再新增功能。新项目应优先考虑使用更现代的技术栈。 --- ### 最佳实践建议 | 建议 | 说明 | |------|------| | 使用 OpenFeign + Hystrix 实现声明式调用与降级 | 编码简洁,易于维护 | | 合理设置 Eureka 自我保护与心跳间隔 | 避免误判服务下线 | | 关闭不必要的 Hystrix 超时(或调整超时时间) | 防止短时间高并发触发误熔断 | | 使用 API Gateway 统一鉴权和限流 | 减少重复代码 | | 结合 Sleuth 追踪全链路 | 提升可观测性 | ---
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值