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

mac2024-12-21  7

使用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不包含有效的主机名

最新回复(0)