@LoadBalanced使用问题

参考:https://blog.csdn.net/qq_34577182/article/details/88127803java

问题描述(1):当在springCloud中使用RestTemplate时当开启@LoadBalanced注解时只能调用springcloud注册中心的服务而且请求url不是是ip形式,只能是经过服务名在来调用。
web

若是要经过RestTemplate调用远程应用如微信接口能够用@Bean注解。spring

RestTemplate使用@LoadBalanced报错:

Request URI does not contain a valid hostname以及中文乱码问题


问题描述(2) :

在项目中调用restTemplate.postForObject发送异步通知给远程IP时,抛出异常:java.lang.IllegalStateException: Request URI does not contain a valid hostname,具体异常以下:bash

java.lang.IllegalStateException: Request URI does not contain a valid hostname: at org.springframework.util.Assert.state(Assert.java:70) at org.springframework.cloud.client.loadbalancer.RetryLoadBalancerInterceptor.intercept(RetryLoadBalancerInterceptor.java:102) at org.springframework.http.client.InterceptingClientHttpRequest$InterceptingRequestExecution.execute(InterceptingClientHttpRequest.java:88) at org.springframework.http.client.InterceptingClientHttpRequest.executeInternal(InterceptingClientHttpRequest.java:72) at org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48) at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:53) at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:660) at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:621) at org.springframework.web.client.RestTemplate.postForObject(RestTemplate.java:388) at com.hengfupay.payment.task.NotifyTask.notifyResult(NotifyTask.java:48) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:65) at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:81) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266) at java.util.concurrent.FutureTask.run(FutureTask.java) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) 微信

问题所在:

发如今RestTemplate注册的时候,开启了客户端负载均衡功能,开启负载均衡很简单,只须要在RestTemplate的bean上再添加一个@LoadBalanced注解便可。代码以下:负载均衡

@Bean   
 @LoadBalanced   
 public RestTemplate restTemplate() {    
    return new RestTemplate();   
 }复制代码

可是开启负载均和后,RestTemplate不能对远程IP发起请求。异步

问题解决:

因此在注册的时候能够注册两个不一样的RestTemplate,好比:post

@Bean   
 @LoadBalanced  
 public RestTemplate restTemplate() {      
  return new RestTemplate();   
 }  

@Bean    
public RestTemplate commRestTemplate() { 
       RestTemplate restTemplate = new RestTemplate();     
       restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));  
       return restTemplate;   
 }复制代码

restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));这行代码是为了防止restTemplate在请求中出现中文乱码,把编码格式设置为UTF-8格式。ui

以后在对外部远程IP地址发起请求的时候,能够注入commRestTemplate:编码

@Autowired  
    private RestTemplate commRestTemplate;复制代码

再用commRestTemplate来发起请求,问题解决。

相关文章
相关标签/搜索