当前位置: 首页 > 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://www.lryc.cn/news/589546.html

相关文章:

  • AI助手指南:从零开始打造Python学习环境(VSCode + Lingma/Copilot + Anaconda + 效率工具包)
  • 学习秒杀系统-实现秒杀功能(商品列表,商品详情,基本秒杀功能实现,订单详情)
  • Sharding-JDBC 分布式事务实战指南:XA/Seata 方案解析(三)
  • 2HDMI/1DP转EDP/LVDS,支持4K,144HZ和240HZ.
  • LSA链路状态通告
  • 学习软件测试的第十六天
  • 项目进度跨地域团队协作困难,如何统一进度安排
  • 原来时间序列挖掘这么简单
  • 力扣73:矩阵置零
  • NW917NW921美光固态闪存NW946NW952
  • 游戏行业中的恶梦:不断升级的DDoS攻击
  • 【HarmonyOS】ArkUI-X 跨平台框架入门详解(一)
  • 3.正则化——新闻分类
  • 【stm32】新建工程
  • STM32裸机开发(中断,轮询,状态机)与freeRTOS
  • MyBatis与Spring整合优化实战指南:从配置到性能调优
  • Conda 核心命令快速查阅表
  • 系统编程是什么
  • 22-C#的委托简单使用-2
  • ai问答推荐企业排名优化?:五大企业核心竞争力全景对比
  • 从0开始学习R语言--Day47--Nomogram
  • 【51单片机先流水2秒后数码显示2秒后显示END】2022-9-5
  • 判断QMetaObject::invokeMethod()里的函数是否调用成功
  • 密码协议的基本概念
  • 【Linux手册】重定向是如何实现的?Linux下为什么一切皆文件?
  • 【env环境】rtthread5.1.0使用fal组件
  • npm install failed如何办?
  • 差分信号接口选型指南:深入解析LVDS、SubLVDS、SLVDS与SLVDS-EC**
  • 回顾一下Docker的基本操作
  • 项目:从零开始制作一个微信小程序(第六天)