以前也用過Feign,不過是在SpringCloud體系內用的,須要配合服務發現一塊兒用。git
偶然經過一位同事瞭解到Spring Boot也能夠直接整合Feign進行Http遠程調用,趕忙試了一把嚐嚐鮮,果斷鳥槍換炮。感謝小夥伴的分享~github
話很少說直接show code。web
創建一個SpringBoot應用的過程再也不贅述了,基於IDEA建立一個新的工程仍是蠻快的。spring
在Pom.xml中添加以下依賴json
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/io.github.openfeign/feign-okhttp -->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
<version>10.2.3</version>
</dependency>
複製代碼
因爲feign自帶的http客戶端實現是HttpURLConnection,沒有鏈接池功能,可配置能力也比較差,所以咱們使用okhttp做爲底層的http客戶端的具體實現。springboot
編寫一個FeignOkHttpConfig配置類,配置OkHttpi實例。app
@Configuration
@ConditionalOnClass(Feign.class)
@AutoConfigureBefore(FeignAutoConfiguration.class)
public class FeignOkHttpConfig {
@Bean
public okhttp3.OkHttpClient okHttpClient(){
return new okhttp3.OkHttpClient.Builder()
.readTimeout(60, TimeUnit.SECONDS)
.connectTimeout(60, TimeUnit.SECONDS)
.writeTimeout(120, TimeUnit.SECONDS)
.connectionPool(new ConnectionPool())
.build();
}
}
複製代碼
主要設置了連接超時時間及讀寫超時時間,這裏是筆者隨意寫的,具體業務中使用須要根據業務特色去靈活調整。ide
筆者爲了測試方便,直接在博客的某個路徑下放置了一個json文件,文件內容以下:spring-boot
{
"code": "10000",
"desc": "success",
"data": {
"name": "snowalker",
"age": "18"
}
}
複製代碼
咱們接着編寫Feign客戶端對此json文件發起調用:測試
@FeignClient(name = "feignClientProxy",url = "http://wuwenliang.net/samples/")
public interface FeignClientProxy {
@RequestMapping(value = "/snowalker.json", method = RequestMethod.GET)
@ResponseBody
ResponseData<DemoResp> invoke(@RequestParam(value="name") String name);
/**
* 容錯處理類,當調用失敗時 返回空字符串
*/
@Component
class DefaultFallback implements FeignClientProxy {
@Override
public ResponseData<DemoResp> invoke(@RequestParam(value="snowalker") String name){
return new ResponseData<DemoResp>().setCode("40004").setDesc("服務異常").setData(null);
}
}
}
複製代碼
這裏主要關注註解 @FeignClient,參數name用以指定bean實例名,url用以指定遠程服務調用根路徑。
在具體的方法上標註@RequestMapping,指定資源的相對路徑以及調用的方法。
@Controller
@RequestMapping("/demo")
public class FeignDemoController {
@Autowired
FeignClientProxy feignClientProxy;
@RequestMapping(value = "feign")
@ResponseBody
public String testFeign(@RequestParam(name = "name") String name) throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
ResponseData<DemoResp> respResponseBody = feignClientProxy.invoke(name);
return "調用結果:" + objectMapper.writeValueAsString(respResponseBody);
}
}
複製代碼
這個代碼就很簡單了,不須要多解釋,就是接收參數name直接透傳Feign客戶端(經過@Autowired註解注入),發起遠程調用,將調用結果(json反序列化後的實體)打印出來。
啓動該demo服務,訪問FeignDemoController.testFeign的mapping路徑:
http://localhost:8080/demo/feign?name=123
複製代碼
能夠看到以下返回參;
調用結果:{"code":"10000","desc":"success","data":{"name":"snowalker","age":"18"}}
複製代碼
具體訪問效果截圖以下:
能夠看到,咱們的feign客戶端成功的發起了對遠程資源的訪問。
PS: 本文涉及到的源碼已經發布到筆者的github,感興趣的同窗能夠自行下載體驗。
本文主要是實戰,目的爲整合純Spring Boot與Feign,並進行一次嚐鮮式的測試。在實戰中,須要根據不一樣的遠程接口對Feign客戶端作對應的定義,但總的來說,這種開發方式極大的提高了外部接口的接入速率,對於提高開發效率、增長代碼的優雅程度都大有裨益。
立個flag,後面的文章中,咱們將對Feign是如何調用遠程資源的機理進行深刻的分析。畢竟要知其然,還要知其因此然。