加了@LoadBalanced不能使用ip来调用远程接口

问题背景说明
之前在工作中写了一个定时任务,其中需要调用另一个模块的数据,于是我使用RestTemplate的方式进行调用,我在配置文件中配置了那个模块的地址(使用的是注册中心中的微服务名),并通过@Value的方式注入到使用的地方。本来没啥问题的,可是同事他在记录日志的时候,正好使用的也是那一个模块,他也是将那个模块的地址写在配置文件中,但是是使用的ip的形式,正好,他看见我这样写,就模仿我也使用微服务名来调用,他发现怎么也调用不成功,于是就改成了在代码中直接new一个RestTemplate的方式,但是配置文件中的url地址给我改成了使用ip的形式。今天我测试功能的时候发现我这个定时任务一直跑不起来,一看报错,说没有这个负载均衡实例。经过一段时间的思考与发现,看见配置文件中的配置给我改掉了,也就是原本是微服务名,给我改成了ip。于是报错,后来自己的思考,发现加了@LoadBalanced注解不能使用ip来调用。于是找到问题原因,后面就很容易解决掉了。

@LoadBalanced注解说明
在开发微服务应用的时候,难免会进行服务间的相互调用。一般我们会使用RestTemplate来进行远程调用。但是在将RestTemplate放入Spring容器的时候需要注意一个问题,如下

@Configuration
public class ApplicationContextConfig {
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}


我们通过@LoadBalanced注解标明在使用远程调用的时候,需要使用负载均衡策略。我们知道,负载均衡其实是在同一个服务,存在集群的情况下使用的。所以在开发中,我们需要注意,如果使用了@LoadBalanced注解,在使用RestTemplate提供的getForObject(),或exchange()等方法时,url不能是ip地址,而必须是注册中心中的微服务名。
为什么呢?因为负载均衡调用的时候,在注册中心中的提供这个接口的服务不止一个,ribbon封装的时候只能够以注册中心中的服务名来进行调用,这样才能提供负载均衡效果。

所以在使用RestTemplate的时候,有些场景下我们只是单纯的用ip进行调用(如调用第三方接口服务),此时的RestTemplate就不能够加@LoadBanlanced注解。还有一种办法是直接在需要使用RestTemplate的地方,直接new一个新的RestTemplate对象。如下

public void test(){
    RestTemplate restTemplate = new RestTemplate();
    restTemplate.exchange("接口地址",xxx,xxx,xxx);//这里的接口地址就可以直接放协议+ip+端口,原理与上面一样
}


————————————————
版权声明:本文为CSDN博主「子房为之奈何」的原创文章,遵循CC 4.0 BY-SA版权协议,转载
原文链接:https://blog.csdn.net/qq_41570752/article/details/113647958

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值