參考:https://blog.csdn.net/qq_34577182/article/details/88127803java
問題描述(1):當在springCloud中使用RestTemplate時當開啓@LoadBalanced註解時只能調用springcloud註冊中心的服務而且請求url不是是ip形式,只能是經過服務名在來調用。
web
若是要經過RestTemplate調用遠程應用如微信接口能夠用@Bean註解。spring
在項目中調用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來發起請求,問題解決。