@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來發起請求,問題解決。

相關文章
相關標籤/搜索