請觀察這里的片段有沒有問題?
@Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } @Autowired private RestTemplate restTemplate; @Autowired private LoadBalancerClient loadBalancerClient; @RequestMapping(value = "/hi") @ResponseBody public String hi() { ServiceInstance instance = loadBalancerClient.choose("HELLO"); URI helloUri = URI.create(String.format("http://%s:%s/hello", instance.getHost(), instance.getPort())); System.out.println("Target service uri = "+helloUri.toString()); return restTemplate.getForObject(helloUri,String.class); }
實際上,hi請求映射方法存在問題;問題是 因為 LoadBalancedClient 這里的 choose 根據 Eureka注冊的服務名(ServiceId == spring.application.name) 命中一個服務提供者;這里就不能使用 加了 LoadBalanced注解的RestTemplate對象了,因為會根據 host 去eureka查找服務提供者,這樣就會拋異常 :No instances available for XXX ,也就是找不到指定的服務ID拉
可以使用2中方式:
LoadBalancerClient 進行手動的http請求;Ribbon集成了Apache HttpClient 、 OkHttp請求客戶端使用;怎么使用自己琢磨去吧。。。
ribbon:
okhttp:
enabled: true
restclient:
enabled: true
mmp,廢了3個小時左右,😭
