摘要:調用的默認構造函數,對象在底層通過使用包下的實現創建請求,可以通過使用指定不同的請求方式。接口主要提供了兩種實現方式一種是,使用提供的方式既包提供的方式創建底層的請求連接。
自從RESTFul API興起后,Spring就給開發者提供了一個訪問Rest的客服端,RestTemplate不僅可以很方便的調用http接口,還可以調用同一注冊中心下的微服務,同時還有負載均衡和熔斷機制。當然我也聽說OKhttp,HTTPClient之類的網絡框架,但是我們這里重點講的是RestTemplate(其中一種實現就是基于HTTPClient實現的),因為這是SpringBoot自帶,而且基本使用場景都覆蓋了。什么是RestTemplate?
RestTemplate是Spring提供的用于訪問Rest服務的客戶端,
RestTemplate提供了多種便捷訪問遠程Http服務的方法,能夠大大提高客戶端的編寫效率。
調用RestTemplate的默認構造函數,RestTemplate對象在底層通過使用java.net包下的實現創建HTTP 請求,
可以通過使用ClientHttpRequestFactory指定不同的HTTP請求方式。
ClientHttpRequestFactory接口主要提供了兩種實現方式
1、一種是SimpleClientHttpRequestFactory,使用J2SE提供的方式(既java.net包提供的方式)創建底層的Http請求連接。
2、一種方式是使用HttpComponentsClientHttpRequestFactory方式,底層使用HttpClient訪問遠程的Http服務,使用HttpClient可以配置連接池和證書等信息。
簡單配置RestTemplate@Configuration class RestTemplateConfig { /** * 構建一個使用默認配置RestTemplate Bean */ @Bean fun restTemplate():RestTemplate { return RestTemplateBuilder().build() } }發送POST請求,通過Form表單提交參數
@Component class RestTemplateClient { @Autowired lateinit var restTemplate: RestTemplate val logger:Logger = LoggerFactory.getLogger(this.javaClass) /** * 發送POST請求,通過Form表單提交參數 */ fun編寫Controller及測試postForm(params: Map , url: String, t:T) : ResultDTO ? { logger.info("請求URL===========:{}", url) logger.info("請求參數===========:{}", params) val httpHeaders = HttpHeaders() httpHeaders.contentType = MediaType.APPLICATION_FORM_URLENCODED val requestParams = LinkedMultiValueMap () params.forEach(requestParams::add) val httpEntity = HttpEntity >(requestParams, httpHeaders) return restTemplate.postForObject(url, httpEntity, ResultDTO ().javaClass) } }
@RestController @RequestMapping("/api") class LotteryController { @Autowired lateinit var restTemplateClient: RestTemplateClient /** * 彩票類型查詢 */ @PostMapping("/lottery/types") fun lotteryTypes(@RequestBody params:Map發送POST請求,通JSON傳參) : ResultDTO ? { return restTemplateClient.postForm(params, UrlEnums.DEMO1.url, LotteryDTO()) } }
/** * 發送POST請求,通過Form表單提交參數 */ fun發送GET請求postBody(params: Map , url: String, t:T) : ResultDTO ? { logger.info("請求URL===========:{}", url) logger.info("請求參數===========:{}", params) val httpHeaders = HttpHeaders() httpHeaders.contentType = MediaType.APPLICATION_JSON_UTF8 val httpEntity = HttpEntity(params, httpHeaders) return restTemplate.postForObject(url, httpEntity, ResultDTO ().javaClass) }
/** * 發送POST請求,通過Form表單提交參數 */ funGET下載資源get(params: Map , url: String, t:T) : ResultDTO ? { logger.info("請求URL===========:{}", url) logger.info("請求參數===========:{}", params) val builder = StringBuilder() params.forEach{k, v -> builder.append(k).append("=").append(v).append("&") } val param : String = builder.toString().substring(0, builder.length - 1) return restTemplate.getForObject(url.plus(param), ResultDTO ().javaClass) }
/** * 下載資源 */ fun downGet(url: String, headerParams: Map調用微服務接口) : ByteArray? { logger.info("資源URL==========>:{}", url) val httpHeaders = HttpHeaders() if (!CollectionUtils.isEmpty(headerParams)) { headerParams.forEach(httpHeaders::add) } val httpEntity = HttpEntity(LinkedMultiValueMap ().putAll(httpHeaders)) return restTemplate.exchange(url, HttpMethod.GET, httpEntity, ByteArray::class.java).body }
我們在開發微服務應用的時候,有時候一個應用可能會部署很多臺,而且還是不在不通的機器上,這個時候我們可以用Nginx做一個負載均衡,但是我們這里推薦使用的是SpringCloud提供的負載均衡,只要在Bean上面加一個注解即可@LoadBalanced,如下所示:
@Bean @LoadBalanced fun restTemplate():RestTemplate { return RestTemplateBuilder().build() }
和調用普通的http請求有點不同的地方是,調用微服務是http://application.name/xxx,我們訪問的路徑是微服務應用名稱+業務路由,因為服務會注冊到注冊中心,注冊中心會維護這個應用名稱,當我們通過應用去訪問時,就可以知道這個應用在那臺機器上了。
基礎使用講完了,但是這里還存在一個問題,因為我們使用的是最簡單的配置,在這里我們沒有設置默認超時時間,官方默認的是60S,但是我們業務中通常對響應速度是有要求,一分鐘的等待時間對于用戶來說太長了,這個時候我們就需要有一個超時機制,具體的設置如下:
package io.intodream.kotlin05.config import org.apache.http.impl.client.HttpClientBuilder import org.springframework.beans.factory.annotation.Value import org.springframework.boot.context.properties.ConfigurationProperties import org.springframework.boot.web.client.RestTemplateBuilder import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.http.client.ClientHttpRequestFactory import org.springframework.http.client.HttpComponentsClientHttpRequestFactory import org.springframework.http.client.SimpleClientHttpRequestFactory import org.springframework.http.converter.HttpMessageConverter import org.springframework.http.converter.StringHttpMessageConverter import org.springframework.stereotype.Component import org.springframework.web.client.RestTemplate import java.nio.charset.StandardCharsets /** * @description * RestTemplate 配置 * @author Jwenk * @copyright intoDream.io 筑夢科技 * @email xmsjgzs@163.com * @date 2019-04-05,22:42 */ @Configuration class RestTemplateConfig { @Value("${remote.maxTotalConnect}") val maxTotalConnect: Int = 0 @Value("${remote.maxConnectPerRoute}") val maxConnectPerRoute: Int = 200 @Value("${remote.connectTimeout}") val connectTimeout: Int = 2000 @Value("${remote.readTimeout}") val readTimeout: Int = 3000 /** * 創建HTTP客戶端工廠 */ private fun createFactory() : ClientHttpRequestFactory { if (this.maxTotalConnect <= 0) { val factory = SimpleClientHttpRequestFactory() factory.setReadTimeout(this.readTimeout) factory.setConnectTimeout(this.connectTimeout) return factory } val httpClient = HttpClientBuilder.create() .setMaxConnTotal(this.maxTotalConnect) .setMaxConnPerRoute(this.maxConnectPerRoute).build() val factory = HttpComponentsClientHttpRequestFactory(httpClient) factory.setConnectTimeout(this.connectTimeout) factory.setReadTimeout(this.readTimeout) return factory } /** * 構建一個使用默認配置RestTemplate Bean */ @Bean fun restTemplate():RestTemplate { val restTemplate = RestTemplate(this.createFactory()) val converterList : MutableList> = restTemplate.messageConverters var converterTarget : HttpMessageConverter<*>? = null /** * 重新設置StringHttpMessageConverter字符集為UTF-8,解決中文亂碼問題 */ for (item: HttpMessageConverter<*> in converterList) { if (StringHttpMessageConverter::class.java == item.javaClass) { converterTarget = item break } } if (null != converterTarget) { converterList.remove(converterTarget) } converterList.add(1, StringHttpMessageConverter(StandardCharsets.UTF_8)) return restTemplate } }
記得在pom.xml里面引入HttpClient的jar,不然啟動會報錯的
org.apache.httpcomponents httpclient 4.5.6
關于RestTemplate的一些使用及配置優化到此就結束了,喜歡的朋友可以關注本人的博客https://www.tisnz.com,如果有不對的地方歡迎指正。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74113.html
摘要:一本節目標前兩章主要講了的基本操作,這一章我們將學習使用訪問,并通過完成簡單操作。這里有一個問題什么不選用數據庫呢答案是目前支持。突出點是,即非阻塞的。二構建項目及配置本章不在講解如何構建項目了,大家可以參考第一章。 showImg(https://segmentfault.com/img/remote/1460000018819338?w=1024&h=500); 一、本節目標 前兩...
摘要:一本節目標前兩章主要講了的基本操作,這一章我們將學習使用訪問,并通過完成簡單操作。這里有一個問題什么不選用數據庫呢答案是目前支持。突出點是,即非阻塞的。二構建項目及配置本章不在講解如何構建項目了,大家可以參考第一章。 showImg(https://segmentfault.com/img/remote/1460000018819338?w=1024&h=500); 一、本節目標 前兩...
摘要:在很多服務中我經常需要用到發送郵件功能,所幸的是可以快速使用的框架,只要引入改框架我們可以快速的完成發送郵件功能。引入獲取郵件發送服務器配置在國內用的最多的就是郵件和網易郵件,這里會簡單講解獲取兩家服務商的發送郵件配置。 showImg(https://segmentfault.com/img/remote/1460000018819338?w=1024&h=500); 在很多服務中我...
摘要:二教程環境三創建項目創建項目有兩種方式一種是在官網上創建二是在上創建如圖所示勾選然后點,然后一直默認最后點擊完成即可。我們這里看到和普通的接口沒有異同,除了返回類型是用包裝之外。與之對應的還有,這個后面我們會講到。 showImg(https://segmentfault.com/img/remote/1460000018819338?w=1024&h=500); 從去年開始就開始學習...
摘要:一個客戶端請求從發出到被響應經歷了哪些組件哪些微服務請求總時長每個組件所花時長等信息我們有必要了解和收集,以幫助我們定位性能瓶頸進行性能調優,因此監控整個微服務架構的調用鏈十分有必要,本文將闡述如何使用搭建微服務調用鏈追蹤中心。 showImg(https://segmentfault.com/img/remote/1460000014553707); 概述 一個完整的微服務系統包含...
閱讀 3920·2021-11-24 10:46
閱讀 1816·2021-11-16 11:44
閱讀 2289·2021-09-22 16:02
閱讀 1401·2019-08-30 15:55
閱讀 1131·2019-08-30 12:46
閱讀 566·2019-08-28 18:31
閱讀 2762·2019-08-26 18:38
閱讀 1094·2019-08-23 16:51