当前位置: 首页 > java >正文

使用Spring Cloud LoadBalancer报错java.lang.IllegalStateException

1 问题描述

        在使用Spring Cloud LoadBalancer进行负载均衡时,遇到错误:

        而我的代码是这样写的:

String url = "http://product_service/product/" + orderInfo.getProductId();
ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);

        这里使用的restTemplate是使用@LoadBalanced注解的,因此会对该url进行解析,但是解析报错。

2 问题解决

        我首先考虑了服务的名称是否正确:

        其次输出服务实例的名称,发现输出的名称是大写格式,就把URL服务名称修改为大写,仍然不能解决问题。

        然后我怀疑是Spring Cloud内部可能会做字符格式替换之类的,进行了如下几组实验,目前的三种情况如下:

yml文件服务名称URL服务名称实验结果
product_serviceproduct-service报错
product-serviceproduct-service不报错
product_serviceproduct_service报错
product-serviceproduct_service报错

       URL中为短横线格式时,就不会报错。而第1组实验报错是因为实例名称不匹配,对于第3组实验报错,因此推测可能是LoadBalancer不能解析下划线:

        查阅资料发现,LoadBalancer解析时强制不能使用下划线,需要使用短横线进行单词连接。这是由于LoadBalancer的源码中核心是LoadBalancerInterceptor类,它会把所有的请求都拦截,并进行解析,在该类的intercept方法中使用getHost()获取URL中的主机名(也就是服务实例名称):

    public ClientHttpResponse intercept(final HttpRequest request, final byte[] body, final ClientHttpRequestExecution execution) throws IOException {URI originalUri = request.getURI();String serviceName = originalUri.getHost();Assert.state(serviceName != null, "Request URI does not contain a valid hostname: " + originalUri);return (ClientHttpResponse)this.loadBalancer.execute(serviceName, this.requestFactory.createRequest(request, body, execution));}

        在getHost()方法内部已经标注了主机名的命名规范:

        即只接受-作为连字符来连接标签,如果不符合规范就返回为null。因此使用product_service作为URL中服务实例名称就无法解析。

        修改后,问题得到解决。建议URL和yml中使用的服务名称如果要用连字符,都要用短横线连接的规范形式。

http://www.xdnf.cn/news/15469.html

相关文章:

  • Nestjs框架: 数据库架构设计与 NestJS 多 ORM 动态数据库应用与连接池的配置
  • QTableView鼠标双击先触发单击信号
  • 项目进度与预算脱节,如何进行同步管理
  • 从0开始学习R语言--Day47--Nomogram
  • 多租户SaaS系统中设计安全便捷的跨租户流程共享
  • 文心一言开源版部署及多维度测评实例
  • 深度解析 AI 提示词工程(Prompt Engineering)
  • 【YOLOv11-目标检测】06-模型部署(C++)
  • 可微分3D高斯溅射(3DGS)在医学图像三维重建中的应用
  • gRPC实战指南:像国际快递一样调用跨语言服务 —— 解密Protocol Buffer与HTTP/2的完美结合
  • AI 增强大前端数据加密与隐私保护:技术实现与合规遵
  • 20250715武汉xx公司面试一面
  • Springboot儿童认知图文辅助系统6yhkv(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • React.FC与React.Component
  • 高并发四种IO模型的底层原理
  • [Dify]--进阶3-- 如何通过插件扩展 Dify 的功能能力
  • 深入浅出 RabbitMQ-核心概念介绍与容器化部署
  • ubuntu部署kvm
  • Linux操作系统从入门到实战(十)Linux开发工具(下)make/Makefile的推导过程与扩展语法
  • OpenCSG QA:您的国产大模型与 Agent 管理平台
  • 运维技术教程之Jenkins上的known_hosts文件
  • 渲染设计图的空间革命:可视化技术如何重塑设计决策
  • Keepalived双机热备概述
  • 2025华为ODB卷-IPv4地址转换成整数三语言题解
  • DOM入门知识
  • 回顾一下Docker的基本操作
  • 简单易懂,操作系统的内存管理机制是如何实现的
  • 「Java题库」循环结构(理论+操作)
  • 博客项目 laravel vue mysql 第六章 文章功能
  • 手写签名提取工具