spring cloud 之 Feign 使用HTTP請求遠程服務

来源:http://www.cnblogs.com/jalja/archive/2017/06/14/7011439.html
-Advertisement-
Play Games

開發人員使用Jersey和CXF等工具可以方便地編寫java client,從而提供REST或SOAP服務;開發人員也可以基於Apache HC等http傳輸工具包編寫自己的java http client;而Feign的關註點在於簡化開發人員使用工具包的複雜度,以最少的代碼編寫代碼從而提供java... ...


一、Feign 簡介

在spring Cloud Netflix棧中,各個微服務都是以HTTP介面的形式暴露自身服務的,因此在調用遠程服務時就必須使用HTTP客戶端。我們可以使用JDK原生的URLConnection、Apache的Http Client、Netty的非同步HTTP Client, Spring的RestTemplate。但是,用起來最方便、最優雅的還是要屬Feign了。

Feign是一種聲明式、模板化的HTTP客戶端。在Spring Cloud中使用Feign, 我們可以做到使用HTTP請求遠程服務時能與調用本地方法一樣的編碼體驗,開發者完全感知不到這是遠程方法,更感知不到這是個HTTP請求。

二、feign的使用在spring cloud中的使用

1、添加依賴

      <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
       </dependency>

2、創建FeignClient  

@FeignClient(name="SPRING-PRODUCER-SERVER/spring")
public interface FeignUserClient {
  @RequestMapping( value = "/findAll/{name}",method = RequestMethod.GET)
  public List<SpringUser> findAll(@PathVariable("name") String name);
  
  @RequestMapping( value = "/findUserPost",method = RequestMethod.POST)
  public SpringUser findUserPost(@RequestBody SpringUser springUser);//複合類型好像預設是POST請求
}
  • @FeignClient(name="SPRING-PRODUCER-SERVER/spring"):用於通知Feign組件對該介面進行代理(不需要編寫介面實現),name屬性指定我們要調用哪個服務。使用者可直接通過@Autowired註入。
  • @RequestMapping表示在調用該方法時需要向/group/{groupId}發送GET請求。
  • @PathVariable與SpringMVC中對應註解含義相同。

原理:Spring Cloud應用在啟動時,Feign會掃描標有@FeignClient註解的介面,生成代理,並註冊到Spring容器中。生成代理時Feign會為每個介面方法創建一個RequetTemplate對象,該對象封裝了HTTP請求需要的全部信息,請求參數名、請求方法等信息都是在這個過程中確定的,Feign的模板化就體現在這裡。

3、啟動類上添加註解

@Configuration
@ComponentScan
@EnableAutoConfiguration
@EnableEurekaClient
@EnableFeignClients
public class SpringConsumerServerFeignApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringConsumerServerFeignApplication.class, args);
    }
}

4、配置文件 application.yml

spring:
 application:
  name: spring-consumer-server-feign
server: 
 port: 8084
 context-path: /spring
#服務註冊中心的配置內容,指定服務註冊中心的位置
eureka:
 client:
  serviceUrl:
   defaultZone: http://user:password@localhost:8761/eureka/

三、自定義Feign的 配置

1、自定義Configuration

@Configuration
public class FooConfiguration {
    @Bean
    public Contract feignContract() {
        //這將SpringMvc Contract 替換為feign.Contract.Default
        return new feign.Contract.Default();
    }
}

2、使用自定義的Configuration

@FeignClient(name="SPRING-PRODUCER-SERVER/spring",configuration=FooConfiguration.class)
public interface FeignUserClient {
    @RequestLine("GET /findAll/{name}")
    public List<SpringUser> findAll(@Param("name") String name);    
 /* @RequestMapping( value = "/findAll/{name}",method = RequestMethod.GET)
  public List<SpringUser> findAll(@PathVariable("name") String name);
  
  @RequestMapping( value = "/findUserPost",method = RequestMethod.POST)
  public SpringUser findUserPost(@RequestBody SpringUser springUser);*/
}
@RequestLine:是feign的註解

四、Feign日誌的配置
為每個創建的Feign客戶端創建一個記錄器。預設情況下,記錄器的名稱是用於創建Feign客戶端的介面的完整類名。Feign日誌記錄僅響應DEBUG級別。logging.level.project.user.UserClient: DEBUG
在配置文件application.yml 中加入:
logging:
 level:
  com.jalja.org.spring.simple.dao.FeignUserClient: DEBUG 

在自定義的Configuration的類中添加日誌級別

@Configuration
public class FooConfiguration {
   /* @Bean
    public Contract feignContract() {
        //這將SpringMvc Contract 替換為feign.Contract.Default
        return new feign.Contract.Default();
    }*/
    @Bean
    Logger.Level feignLoggerLevel() {
        //設置日誌
        return Logger.Level.FULL;
    }
}

PS:Feign請求超時問題

Hystrix預設的超時時間是1秒,如果超過這個時間尚未響應,將會進入fallback代碼。而首次請求往往會比較慢(因為Spring的懶載入機制,要實例化一些類),這個響應時間可能就大於1秒了
解決方案有三種,以feign為例。
方法一
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 5000
該配置是讓Hystrix的超時時間改為5秒
方法二
hystrix.command.default.execution.timeout.enabled: false
該配置,用於禁用Hystrix的超時時間
方法三
feign.hystrix.enabled: false
該配置,用於索性禁用feign的hystrix。該做法除非一些特殊場景,不推薦使用。




您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近想學習一些python數據分析的內容,就弄了個爬蟲爬取了一些數據,並打算用Anaconda一套的工具(pandas, numpy, scipy, matplotlib, jupyter)等進行一些初步的數據挖掘和分析。 在使用matplotlib畫圖時,橫坐標為中文,但是畫出的條形圖橫坐標總是顯 ...
  • Java反射機制 前言 更多文章請一步本人博客 "https://chenjiabing666.github.io/" "網頁版的jdk的API" "離線版API" 什麼是反射機制 反射是java語言的一個特性,它允程式在運行時(註意不是編譯的時候)來進行自我檢查並且對內部的成員進行操作。例如它允許 ...
  • 封裝:是指隱藏對象的屬性和實現細節,僅對外提供公共訪問方法。 好處: 1.隱藏實現細節,提供公共的訪問方式。 2.提高了代碼的復用性。 3.提高了安全性。 封裝原則: 1.將不需要對外提供的內容都隱藏起來。 2.把屬性隱藏,提供公共方法對其訪問。 this:是當前類的對象引用。即:它就代表當前類的一 ...
  • JAVA WEB 亂碼問題解析 亂碼原因 在Java Web開發過程中,經常遇到亂碼的問題,造成亂碼的原因,概括起來就是對字元編碼和解碼的方式不匹配。 既然亂碼的原因是字元編碼與解碼的方式不匹配,那麼為什麼我們一定要對字元進行編碼,不編碼可不可以呢?這是因為在電腦中存儲數據的基本單位是1個位元組,即 ...
  • 介面 (1)當抽象類中的方法都是抽象的時候,java就提供了一種新的表現形式:介面 ,介面是功能的集合 介面不能創建對象 (2)格式 父介面:public interface Tnter{ } 子類:public class interImp implements Itner{ } 介面的使用 1. ...
  • 1. os.path.driname(path):返迴路徑的上一級路徑字元串。 >>> os.path.dirname('D:\Games') 'D:\\' >>> 2. os.path.basename(path):返迴路徑的最後一級目錄名(文件夾名)或文件名(全稱)。 >>> os.path.b ...
  • 早在去年八月份PowerShell就開始開源跨平臺了,但是一直沒有去嘗試,叫做PowerShell Core。 這裡打算簡單介紹一下如何安裝和簡單使用,為還不知道PowerShell Core on Ubuntu的同學們提供一點小小的入門幫助,謝謝大家支持~ PowerShell Core是由Mic ...
  • 匿名對象:就是沒有名字的對象 new student(); 匿名對象的應用場景: 1.僅僅調用一次對象中的方法 註意:調用多次的時候,不合適 匿名對象調用方法有什麼方法? 匿名對象調用完畢就是垃圾,可以被垃圾回收期回收。 2.匿名對象可以作為實際參數傳遞。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...