当前位置: 首页 > 知识库问答 >
问题:

春云:API网关路由不工作

昝涛
2023-03-14

我正在使用Spring Cloud。我的Spring boot应用程序College-service学生服务eureka-serverapi网关中有四个服务。我尝试使用API Gateway调用College-service学生服务。当我从API Gateway调用MyCollege-service时,它可以正常工作,但学生服务不起作用。当我尝试获取学生服务时,我收到未找到错误404。我是Spring Cloud的新人。这是我的代码。

下面是我的网址,最后一个网址是404

实体

public class College {
    private String clgId;
    private String clgName;
    private String clgCity;

    List<Student> students;

    public College(String clgId, String clgName, String clgCity, List<Student> students) {
        this.clgId = clgId;
        this.clgName = clgName;
        this.clgCity = clgCity;
        this.students = students;
    }

    public College(String clgId, String clgName, String clgCity) {
        this.clgId = clgId;
        this.clgName = clgName;
        this.clgCity = clgCity;
    }
   
    // getter and setter
}

public class Student {
    private Long stId;
    private String stName;
    private String stEmail;
    private String clgId;

    public Student(Long stId, String stName, String stEmail, String clgId) {
        super();
        this.stId = stId;
        this.stName = stName;
        this.stEmail = stEmail;
        this.clgId = clgId;
    }

    // getter and setter
}

学院控制员

@RestController
@RequestMapping("/college")
public class CollegeController {
    @Autowired
    private CollegeService collegeService;

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping(value = "/{clgId}", method = RequestMethod.GET)
    public ResponseEntity<College> getColleges(@PathVariable("clgId") String clgId) {
        College college = collegeService.getCollege(clgId);
        List student = restTemplate.getForObject("http://student-service/college/student/" + college.getClgId(),
                List.class);
        college.setStudents(student);
        return ResponseEntity.ok(college);
    }
}

应用程序. yml

server:
  port: 9001
  
spring:
  application:
    name: college-service
    
eureka:
  instance:
    hostname: localhost

学生管理员实体

public class Student {
    private Long stId;
    private String stName;
    private String stEmail;
    private String clgId;

    public Student(Long stId, String stName, String stEmail, String clgId) {
        super();
        this.stId = stId;
        this.stName = stName;
        this.stEmail = stEmail;
        this.clgId = clgId;
    }

    // getter and setter
}
@RestController
@RequestMapping("/college")
public class StudentCotroller {

    @Autowired
    private StudentService studentService;

    @RequestMapping(value = "/student/{clgId}", method = RequestMethod.GET)
    public ResponseEntity<List<Student>> getStudents(@PathVariable("clgId") String clgId) {
        return ResponseEntity.ok(studentService.getStudents(clgId));
    }

}

应用程序. yml

server:
  port: 9002
  
spring:
  application:
    name: student-service
    
eureka:
  instance:
    hostname: localhost

应用程序. yml

server:
  port: 8761

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
  server:
    waitTimeInMsWhenSyncEmpty: 0

应用程序. yml

server:
  port: 9003
  
eureka:
  instance:
    hostname: localhost

spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      routes:
      - id: college-service
        uri: lb://college-service
        predicates:
        - Path=/college/**
      - id: student-service
        uri: lb://student-service
        predicates:
        - Path=/student/**

共有1个答案

葛承嗣
2023-03-14

学生服务的谓词是匹配以学生开头的所有请求(Path=/学生/**)。但是,您致电学生服务,并要求从大学(/学院/学生/ CLG01)开始。此请求将我与大学服务相匹配,因为您将此服务的谓词设置为Path=/大学/**/学院/** 路径匹配 /大学/学生/CLG01 路径。

可能的解决方案

  1. 将您的StudentController请求映射从/college
  2. 对学生服务使用不同的谓词,例如Host
  3. 设置特定路径谓词并更改路由的顺序:
     routes:
      - id: student-service
        uri: lb://student-service
        predicates:
        - Path=/college/student/**
      - id: college-service
        uri: lb://college-service
        predicates:
        - Path=/college/**

 类似资料:
  • 我不知道spring-cloud-gateway是否支持从领事注册中心读取路由,就像Zuul一样。 另外,我用--debug启动了这一行:

  • 我使用以下技术设计了一个微服务原型 尤里卡服务器(Discovery Server) Spring boot(后端服务) Spring Cloud API网关 上述服务正在启动,和在服务器中注册 当我向gate way发送请求时,它显示以下错误 如何解决上述问题。

  • 我正在使用Spring Cloud(hoxton.sr10)和Spring Boot(2.2.6.release) 我在尤里卡服务器8761注册了我的服务 gateway mainClass java

  • 我试图将使用工作的网关迁移到Spring Cloud网关,但遇到了请求路由问题。 下面是Spring Cloud Gateway配置的一个片段,我试图在其中配置一个等效的路由: 我使用Spring Cloud Eureka作为我的Discovery服务器(在一个单独的微服务中),并且我目前没有任何配置,如配置DiscoveryClient路由的谓词和过滤器中所述 如果我向发出请求,我将收到一个40

  • 我想通过在eureka(应用程序名称)注册的服务ID在我的Spring云网关(无zuul)启用默认路由,但我总是得到404错误。 在我的聊天服务的引导程序中。yml我已经定义了应用程序名 在应用程序属性中: 当我进入eureka的仪表板时,我可以看到我的聊天服务和网关。 Eureka在网关应用程序中的配置与聊天服务相同,但我也有以下配置: 接下来,我还尝试添加显式路由,但这并不起作用,但如果我有发

  • 我有一个Spring云网关、一个eureka服务注册中心和两个微服务器。我使用http://localhost:8081/auth直接向sevice发送请求没有问题。当我想使用网关http://localhost:8080/auth时,我总是得到404错误响应。服务和网关都连接到eureka服务器。下面是我的代码: 网关 Application.Properties: 主要: 主要: 我已经遍历了