Getaway网关访问微服务:503,Service Unavailable。请求路径:localhost:1000/user/test,请求响应结果如下

{
    "timestamp": "2022-10-10T06:45:35.592+00:00",
    "path": "/user/list",
    "status": 503,
    "error": "Service Unavailable",
    "message": "",
    "requestId": "4f1bf742-1"
}

导入的依赖为:

<!--getaway网关依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

<!--Nacos注册发现-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

yml配置:

server:
  port: 1000
spring:
  application:
    name: service-gateway #服务名
  cloud: #注册到Nacos
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
    gateway:
      discovery:
        locator:
          enabled: false #开放服务名访问方式
          lower-case-service-id: true #服务名小写
      routes: #路由配置
        - id : service-user #指定服务名
          uri: lb://service-user #以负载均衡的方式去注册中心找这个服务名
          predicates:    #断言,匹配访问的路径
            - Path=/user/**	#服务访问路径  
            # 断言方式有很多,此处使用常见的URL路径断言,如访问http:localhost:1000/user/list命中

控制器接口:

package cn.cooper.song.controller;


import cn.cooper.song.entity.User;
import cn.cooper.song.entity.req.ReqQueryUser;
import cn.cooper.song.service.IUserService;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * <p>
 * 会员登录账号 前端控制器
 * </p>
 *
 * @author cooper
 * @since 2022-10-07
 */
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private IUserService userService;

    @GetMapping("/list")
    public List<User> list(){
        return userService.list();
    }

    @PostMapping("/byId")
    public User byId(@RequestBody User user){
        return userService.getById(user.getId());
    }

    @PostMapping("/test")
    public List<User> query(@RequestBody ReqQueryUser req){
        LambdaQueryChainWrapper<User> wrapper = userService.lambdaQuery()
                .eq(req.getPhone() != null, User::getPhone, req.getPhone())
                .like(req.getNickName() != null && !req.getNickName().isEmpty(), User::getNickName, req.getNickName())
                .gt(req.getBit() != null, User::getBitState, req.getBit());
        return wrapper.list();
    }

    /**
     * 流控测试
     * @return 测试限流
     */
    @GetMapping(value = "/hello")
    @SentinelResource(value = "hello",blockHandler = "withBlockHandler")
    public String hello() {
        return "Hello Sentinel";
    }

    public String withBlockHandler(BlockException ex){
        ex.printStackTrace();
        log.info("限流:异常{}",ex.getMessage());
        return "手速太快了,过会儿再试试吧!";
    }

    public String withFallback(){
        return "别动  断啦!";
    }
}

服务的yml配置:

server:
  port: 1010
spring:
  application:
    name: service-user
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
 # 数据库及其他相关配置已省略....

我的排错步骤:

1、根据getaway网关原理,当我们通过网关发起请求的时候,网关根据断言匹配请求路径对应的服务,然后如注册中心找到该服务,并转发请求。所以第一之间检查了配置文件,用户服务、网关配置、断言,服务名一致,请求路径也没有问题,单独访问服务是可以访问的。貌似没有什么问题!

2、登录nacos注册中心,检查服务是否已经注册上了。查看候我的服务是全部注册上去的(图省略)

3、上网查资料,有部分说是缺少两个依赖,分别是Feign和负载均衡的依赖,如下(版本我已省略,在父模块已配置spring cloud版本):

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>

<!--openFeign依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

导入之后就有新的问题,由于feign依赖导入候就需要配置+注解,尝试候并没有效果,但是getaway的配置中URI还有一种配置写法,那就是直接将服务IP地址写上,如下:

server:
  port: 1000
spring:
  application:
    name: service-gateway #服务名
  cloud: #注册到Nacos
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
    gateway:
      discovery:
        locator:
          enabled: false #开放服务名访问方式
          lower-case-service-id: true #服务名小写
      routes: #路由配置
        - id : service-user #指定服务名
          uri: http://127.0.0.1:1010 #以负载均衡的方式去注册中心找这个服务名
          predicates:    #断言,匹配访问的路径
            - Path=/user/**	#服务访问路径  
            # 断言方式有很多,此处使用常见的URL路径断言,如访问http:localhost:1000/user/list命中

结果是可以访问的,如下:

[
    {
        "id": 1,
        "createTime": 1493695662249,
        "updateTime": 1493695662249,
        "thirdUid": null,
        "phone": "13330964748",
        "email": "111@qq.com",
        "nickName": "yhptest",
        "bitState": 11,
        "secLevel": 0,
        "loginId": 3
    },
    // 结果已省略.........
 ]

于是就想,为什么不能使用负载均衡的方式找到指定的服务?查阅资料,最终导入一个负载均衡的依赖解决问题。

PS:不知道为什么,getaway依赖中其实是原本就包含负载均衡依赖包的,如下:

<dependencies>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter</artifactId>
      <version>2.2.5.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-gateway-core</artifactId>
      <version>2.2.5.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-webflux</artifactId>
      <version>2.3.2.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <!--此处为负载均衡依赖-->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-loadbalancer</artifactId> 
      <version>2.2.5.RELEASE</version>
      <scope>compile</scope>
      <optional>true</optional>
    </dependency>
  </dependencies>

也许是刷包问题,或者其他原因这个目前暂不得知,不过在找到这个解决方案之前,我已尝试过多次刷包、重新编译、重启等等常规操作,但最终都以失败告终。
最终完整的getaway依赖如下:

<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

        <!--Nacos注册发现-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-loadbalancer</artifactId>
        </dependency>
    </dependencies>

希望这篇文章能帮助正好遇到此问题的你

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐