原创

spring-cloud-gateway网关服务遇到503

背景:使用spring-cloud搭建微服务网关时,使用nacos注册中心和配置中心,gateway动态加载路由配置,但是发现微服务在nacos注册成功,且路由配置中名称无误的前提下,出现使用网关访问时,报503错误。

配置如下

#网关微服务配置spring:
  cloud:
    nacos:
      discovery:
        server-addr: nacos注册中心ip:8848  # Nacos服务器地址
        username: nacos
        password: nacos
        namespace: dev
        group: DEFAULT_GROUP
        ip: 192.168.1.2 #你的服务ip 测试可填写局域网1段ip
    gateway:
      discovery:
        locator:
          enabled: true  # 启用服务发现方式的路由
    config:
      namespace: dev
      group: DEFAULT_GROUP
      server-addr: nacos配置中心ip:8848  # Nacos配置中心地址
      file-extension: YAML  # 配置文件的格式
      name: gateway-routes  # 配置文件的名称,注意要与 Nacos 中的文件名一致<br/>
#动态配置 配置中心路由规则文件spring:
  cloud:
    gateway:
      routes:
        - id: op-web-route
          uri: lb://op-web
          predicates:
            - Path=/op-web/**
          filters:
            - StripPrefix=1
  loadbalancer:
    ribbon:
      eager-load:
        enabled: true
    retry:
      enabled: true

其中op-web已经成功注册到nacos且名字对应正确,但是通过网关加服务的形式一直报503,通过服务本身地址能访问到,此时不禁想骂人。

然后,经过百度和ai的搜寻,找到了答案。

原因和解决:

Spring Cloud Gateway 中,当你使用 lb:// 作为 uri 时,必须有一个负载均衡组件来解析它。

  • lb://op-web 说明 Gateway 需要通过负载均衡找到 op-web 服务
  • Spring Cloud Gateway 默认不会自动引入负载均衡器,导致 lb:// 解析失败。
  • 没有负载均衡组件 时,Gateway 无法解析 lb://,会返回 503 Service Unavailable
  • 添加 spring-cloud-loadbalancer 后(不再报 503)
  • <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-loadbalancer</artifactId>
    </dependency>
    
  • 这个依赖的作用是:

    1. 替代 Ribbon(Spring Cloud Netflix 组件已过时)
      • 以前负载均衡用 spring-cloud-starter-netflix-ribbon,但 Ribbon 已被官方废弃,Spring Cloud 推荐 spring-cloud-loadbalancer
    2. 解析 lb://op-web
      • spring-cloud-loadbalancer 负责把 lb://op-web 解析成 Nacos 里的 op-web 服务实例,然后进行负载均衡。
    3. 网关能找到可用服务
      • 之前 503 是因为 网关找不到 op-web,加上 spring-cloud-loadbalancer 后,它能正确解析并调用 op-web
    正文到此结束