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; } }
service中直接引用restTemplate調用接口

@Service public class RemoteServiceImpl implements IRemoteService{ @Autowired private RestTemplate restTemplate; /** * @description:遠程請求方法(同步) * @author @author skj * @date 2019年10月29日 */ @Override public JSONObject excute(MultiValueMap<String, Object> map,String url) throws Exception{ ResponseEntity<JSONObject> responseEntity = null; HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<MultiValueMap<String,Object>>(map, headers); responseEntity = restTemplate.postForEntity(url, requestEntity,JSONObject.class); JSONObject result = responseEntity.getBody(); return result; } /** * @description:遠程請求方法(異步) * @author @author skj * @date 2019年10月29日 */ @Override @Async public void asyncExcute(MultiValueMap<String, Object> map,String url) throws Exception{ HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<MultiValueMap<String,Object>>(map, headers); restTemplate.postForEntity(url, requestEntity,JSONObject.class); } }
2.Feign客戶端是一個web聲明式http遠程調用工具,提供了接口和注解方式進行調用,是對Ribbon的封裝。
pom文件加入spring-cloud-starter-openfeign依賴
接口指定服務器名稱及方法:

@FeignClient(value = "erecord-search-service")// 指定服務名稱 public interface ERecordFeignClient { @RequestMapping(value = "/vendorInfo/vendor-by-unitid-deviceid",method = RequestMethod.POST) JSONObject findByunitIdAndDeviceId( @RequestParam("unitId") String unitId, @RequestParam("deviceId") String deviceId ); }
service中直接調用該接口:。

@Autowired private ERecordFeignClient eRecordFeignClient;; //引入接口 @RequestMapping("/devicetypes") public String devicetypes() { return eRecordFeignClient.devicetypes(accidentInfo.getDeviceTypeId(), null, null); // 調用服務 }
開啟配置:

@SpringBootApplication @EnableEurekaClient @EnableFeignClients // 啟用feign 客戶端 public class AppOrder { public static void main(String[] args) { SpringApplication.run(AppOrder.class, args); } // 如果使用rest方式以別名方式進行調用依賴ribbon負載均衡器 @LoadBalanced // @LoadBalanced就能讓這個RestTemplate在請求時擁有客戶端負載均衡的能力 // 這個就是前面介紹到的RestTemplate的配置方式 @Bean @LoadBalanced RestTemplate restTemplate() { return new RestTemplate(); } }
參考博客:https://blog.csdn.net/u010548207/article/details/100073964