SpringBoot2.x直接整合Feign實現遠程接口調用[嚐鮮]

以前也用過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

配置OkHttp

編寫一個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

編寫FeignClient接口

筆者爲了測試方便,直接在博客的某個路徑下放置了一個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,指定資源的相對路徑以及調用的方法。

編寫一個本地測試接口,調用Feign客戶端

@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是如何調用遠程資源的機理進行深刻的分析。畢竟要知其然,還要知其因此然。

相關文章
相關標籤/搜索