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

使用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://bolshevism.apjjykv.cn
http://butch.apjjykv.cn
http://aponeurotic.apjjykv.cn
http://bireme.apjjykv.cn
http://atlantic.apjjykv.cn
http://barometric.apjjykv.cn
http://axminster.apjjykv.cn
http://caulocaline.apjjykv.cn
http://agglomerative.apjjykv.cn
http://adversity.apjjykv.cn
http://bilgy.apjjykv.cn
http://aerographer.apjjykv.cn
http://auscultator.apjjykv.cn
http://azobenzene.apjjykv.cn
http://aurae.apjjykv.cn
http://chabouk.apjjykv.cn
http://ampullaceous.apjjykv.cn
http://annexe.apjjykv.cn
http://allegheny.apjjykv.cn
http://balladist.apjjykv.cn
http://carcinology.apjjykv.cn
http://adventureful.apjjykv.cn
http://chronoscope.apjjykv.cn
http://bummalo.apjjykv.cn
http://bailout.apjjykv.cn
http://aerobiologist.apjjykv.cn
http://baalism.apjjykv.cn
http://cattegat.apjjykv.cn
http://brokenly.apjjykv.cn
http://belowground.apjjykv.cn
http://www.dtcms.com/a/281091.html

相关文章:

  • Wordpress登录数据库连接失败的问题
  • Web攻防-PHP反序列化字符逃逸增多减少成员变量属性解析不敏感Wakeup绕过
  • 网络:TCP序列号和滑动窗口,顺序保证
  • 【R语言】警告conversion failure on ‘中文字符‘ in ‘mbcsToSbcs‘: for 注 (U+6CE8)
  • 枪机、支持POE、4G连接交换机实现多屏幕显示
  • 【郑大二年级信安小学期】Day12:编写渗透测试脚本搭建虚拟环境
  • 淘宝扭蛋机小程序开发:重构电商娱乐化体验的新范式
  • 不同系统记录项目进度不一致,如何统一口径
  • 【Linux系统】命令行参数和环境变量
  • gitee某个分支合并到gitlab目标分支
  • 微信小程序未登录状态下的导航拦截有哪些方法可以实现
  • AI大模型应用架构演进:从LLM基础到Agent协作的范式转移
  • GBase 8a 与 Spring Boot + MyBatis 整合实战:从环境搭建到CRUD操作
  • 扩展:操作系统之高性能网络计算
  • 使用 mongoimport 导入本地 JSON 文件到 MongoDB 及数据查看指南
  • 微信小程序入门实例_____从零开始 开发一个每天记账的微信小程序
  • Rust语言
  • Isaac Sim仿真赋能机器人工作流,推动具身智能在机器人领域研究
  • 深入解析:磁盘级文件与内存级(被打开)文件的本质区别与联系
  • MySQL锁机制与SQL优化详解
  • Vue 中 effectScope() 的全面解析与实战应用
  • 虚拟机删除操作
  • lanch4j将jar转成exe
  • 文心4.5开源背后的战略棋局:百度为何选择All in开放?
  • Django基础(二)———URL与映射
  • 10 款游戏设计工具深度解析,打造卓越游戏项目
  • 在Autodl服务器中使用VNC建立图形界面
  • MySQL查询今天、昨天、上周、近30天、去年等的数据的方法
  • [锂电池]锂电池入门指南
  • Android 多语言适配(I18n)