SpringCloud應用間通信-RestTemplate與Feign


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;
    }
}
View Code

  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);
    }
}
View Code

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
    );
}
View Code

  service中直接調用該接口:。

@Autowired
private ERecordFeignClient eRecordFeignClient;; //引入接口

@RequestMapping("/devicetypes")
public String devicetypes() {
    return eRecordFeignClient.devicetypes(accidentInfo.getDeviceTypeId(), null, null); // 調用服務
}
View Code

  開啟配置:

@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();
    }

}
View Code

 

 

參考博客:https://blog.csdn.net/u010548207/article/details/100073964


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM