spring cloud 之 feign

一马绝、fegin簡介

fegin 是 Netflix 開發(fā)的聲明式匿辩、模板化的HTTP客戶端,其令該來自Retrofit氛堕、JAXRS-2.0以及WebSocket。feign可幫助我們更加便捷野蝇,優(yōu)雅的調(diào)用HTTP API讼稚。
在spring cloud中,使用feign非常簡單绕沈,創(chuàng)建一個接口锐想,并在接口上添加一些注解,代碼就完成了乍狐。feign支持多種注解赠摇,例如feign自帶的注解或者JAX-RS注解等 。
spring cloud對feign進行了增強浅蚪,使feign支持了Spring MVC注解藕帜,并整合了Ribbon和Eureka
,從而讓Feign的使用更加便捷。

二惜傲、使用

添加依賴

        <!-- 包含了Ribbon 和 hystrix -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

編寫 接口
path 是請求控制器的路徑
name 是訪問服務的 application.name

// name=eureka里注冊的服務
@FeignClient(path = "test", name = "client-hyq-life-server")
public interface TestApi {


    @RequestMapping(value = "/idnex", method = RequestMethod.GET)
    String idnex();

}

編寫實現(xiàn)

@RestController
@RequestMapping("test")
public class TestController implements TestApi {

    @Autowired
    private TestServer testServer;

    @Override
    public String idnex(){
        return testServer.idnex();
    }

}

編寫調(diào)用

@RestController
@RequestMapping("/test")
public class TestController {

    @Autowired
    private TestApi testApi;

    @GetMapping("/index")
    public String index(){
        return testApi.idnex();
    }

}

如果兩個服務是分離的都需要給啟動類加

@EnableFeignClients
@SpringBootApplication
public class BffAppServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(BffAppServerApplication.class, args);
    }

}

三洽故、Feign對壓縮的支持

feign:
  # 不使用 openfeign 自帶的熔斷
  hystrix:
    enabled: false
  compression:
    #配置請求 GZIP 壓縮
    request:
      enabled: true
      #配置壓縮支持的 MIME TYPE
      mime-types: text/xml,application/xml,application/json
      #配置壓縮數(shù)據(jù)大小的最小閥值,只有超過了這個大小的請求才會對其進行壓縮。,默認 2048
      min-request-size: 300
    #配置響應 GZIP 壓縮
    response:
      enabled: true

四盗誊、feign 對OkHttp的支持

依賴

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-okhttp</artifactId>
        </dependency>

攔截日志时甚,這里建議做的有意義一些。

/**
 * @author big uncle
 * @date 2020/6/17 9:02
 * ok http 攔截日志
 **/
@Slf4j
public class OkHttpLogInterceptor implements Interceptor {

    @Override
    public Response intercept(Chain chain) throws IOException {
        log.debug("OkHttpUrl : " + chain.request().url());
        return chain.proceed(chain.request());
    }

}

配置

/**
 * @author big uncle
 * @date 2020/6/17 8:58
 **/
@Configuration
@ConditionalOnClass(Feign.class)
@AutoConfigureBefore(FeignAutoConfiguration.class)
public class FeignOkHttpConfig {

    @Bean
    public okhttp3.OkHttpClient okHttpClient(){
        return new okhttp3.OkHttpClient.Builder()
                // 讀取超時設(shè)置
                .readTimeout(60, TimeUnit.SECONDS)
                // 連接超時設(shè)置
                .connectTimeout(60, TimeUnit.SECONDS)
                //
                .writeTimeout(120, TimeUnit.SECONDS)
                .connectionPool(new ConnectionPool())
                .addInterceptor(okHttpLogInterceptor())
                // .addInterceptor();
                .build();
    }

    @Bean
    public OkHttpLogInterceptor okHttpLogInterceptor(){
        return new OkHttpLogInterceptor();
    }

}

配置出現(xiàn)問題哈踱,發(fā)現(xiàn)配置的時間一直不生效荒适,我讀取時間設(shè)置30秒,在攔截里面看只有1秒开镣,所以很多時候提示超時吻贿。
最后有個大神跟我說了,fegin 一直都是用的是 default 配置哑子,讓我在yml配置 connectTimeout舅列,readTimeout

feign:
  compression:
    # 請求壓縮
    request:
      enabled: true
      mime-types: "text/xml,application/xml,application/json"
      # 用于設(shè)置請求的最小閾值
      min-request-size: 1024
    # 響應壓縮
    response:
      enabled: true
  hystrix:
    enabled: false
  okhttp:
    enabled: true
  client:
    config:
      default:
        connectTimeout: 30000
        readTimeout: 40000

經(jīng)過發(fā)現(xiàn)的確可以做到肌割,在代碼里的配置優(yōu)先級居然沒有配置文件高,我個人覺得是有問題的帐要,忽然又想到那配置的池是否也是無用的把敞,待觀察。

五榨惠、日志

這里為了看每個請求的路徑奋早,參數(shù),耗時我們可以進行如下操作赠橙,loggerLevel:

feign:
  compression:
    # 請求壓縮
    request:
      enabled: true
      mime-types: "text/xml,application/xml,application/json"
      # 用于設(shè)置請求的最小閾值
      min-request-size: 1024
    # 響應壓縮
    response:
      enabled: true
  hystrix:
    enabled: false
  okhttp:
    enabled: true
  client:
    config:
      default:
        connectTimeout: 30000
        readTimeout: 40000
        # BASIC FULL HEADERS NONE
        loggerLevel: BASIC

BASIC 打印如下

2020-06-18 09:45:51.670 DEBUG 26772 --- [nio-8888-exec-1] com.giant.cloud.api.MenuApi              : [MenuApi#getSonDataMenuList] ---> POST http://server-data-platform/menu/getSonDataMenuList HTTP/1.1
2020-06-18 09:45:52.637 DEBUG 26772 --- [nio-8888-exec-1] com.giant.cloud.api.MenuApi              : [MenuApi#getSonDataMenuList] <--- HTTP/1.1 200  (966ms)
2020-06-18 09:45:52.767 DEBUG 26772 --- [nio-8888-exec-2] c.giant.cloud.api.ElectricityStationApi  : [ElectricityStationApi#getElectricityStationList] ---> POST http://server-data-platform/electricityStation/getElectricityStationList HTTP/1.1
2020-06-18 09:45:52.805 DEBUG 26772 --- [nio-8888-exec-2] c.giant.cloud.api.ElectricityStationApi  : [ElectricityStationApi#getElectricityStationList] <--- HTTP/1.1 200  (38ms)

FULL 打印如下

2020-06-18 09:54:05.190 DEBUG 29140 --- [nio-8888-exec-1] com.giant.cloud.api.MenuApi              : [MenuApi#getSonDataMenuList] ---> POST http://server-data-platform/menu/getSonDataMenuList HTTP/1.1
2020-06-18 09:54:05.191 DEBUG 29140 --- [nio-8888-exec-1] com.giant.cloud.api.MenuApi              : [MenuApi#getSonDataMenuList] Content-Length: 1733
2020-06-18 09:54:05.191 DEBUG 29140 --- [nio-8888-exec-1] com.giant.cloud.api.MenuApi              : [MenuApi#getSonDataMenuList] Content-Type: application/json
2020-06-18 09:54:05.191 DEBUG 29140 --- [nio-8888-exec-1] com.giant.cloud.api.MenuApi              : [MenuApi#getSonDataMenuList] 
2020-06-18 09:54:05.191 DEBUG 29140 --- [nio-8888-exec-1] com.giant.cloud.api.MenuApi              : [MenuApi#getSonDataMenuList] {"data":{"id":null,"parentId":null,"menuName":null,"menuPath":"/electricityStation/list","menuOrder":null,"icon":null,"remarks":null,"menuData":null,"menuButton":null},"token":"5a717dca1142d685c8aa54b45d0388c8","user":{"id":1,"account":"15771720565","name":"馮謙潤","phone":"15771720565","onlineState":null,"remarks":"fdsafdsa","rolesId":1,"avatar":null,"token":"5a717dca1142d685c8aa54b45d0388c8","roles":{"id":1,"roleName":"超級管理員","remarks":"2222","menus":null},"menus":[{"id":1,"parentId":0,"menuName":"大屏展示","menuPath":"/dashboard","menuOrder":1000,"icon":"el-icon-monitor","remarks":null,"menuData":false,"menuButton":false,"child":[]},{"id":2,"parentId":0,"menuName":"數(shù)據(jù)分析","menuPath":"/dataAnalysis","menuOrder":2000,"icon":"el-icon-data-line","remarks":null,"menuData":false,"menuButton":false,"child":[]},{"id":3,"parentId":0,"menuName":"系統(tǒng)管理","menuPath":"/setting","menuOrder":3000,"icon":"el-icon-setting","remarks":null,"menuData":false,"menuButton":false,"child":[{"id":5,"parentId":3,"menuName":"角色管理","menuPath":"/setting/roles","menuOrder":3200,"icon":null,"remarks":null,"menuData":false,"menuButton":false,"child":[]},{"id":6,"parentId":3,"menuName":"菜單管理","menuPath":"/setting/menus","menuOrder":3300,"icon":null,"remarks":null,"menuData":false,"menuButton":false,"child":[]}]},{"id":16,"parentId":0,"menuName":"電站管理","menuPath":"/electricityStation","menuOrder":4000,"icon":"el-icon-lightning","remarks":null,"menuData":false,"menuButton":false,"child":[{"id":17,"parentId":16,"menuName":"電站信息","menuPath":"/electricityStation/list","menuOrder":4100,"icon":null,"remarks":"列出所有電站","menuData":false,"menuButton":false,"child":[]}]}]}}
2020-06-18 09:54:05.191 DEBUG 29140 --- [nio-8888-exec-1] com.giant.cloud.api.MenuApi              : [MenuApi#getSonDataMenuList] ---> END HTTP (1733-byte body)
2020-06-18 09:54:06.014 DEBUG 29140 --- [nio-8888-exec-1] com.giant.cloud.api.MenuApi              : [MenuApi#getSonDataMenuList] <--- HTTP/1.1 200  (822ms)
2020-06-18 09:54:06.015 DEBUG 29140 --- [nio-8888-exec-1] com.giant.cloud.api.MenuApi              : [MenuApi#getSonDataMenuList] connection: keep-alive
2020-06-18 09:54:06.015 DEBUG 29140 --- [nio-8888-exec-1] com.giant.cloud.api.MenuApi              : [MenuApi#getSonDataMenuList] content-type: application/json
2020-06-18 09:54:06.015 DEBUG 29140 --- [nio-8888-exec-1] com.giant.cloud.api.MenuApi              : [MenuApi#getSonDataMenuList] date: Thu, 18 Jun 2020 01:54:05 GMT
2020-06-18 09:54:06.015 DEBUG 29140 --- [nio-8888-exec-1] com.giant.cloud.api.MenuApi              : [MenuApi#getSonDataMenuList] keep-alive: timeout=60
2020-06-18 09:54:06.015 DEBUG 29140 --- [nio-8888-exec-1] com.giant.cloud.api.MenuApi              : [MenuApi#getSonDataMenuList] transfer-encoding: chunked
2020-06-18 09:54:06.015 DEBUG 29140 --- [nio-8888-exec-1] com.giant.cloud.api.MenuApi              : [MenuApi#getSonDataMenuList] 
2020-06-18 09:54:06.017 DEBUG 29140 --- [nio-8888-exec-1] com.giant.cloud.api.MenuApi              : [MenuApi#getSonDataMenuList] {"code":200,"msg":null,"data":[{"id":24,"parentId":17,"menuName":"電站數(shù)據(jù)","menuPath":"/electricityStation/data","menuOrder":4110,"icon":null,"remarks":null,"menuData":true,"menuButton":false,"child":[{"id":25,"parentId":24,"menuName":"平頂山","menuPath":"/electricityStation/data/pds","menuOrder":4111,"icon":null,"remarks":null,"menuData":true,"menuButton":false,"child":[]}]}]}
2020-06-18 09:54:06.017 DEBUG 29140 --- [nio-8888-exec-1] com.giant.cloud.api.MenuApi              : [MenuApi#getSonDataMenuList] <--- END HTTP (388-byte body)
2020-06-18 09:54:06.453 DEBUG 29140 --- [nio-8888-exec-3] c.giant.cloud.api.ElectricityStationApi  : [ElectricityStationApi#getElectricityStationList] ---> POST http://server-data-platform/electricityStation/getElectricityStationList HTTP/1.1
2020-06-18 09:54:06.453 DEBUG 29140 --- [nio-8888-exec-3] c.giant.cloud.api.ElectricityStationApi  : [ElectricityStationApi#getElectricityStationList] Content-Length: 1756
2020-06-18 09:54:06.453 DEBUG 29140 --- [nio-8888-exec-3] c.giant.cloud.api.ElectricityStationApi  : [ElectricityStationApi#getElectricityStationList] Content-Type: application/json
2020-06-18 09:54:06.453 DEBUG 29140 --- [nio-8888-exec-3] c.giant.cloud.api.ElectricityStationApi  : [ElectricityStationApi#getElectricityStationList] 
2020-06-18 09:54:06.453 DEBUG 29140 --- [nio-8888-exec-3] c.giant.cloud.api.ElectricityStationApi  : [ElectricityStationApi#getElectricityStationList] {"data":{"data":{"id":null,"parentId":null,"menuName":null,"menuPath":null,"menuOrder":null,"icon":null,"remarks":null,"menuData":null,"menuButton":null,"menuId":"25"},"current":1,"size":20},"token":"5a717dca1142d685c8aa54b45d0388c8","user":{"id":1,"account":"15771720565","name":"馮謙潤","phone":"15771720565","onlineState":null,"remarks":"fdsafdsa","rolesId":1,"avatar":null,"token":"5a717dca1142d685c8aa54b45d0388c8","roles":{"id":1,"roleName":"超級管理員","remarks":"2222","menus":null},"menus":[{"id":1,"parentId":0,"menuName":"大屏展示","menuPath":"/dashboard","menuOrder":1000,"icon":"el-icon-monitor","remarks":null,"menuData":false,"menuButton":false,"child":[]},{"id":2,"parentId":0,"menuName":"數(shù)據(jù)分析","menuPath":"/dataAnalysis","menuOrder":2000,"icon":"el-icon-data-line","remarks":null,"menuData":false,"menuButton":false,"child":[]},{"id":3,"parentId":0,"menuName":"系統(tǒng)管理","menuPath":"/setting","menuOrder":3000,"icon":"el-icon-setting","remarks":null,"menuData":false,"menuButton":false,"child":[{"id":5,"parentId":3,"menuName":"角色管理","menuPath":"/setting/roles","menuOrder":3200,"icon":null,"remarks":null,"menuData":false,"menuButton":false,"child":[]},{"id":6,"parentId":3,"menuName":"菜單管理","menuPath":"/setting/menus","menuOrder":3300,"icon":null,"remarks":null,"menuData":false,"menuButton":false,"child":[]}]},{"id":16,"parentId":0,"menuName":"電站管理","menuPath":"/electricityStation","menuOrder":4000,"icon":"el-icon-lightning","remarks":null,"menuData":false,"menuButton":false,"child":[{"id":17,"parentId":16,"menuName":"電站信息","menuPath":"/electricityStation/list","menuOrder":4100,"icon":null,"remarks":"列出所有電站","menuData":false,"menuButton":false,"child":[]}]}]}}
2020-06-18 09:54:06.454 DEBUG 29140 --- [nio-8888-exec-3] c.giant.cloud.api.ElectricityStationApi  : [ElectricityStationApi#getElectricityStationList] ---> END HTTP (1756-byte body)
2020-06-18 09:54:06.483 DEBUG 29140 --- [nio-8888-exec-3] c.giant.cloud.api.ElectricityStationApi  : [ElectricityStationApi#getElectricityStationList] <--- HTTP/1.1 200  (29ms)
2020-06-18 09:54:06.484 DEBUG 29140 --- [nio-8888-exec-3] c.giant.cloud.api.ElectricityStationApi  : [ElectricityStationApi#getElectricityStationList] connection: keep-alive
2020-06-18 09:54:06.484 DEBUG 29140 --- [nio-8888-exec-3] c.giant.cloud.api.ElectricityStationApi  : [ElectricityStationApi#getElectricityStationList] content-type: application/json
2020-06-18 09:54:06.484 DEBUG 29140 --- [nio-8888-exec-3] c.giant.cloud.api.ElectricityStationApi  : [ElectricityStationApi#getElectricityStationList] date: Thu, 18 Jun 2020 01:54:05 GMT
2020-06-18 09:54:06.484 DEBUG 29140 --- [nio-8888-exec-3] c.giant.cloud.api.ElectricityStationApi  : [ElectricityStationApi#getElectricityStationList] keep-alive: timeout=60
2020-06-18 09:54:06.484 DEBUG 29140 --- [nio-8888-exec-3] c.giant.cloud.api.ElectricityStationApi  : [ElectricityStationApi#getElectricityStationList] transfer-encoding: chunked
2020-06-18 09:54:06.484 DEBUG 29140 --- [nio-8888-exec-3] c.giant.cloud.api.ElectricityStationApi  : [ElectricityStationApi#getElectricityStationList] 
2020-06-18 09:54:06.484 DEBUG 29140 --- [nio-8888-exec-3] c.giant.cloud.api.ElectricityStationApi  : [ElectricityStationApi#getElectricityStationList] {"code":200,"msg":null,"data":{"current":1,"size":20,"total":1,"records":[{"createTime":"2020-06-15T03:46:17.000+00:00","updateTime":"2020-06-15T03:46:17.000+00:00","deleteFlag":false,"id":1,"menuId":25,"name":"平頂山新能源項目1期","buildingDegree":30,"cityName":"平頂山","cityId":"410400","lng":"113.308","lat":"33.7352","remarks":"測試數(shù)據(jù)"}]}}
2020-06-18 09:54:06.484 DEBUG 29140 --- [nio-8888-exec-3] c.giant.cloud.api.ElectricityStationApi  : [ElectricityStationApi#getElectricityStationList] <--- END HTTP (362-byte body)

我就試到這里了耽装,正常來說 FULL 已經(jīng)足夠了。

六期揪、Feign的全局異常處理

@Configuration
public class FeignClientErrorDecoder implements ErrorDecoder {

    private static final Log log = LogFactory.getLog(FeignClientErrorDecoder.class);

    @Override
    public Exception decode(String methodKey, Response response) {
        try {
            String body = IoUtil.read(response.body().asInputStream(), "utf-8");
            Map<String,String> errMap = JSONObject.parseObject(body, HashMap.class);
            return new InternalException(errMap.get("message"));
        }catch(Exception e){
            return new InternalException(e.getMessage());
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末掉奄,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子凤薛,更是在濱河造成了極大的恐慌姓建,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缤苫,死亡現(xiàn)場離奇詭異速兔,居然都是意外死亡,警方通過查閱死者的電腦和手機活玲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門涣狗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人舒憾,你說我怎么就攤上這事镀钓。” “怎么了珍剑?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長死陆。 經(jīng)常有香客問我招拙,道長,這世上最難降的妖魔是什么措译? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任别凤,我火速辦了婚禮,結(jié)果婚禮上领虹,老公的妹妹穿的比我還像新娘规哪。我一直安慰自己,他們只是感情好塌衰,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布诉稍。 她就那樣靜靜地躺著蝠嘉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪杯巨。 梳的紋絲不亂的頭發(fā)上蚤告,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天,我揣著相機與錄音服爷,去河邊找鬼杜恰。 笑死,一個胖子當著我的面吹牛仍源,可吹牛的內(nèi)容都是我干的心褐。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼笼踩,長吁一口氣:“原來是場噩夢啊……” “哼逗爹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起戳表,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤桶至,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后匾旭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體镣屹,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年价涝,在試婚紗的時候發(fā)現(xiàn)自己被綠了女蜈。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡色瘩,死狀恐怖伪窖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情居兆,我是刑警寧澤覆山,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站泥栖,受9級特大地震影響簇宽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吧享,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一魏割、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧钢颂,春花似錦钞它、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尼桶。三九已至,卻和暖如春耻卡,著一層夾襖步出監(jiān)牢的瞬間疯汁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工卵酪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留幌蚊,地道東北人。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓溃卡,卻偏偏與公主長得像溢豆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子瘸羡,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容