欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringCloud升級2020.0.x版之OpenFeign簡介與使用實現(xiàn)思路

 更新時間:2021年10月04日 08:59:03   作者:干貨滿滿張哈希  
在微服務(wù)系統(tǒng)中,我們經(jīng)常會進行 RPC 調(diào)用。在 Spring Cloud 體系中,RPC 調(diào)用一般就是 HTTP 協(xié)議的調(diào)用。對于每次調(diào)用,都要經(jīng)過一系列詳細步驟,接下來通過本文給大家介紹SpringCloud OpenFeign簡介與使用,感興趣的朋友一起看看吧

本系列代碼地址:https://github.com/JoJoTec/spring-cloud-parent

OpenFeign 的由來和實現(xiàn)思路

在微服務(wù)系統(tǒng)中,我們經(jīng)常會進行 RPC 調(diào)用。在 Spring Cloud 體系中,RPC 調(diào)用一般就是 HTTP 協(xié)議的調(diào)用。對于每次調(diào)用,基本都要經(jīng)過如下步驟:

  • 找到微服務(wù)實例列表并選擇一個實例
  • 調(diào)用參數(shù)序列化
  • 使用 Http 客戶端將請求發(fā)送出去
  • 響應(yīng)處理,反序列化等等

除了這些公共邏輯,業(yè)務(wù)上只需要定義參數(shù),HTTP 方法,HTTP URI,響應(yīng)就可以,也就是使用接口就能定義:

interface HttpBin {
    @Get(uri = "/get")
    String get(@Param("param") String param);
}

例如上面這個接口,就定義了一個 HTTP 請求,HTTP 方法為 GET,路徑是 /get,參數(shù)是 param,響應(yīng)為 String 類型。之后只要定義好公共邏輯,就能使用這個接口進行調(diào)用了。

對于這些公共邏輯的實現(xiàn)設(shè)計,我們很自然的就能想到切面與動態(tài)代理。之前的章節(jié),我們提到過 JDK 中有針對接口的動態(tài)代理,其實就是實現(xiàn) java.lang.reflect.InvocationHandler 然后針對這個接口實現(xiàn)代理類。之后使用這個代理類進行調(diào)用即可走入 InvocationHandler 中定義的邏輯。

以上,就是 OpenFeign 的設(shè)計實現(xiàn)思路與用途。

OpenFeign 簡介

OpenFeign 是一個基于聲明式(通過類元數(shù)據(jù)定義,例如注解等)定義的 HTTP 請求客戶端。這個庫可以讓你通過注解來自動生成調(diào)用對應(yīng) HTTP 服務(wù)的客戶端,從代碼上看調(diào)用這個遠程服務(wù)和調(diào)用本地服務(wù)方法一樣。OpenFeign 支持多種 HTTP 注解,包括 Feign 注解和 JAX-RS 注解,并且可以通過配置類似于插件的形式支持不同種類的注解。同時,還可以配置編碼器,解碼器,來編碼請求并解碼響應(yīng)。底層的 HTTP Client 也是可以配置的,你可以使用 Java 原生的 Http 鏈接,也可以使用 Apache HttpClient 還有 OkHttpClient 等等。

目前 OpenFeign 還在不斷迭代更新中,可以通過這個鏈接查看當前的 RoadMap。當前我們使用的是 OpenFeign 11,當前實現(xiàn)中或者計劃中的特性包括:

  • 響應(yīng)緩存,支持進程內(nèi)或者跨進程響應(yīng)緩存(實現(xiàn)中)
  • 實現(xiàn)更完善的 URI 模板支持(實現(xiàn)中)
  • 重構(gòu) Logger 日志 API(實現(xiàn)中)
  • 重構(gòu) Retry 重試 API(實現(xiàn)中)
  • 采集指標相關(guān) API(下一步要實現(xiàn))
  • 通過 CompletableFuture 作為基礎(chǔ)類,實現(xiàn)異步 API(當前已經(jīng)有基本實現(xiàn),下一步完整實現(xiàn))
  • 響應(yīng)式 API (下一步要實現(xiàn))
  • 斷路器相關(guān)支持(計劃中)

OpenFeign 基本使用

我們先來看 OpenFeign 的使用,先不關(guān)心 Spring Cloud 環(huán)境下如何使用,這樣更能理解其底層原理。單獨使用 OpenFeign 分以下幾步:

  1. 定義遠程 HTTP 調(diào)用 API 接口
  2. 創(chuàng)建 Feign 代理的 HTTP 調(diào)用接口實現(xiàn)
  3. 使用代理類進行調(diào)用

具體例子是:

interface GitHub {
    /**
     * 定義get方法,包括路徑參數(shù),響應(yīng)返回序列化類
     * @param owner
     * @param repository
     * @return
     */
    @RequestLine("GET /repos/{owner}/{repo}/contributors")
    List<Contributor> contributors(@Param("owner") String owner, @Param("repo") String repository);

    /**
     * 響應(yīng)體結(jié)構(gòu)類
     */
    class Contributor {
        String login;
        int contributions;

        public Contributor() {
        }

        public String getLogin() {
            return login;
        }

        public void setLogin(String login) {
            this.login = login;
        }

        public int getContributions() {
            return contributions;
        }

        public void setContributions(int contributions) {
            this.contributions = contributions;
        }
    }
}

public static void main(String[] args) {
    //創(chuàng)建 Feign 代理的 HTTP 調(diào)用接口實現(xiàn)
    GitHub github = Feign.builder()
                        //指定解碼器為 FastJsonDecoder
                        .decoder(new FastJsonDecoder())
                        //指定代理類為 GitHub,基址為 https://api.github.com
                        .target(GitHub.class, "https://api.github.com");
    List<GitHub.Contributor> contributors = github.contributors("OpenFeign", "feign");
}


/**
 * 基于 FastJson 的反序列化解碼器
 */
static class FastJsonDecoder implements Decoder {
    @Override
    public Object decode(Response response, Type type) throws IOException, DecodeException, FeignException {
        //讀取 body
        byte[] body = response.body().asInputStream().readAllBytes();
        return JSON.parseObject(body, type);
    }
}

在上面這個例子中,我們定義了訪問 GET https://api.github.com/repos/{owner}/{repo}/contributors 這個接口的 OpenFeign 客戶端,并自定義了響應(yīng)解碼器,反序列化了響應(yīng)體。這就是 OpenFeign 的基本使用。

我們這一節(jié)詳細介紹了 OpenFeign 的設(shè)計思路以及 RoadMap,了解這些之后,我們再來詳細分析 Openfeign,就能理解其中的一些設(shè)計以及使用思路了。并且某些重構(gòu)中的特性,我們在使用中需要格外注意,不過也不必擔心,因為在 Spring Cloud 中使用 OpenFeign 的特性都是通過加入膠水項目依賴實現(xiàn)的,底層 API 重構(gòu)是膠水項目需要關(guān)心的事情。

到此這篇關(guān)于SpringCloud升級2020.0.x版之OpenFeign簡介與使用實現(xiàn)思路的文章就介紹到這了,更多相關(guān)SpringCloud OpenFeign簡介與使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot接口限流的實現(xiàn)方法小結(jié)

    SpringBoot接口限流的實現(xiàn)方法小結(jié)

    在一個高并發(fā)系統(tǒng)中對流量的把控是非常重要的,當巨大的流量直接請求到我們的服務(wù)器上沒多久就可能造成接口不可用,不處理的話甚至?xí)斐烧麄€應(yīng)用不可用,所以我們需要接口限流,本文給大家介紹了SpringBoot接口限流的實現(xiàn)方法,需要的朋友可以參考下
    2024-10-10
  • apache ant進行zip解壓縮操作示例分享

    apache ant進行zip解壓縮操作示例分享

    本文主要介紹了使用apache ant進行zip解壓縮操作的方法,可以解決中文編碼和首層父類無法創(chuàng)建問題,需要的朋友可以參考下
    2014-02-02
  • zookeeper實現(xiàn)分布式鎖

    zookeeper實現(xiàn)分布式鎖

    這篇文章主要為大家詳細介紹了基于zookeeper實現(xiàn)分布式鎖,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • mybatis連接數(shù)據(jù)庫實現(xiàn)雙表查詢

    mybatis連接數(shù)據(jù)庫實現(xiàn)雙表查詢

    本文主要介紹了mybatis連接數(shù)據(jù)庫實現(xiàn)雙表查詢,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-09-09
  • SpringAnimation 實現(xiàn)菜單從頂部彈出從底部消失動畫效果

    SpringAnimation 實現(xiàn)菜單從頂部彈出從底部消失動畫效果

    最近做項目遇到這樣一個需求,要求實現(xiàn)一種菜單,菜單從頂部彈入,然后從底部消失,頂部彈入時,有一個上下抖動的過程,底部消失時,先向上滑動,然后再向下滑動消失。下面給大家?guī)砹藢崿F(xiàn)代碼,感興趣的朋友一起看看吧
    2018-05-05
  • Java 定時器(Timer,TimerTask)詳解及實例代碼

    Java 定時器(Timer,TimerTask)詳解及實例代碼

    這篇文章主要介紹了 Java 定時器(Timer,TimerTask)詳解及實例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • java程序中foreach用法示例

    java程序中foreach用法示例

    這篇文章主要介紹了java程序中foreach用法示例,需要的朋友可以參考下
    2014-04-04
  • java編程實現(xiàn)郵件定時發(fā)送的方法

    java編程實現(xiàn)郵件定時發(fā)送的方法

    這篇文章主要介紹了java編程實現(xiàn)郵件定時發(fā)送的方法,涉及Java基于定時器實現(xiàn)計劃任務(wù)的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11
  • 怎樣使用PowerMockito 測試靜態(tài)方法

    怎樣使用PowerMockito 測試靜態(tài)方法

    這篇文章主要介紹了使用PowerMockito 測試靜態(tài)的方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • springboot-curd基于mybatis項目搭建

    springboot-curd基于mybatis項目搭建

    這篇文章主要介紹了springboot-curd基于mybatis項目搭建,圍繞相關(guān)資料展開詳細內(nèi)容,希望對正在學(xué)習(xí)的你有所幫助,需要的小伙伴也可以參考一下
    2022-01-01

最新評論