您好,登錄后才能下訂單哦!
這篇文章主要介紹了SpringCloud怎么利用Feign訪問外部http請求的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇SpringCloud怎么利用Feign訪問外部http請求文章都會有所收獲,下面我們一起來看看吧。
大家好,目前接手了一個項目,具體的邏輯并不復雜,主要是一個"中間商"角色, 比如客戶端通過我訪問高德地圖API,就不需要帶秘鑰,直接帶高德API所需的入參和url后綴,就可以訪問。
目前遇到這樣一個問題,項目架構師要求所有的項目自己寫的htttpClintUtils或者其他工具,需要替換到feign的形式來完成調用,但是,目前這個項目訪問外部的http接口很多,比如,提供的高德服務就有10多種,一共有大幾十類型,這樣的話,如果按照以前的方式,一個接口指定一個高德子服務,那豈不是要累死 = =!
@FeignClient(value = "test",url = "http://ip:port") public interface TestFeign { /** * @return 高德服務接口 * @description 訪問高德地理編碼服務 */ @PostMapping(value = "/Amap/geo") Object geo(@RequestBody GeoEntity entity); /** * @return 高德服務接口 * @description 訪問高德逆地理編碼服務 */ @PostMapping(value = "/Amap/regeo") Object regeo(@RequestBody RegeoEntity entity); ......... ........... }
然后如果我除了高德服務還有其他外部服務,并且其他外部服務下的子接口,不一定就兩個,那這樣寫的話,要頭大死,并且這樣的寫法,在服務的內部,不能做秘鑰和權限的動態配置,只能在url上做指定,比較笨拙,所以就需要一種可以靈活訪問外部httpClient的Feign接口,只需要我指定一個url,指定下提交的post數據,就可以得到返回結果,豈不是美滋滋?
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>2.0.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> <version>2.0.1.RELEASE</version> </dependency> <!-- 引入 httpclient --> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> </dependency> <dependency> <groupId>com.netflix.feign</groupId> <artifactId>feign-httpclient</artifactId> <version>8.18.0</version> </dependency>
前兩個是feign和服務降級用到的包,后兩個是用Apache Http替換原生的feign-http-client用來提供連接池等功能。
feign: httpclient: enabled: true hystrix: enabled: true hystrix: command: default: execution: isolation: thread: timeoutInMilliseconds: 3000 #降級超時時間,我設置為3秒。 feign.retry默認超時時間是5s.
設置了個降級超時時間,還有啟動了feign訪問外部httpClient配置和服務降級配置。
@EnableFeignClients
@EnableHystrix
代碼部分:
public interface HttpRequestFeign { @RequestLine("GET") String sendGetRequest(URI baseUri); @RequestLine("POST") String sendPostRequest(URI baseUri, Map map); }
調用部分,這里我在我的BaseController構造注解,其他服務Controller繼承,提供調用能力:
@Autowired public BaseController(Decoder decoder, Encoder encoder) { httpRequestFeign = Feign.builder().encoder(encoder).decoder(decoder) .target(Target.EmptyTarget.create(HttpRequestFeign.class)); } protected String httpPostSend( String url, Map map) { String response = ""; try { response = httpRequestFeign.sendPostRequest(new URI(url), map); logger.info("調用外部服務返回的數據為->{}", response); // 這里改成重試的超時異常 } catch (RetryableException a) { logger.error("調用外部服超時錯誤->{}", response); } catch (Exception e) { logger.error("調用外部服異常錯誤->{}", response); } return response; }
這里只列舉了Post的,Get方式,就不用了攜帶map參數了。
然后在你的Controller層增加降級@HystrixCommand注解,并指定降級方法:
@HystrixCommand(fallbackMethod = "fallback") @PostMapping(value = "/1_0_0/{subServer}", produces = "application/json;charset=UTF-8") public Object send(@RequestBody Map<String, Object> map, @PathVariable String subServer) { ....................... .................... private Object fallback(Map<String, String> map, String subserver, Throwable e) { logger.error("xxx服務發生問題,入參:{},地址:{}", map, subserver); return Result.fail(ResultCode.INTERNAL_SERVER_ERROR.getCode(), ERROR_MSG + e.toString()); }
在send方法里可以自行進行拼接url,而Map就是傳遞給第三方服務的數據。
springboot 4.0.0
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-openfeign</artifactId> <version>2.0.2.BUILD-SNAPSHOT</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <!--外部http請求 FeignClient--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> </dependencies> <repositories> <!--外部http請求 FeignClient--> <repository> <id>spring-snapshots</id> <name>Spring Snapshots</name> <url>https://repo.spring.io/libs-snapshot</url> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories>
@SpringBootApplication @MapperScan("com.sichuang.repository.dao")//將項目中對應的mapper類的路徑加進來就可以了 @ServletComponentScan @EnableFeignClients public class RepositoryApplication extends SpringBootServletInitializer{ public static void main(String[] args) { SpringApplication.run(RepositoryApplication.class, args); } @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { // TODO Auto-generated method stub // return super.configure(builder); return builder.sources(RepositoryApplication.class); } }
@RequestParam 參數注解
produces = MediaType.APPLICATION_JSON_UTF8_VALUE 返回json參數
package com.sichuang.repository.api; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import java.util.Map; /** * 對接接口 * * @author xs * @date 2018/10/8 9:08 */ @FeignClient(url = "${url}", name = "Ewaytec2001API") public interface Ewaytec2001API { /** */ @GetMapping(value = "${url}", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) String getEmployeeInfo(@RequestParam("id") int id, @RequestParam("sign") String sign); }
關于“SpringCloud怎么利用Feign訪問外部http請求”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“SpringCloud怎么利用Feign訪問外部http請求”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。