加了@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+端口,原理与上面一样
}

猜你喜欢

转载自blog.csdn.net/qq_41570752/article/details/113647958