欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用spring cloud测试负载均衡时报java.lang.IllegalStateException: Request URI does not contain a valid hostname

程序员文章站 2022-07-15 11:58:35
...

使用spring cloud测试负载均衡时报java.lang.IllegalStateException: Request URI does not contain a valid hostname请求URI不包含有效的主机名异常

页面报错主要信息如下:

There was an unexpected error (type=Internal Server Error, status=500).
Request URI does not contain a valid hostname: http://provider_service/user/findById?id=2
java.lang.IllegalStateException: Request URI does not contain a valid hostname: http://provider_service/user/findById?id=2

翻译之后意思是

发生意外错误(类型=内部服务器错误,状态= 500)。
请求URI不包含有效的主机名:http:// provider_service / user / findById?id = 2
java.lang.IllegalStateException:请求URI不包含有效的主机名:http:// provider_service / user / findById?id = 2

idea中报错

java.lang.IllegalStateException: Request URI does not contain a valid hostname: http://provider_service/user/findById?id=2] with root cause

最后检查自己的服务提供者provider_service的配置文件application.yml中发现
设置应用名称,在注册中心中作为服务的id标识起名字时,使用了下划线"_"
以下是错误代码:

#应用名称,会在Eureka中作为服务的id标识
spring.application.name:provider_service
  @RequestMapping("/ribbonconsumer/{id}")
    public User findByIdWithRibbonConsumer(@PathVariable("id") Integer id) {
  		 /*
         * 开启Ribbon的负载均衡支持,那么请求地址变为服务的名称
         * http://localhost:9091/user/findById?id="+id
         * 修改调用请求的Url地址,改为服务名称调用
         */
        String url = "http://provider_service/user/findById?id=" + id;
        User user = restTemplate.getForObject(url, User.class);
        System.out.println("user = " + user);
        return user;
    }

正确应修改为:

#应用名称,会在Eureka中作为服务的id标识
spring.application.name:provider-service
  @RequestMapping("/ribbonconsumer/{id}")
    public User findByIdWithRibbonConsumer(@PathVariable("id") Integer id) {
  		 /*
         * 开启Ribbon的负载均衡支持,那么请求地址变为服务的名称
         * http://localhost:9091/user/findById?id="+id
         * 修改调用请求的Url地址,改为服务名称调用
         */
        String url = "http://provider-service/user/findById?id=" + id;
        User user = restTemplate.getForObject(url, User.class);
        System.out.println("user = " + user);
        return user;
    }

细看之下没有发现什么区别,真正的区别在于在配置文件中配置的应用名的符号不同,错误的那个使用的是"_",而正确的应该使用"-",
应该是因为不识别下划线,所以我们在黑应用起名字时不要使用下划线,所以才导致的请求URI不包含有效的主机名