Spring Boot + 云 | Zuul 代理 | 404 错误

Posted

技术标签:

【中文标题】Spring Boot + 云 | Zuul 代理 | 404 错误【英文标题】:Spring Boot + Cloud | Zuul Proxy | 404 Error 【发布时间】:2015-05-23 10:41:04 【问题描述】:

我使用 Spring Cloud 和 Zuul 代理作为我的 RESTful 服务的网关。

网关应用(Spring Boot web app运行在8080端口)相关代码:-

主类:-

@SpringBootApplication
@EnableZuulProxy
public class WebfrontApplication extends WebMvcConfigurerAdapter 

    /**
     * @param args
     */
    public static void main(String[] args) 
        SpringApplication.run(WebfrontApplication.class, args);
    

Zuul 映射:-

zuul:
  routes:
    customer:
      path: /customer/**
      url: http://localhost:9000/

在上述 UI 网关应用程序启动期间,我可以在日志中看到代理的映射已注册:-

o.s.c.n.zuul.web.ZuulHandlerMapping      : Mapped URL path [/customer/**] onto handler of type [class org.springframework.cloud.netflix.zuul.web.ZuulController]

REST 服务(运行在 9000 端口的 Spring Boot Web 应用)相关代码:-

@RestController
@RequestMapping(value = "/customer")
public class CustomerController 

    @Autowired
    private CustomerService customerService;

    /**
     * Get List of All customers.
     * 
     * @return
     */
    @RequestMapping(value = "/list", method = RequestMethod.GET)
    public List<Customer> list(Principal principal) 
        return customerService.list();
    

使用休息客户端(在我的例子中是 POSTMAN)我能够成功地从上面的端点获得响应(在处理了身份验证令牌之后)。

我在 UI 应用程序中使用 AngularJS 从 REST 端点获取数据。

相关代码:-

angular.module('customerModule').factory('customerService',function($http) 

    return 
        customerList : function()
            // PROBLEM !!!!!
            // THIS CALL GIVES A 404 ERROR
            return $http.get('/customer/list');
        
    ;
);

上述调用返回 404 错误:- 这是我的 Chrome 调试器显示的内容:-

Remote Address:127.0.0.1:8080
Request URL:http://localhost:8080/customer/list
Request Method:GET
Status Code:404 Not Found

请求标头:-

Accept:application/json, text/plain, */*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8,hi;q=0.6,ms;q=0.4
Cache-Control:no-cache
Connection:keep-alive
Cookie:SESSION=2e1ac330-fe41-4ff4-8efb-81eaec12c8d1
Host:localhost:8080
Pragma:no-cache
Referer:http://localhost:8080/
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/41.0.2272.89 Safari/537.36
X-Auth-Token:2e1ac330-fe41-4ff4-8efb-81eaec12c8d1

响应标头:-

Cache-Control:no-cache, no-store, max-age=0, must-revalidate
Content-Type:application/json; charset=UTF-8
Date:Fri, 20 Mar 2015 04:00:36 GMT
Date:Fri, 20 Mar 2015 04:00:36 GMT
Expires:0
Pragma:no-cache
Pragma:no-cache
Server:Jetty(9.2.9.v20150224)
Transfer-Encoding:chunked
X-Application-Context:bootstrap
X-Content-Type-Options:nosniff
X-Content-Type-Options:nosniff
X-Frame-Options:DENY
X-Frame-Options:DENY
X-XSS-Protection:1; mode=block
X-XSS-Protection:1; mode=block

这里有什么问题?映射不正确还是我遗漏了什么?

已解决

根据接受的答案,更改 Zuul 映射在更改为时有效:-

zuul:
 routes:
  resource:
   path: /customer/**
   url: http://localhost:9000/
   stripPrefix: false

【问题讨论】:

我从这里关注 Dave Syer 的博客:spring.io/blog/2015/01/12/… 【参考方案1】:

资源服务器上没有“/list”的映射(所以它是 404)。您要么需要在路由声明中设置 stripPrefix=false,要么将后端的请求映射更改为“/”。

【讨论】:

我遇到了类似的问题。只有在我的情况下,当POSTing 时它给我一个 405(不允许),但 GET 工作正常。你能帮忙吗?【参考方案2】:

如果您不想设置stripPrefix属性,也可以尝试以下配置:

zuul:
  routes:
    customer:
      path: /customer/**
      url: http://localhost:9000/customer

【讨论】:

以上是关于Spring Boot + 云 | Zuul 代理 | 404 错误的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot + 云 | Zuul 代理 |集成测试

Spring Boot - 无法通过 Zuul 代理获得 Keycloak 授权 api 的响应

Zuul代理oAuth2在Spring Boot中未经授权

Dockerized Spring boot 和 Zuul

Spring Boot 微服务 com.netflix.zuul.exception.ZuulException:转发错误

使用 Spring boot、Eureka、Zuul、Spring Oauth 创建 OAuth 安全微服务的问题