SpringCloud 应用间通信基于HTTP的Restful调用方式有两种,RestTemplate与Feign
1.RestTemplate是远程调用Http的工具,支持本地负载均衡,是对Ribbon的封装。
pom文件加入spring-boot-starter-web依赖
调用的url是服务名,在eureka注册中心注册的服务名。使用服务名可以支持本地的负载均衡,如果使用ip地址,则不支持负载均衡。
一般使用@Bean将RestTemplate 注册到spring 容器中 @LoadBalanced 开启负载均衡
@Configuration public class RestTemplateConfig { @Value("${remote.maxTotalConnect}") private int maxTotalConnect; //连接池的最大连接数默认为0 @Value("${remote.maxConnectPerRoute}") private int maxConnectPerRoute; //单个主机的最大连接数默认200 @Value("${remote.connectTimeout}") private int connectTimeout; //连接超时默认2s @Value("${remote.readTimeout}") private int readTimeout; //读取超时默认30s @Bean// 将RestTemplate 注册到spring 容器中 @LoadBalanced// 开启负载均衡 RestTemplate restTemplate(){ RestTemplate restTemplate = new RestTemplate(createFactory()); List<HttpMessageConverter<?>> converterList = restTemplate.getMessageConverters(); //重新设置StringHttpMessageConverter字符集为UTF-8,解决中文乱码问题 HttpMessageConverter<?> converterTarget = null; for (HttpMessageConverter<?> item : converterList) { if (StringHttpMessageConverter.class == item.getClass()) { converterTarget = item; break; } } if (null != converterTarget) { converterList.remove(converterTarget); } converterList.add(new StringHttpMessageConverter(StandardCharsets.UTF_8)); return restTemplate; } //创建HTTP客户端工厂 private ClientHttpRequestFactory createFactory() { if(this.maxTotalConnect <= 0){ SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); factory.setConnectTimeout(this.connectTimeout); factory.setReadTimeout(this.readTimeout); return factory; } HttpClient httpClient = HttpClientBuilder.create().setMaxConnTotal(this.maxTotalConnect).setMaxConnPerRoute(this.maxConnectPerRoute).build(); HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient); factory.setConnectTimeout(this.connectTimeout); factory.setReadTimeout(this.readTimeout); return factory; } }