最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于Feign的覆寫默認(rèn)配置和Feign的日志

 更新時間:2022年06月16日 10:31:16   作者:劉先森駕到  
這篇文章主要介紹了關(guān)于Feign的覆寫默認(rèn)配置和Feign的日志方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Feign的覆寫默認(rèn)配置

A central concept in Spring Cloud’s Feign support is that of the named client. Each feign client is part of an ensemble of components that work together to contact a remote server on demand, and the ensemble has a name that you give it as an application developer using the @FeignClient annotation. Spring Cloud creates a new ensemble as anApplicationContext on demand for each named client using FeignClientsConfiguration. This contains (amongst other things) an feign.Decoder, a feign.Encoder, and a feign.Contract.

上面是官網(wǎng)的API文檔中的說明,如下是我的翻譯:

Spring Cloud的Feign支持的一個中心概念是命名客戶端。

每個feign client是整體的一部分,它們一起工作以按需聯(lián)系遠(yuǎn)程服務(wù)器,并且該整體具有一個名稱,開發(fā)人員可以使用@FeignClient將其命名。

Spring Cloud根據(jù)需要使用FeignClientsConfiguration為每個命名的客戶端創(chuàng)建一個新的整體作為ApplicationContext。

這包含(其他)feign.Decoder,feign.Encoder和feign.Contract。

Spring Cloud lets you take full control of the feign client by declaring additional configuration (on top of theFeignClientsConfiguration) using @FeignClient. Example:

@FeignClient(name = “stores”, configuration = FooConfiguration.class)
public interface StoreClient {
//..
}

上面文檔說,通過使用額外的配置@FeignClient注解,可以使Spring Cloud讓你完全的控制feign客戶端。

并且官網(wǎng)還給出了例子,那么我們也按照它提供的例子來在我們的工程師運用起來。

將接口類UserFeignClient進(jìn)行修改,如下修改后的代碼:

@FeignClient(name = "microservice-provider-user", configuration = FooConfiguration.class)
public interface UserFeignClient {
? ? /**
? ? ?* 注意:要使用Feign的注解
? ? ?* <p>
? ? ?* <code>@RequestLine("GET /repos/{owner}/{repo}/contributors")</code>
? ? ?* <br>
? ? ?* <code>List<Contributor> contributors(@Param("owner") String owner, @Param("repo") String repo);</code>
? ? ?*?
? ? ?* @param id
? ? ?* @return
? ? ?*/
? ? @RequestMapping(method = RequestMethod.GET, value = "/simple/{id}")
// ?@RequestLine("GET /simple/{id}")
? ? public User findById(@PathVariable("id") Long id);
}

在配置FeignClient的configuration指定的值FooConfiguration,這個類是不存在的,這里我們需要新建,官網(wǎng)中也給我創(chuàng)建了這個類的代碼,下面是我根據(jù)官網(wǎng)的代碼和我實際需求修改后的:

@Configuration
public class FooConfiguration {
? ? @Bean
? ? public Contract feignContract() {
? ? ? ? return new feign.Contract.Default();
? ? }
}

完成之后,可以開始啟動工程了,當(dāng)我們在啟動時,會報錯,錯誤關(guān)鍵如下:

Caused by: java.lang.IllegalStateException: Method findById not annotated with HTTP method type (ex. GET, POST)

這里錯誤是說我們沒有使用Http方法的注解導(dǎo)致的,但我們仔細(xì)檢查下代碼,我們使用的是@RequestMapping的注解方式,這里我也不知道怎么解釋,可能是我沒有深刻的理解吧,看了Feign 的GitHub的相關(guān)代碼后,我發(fā)現(xiàn)了另一種注解方式:

interface GitHub {
? @RequestLine("GET /repos/{owner}/{repo}/contributors")
? List<Contributor> contributors(@Param("owner") String owner, @Param("repo") String repo);
}

好的,現(xiàn)在將@RequestMapping注解改成@RequestLine,以及參數(shù)也修改成@Param,修改后:

@FeignClient(name = "microservice-provider-user", configuration = FooConfiguration.class)
public interface UserFeignClient {
? ? /**
? ? ?* 注意:要使用Feign的注解
? ? ?* <p>
? ? ?* <code>@RequestLine("GET /repos/{owner}/{repo}/contributors")</code>
? ? ?* <br>
? ? ?* <code>List<Contributor> contributors(@Param("owner") String owner, @Param("repo") String repo);</code>
? ? ?*?
? ? ?* @param id
? ? ?* @return
? ? ?*/
? ? @RequestLine("GET /simple/{id}")
? ? public User findById(@Param("id") Long id);
}

修改完成之后,再次重啟服務(wù),發(fā)現(xiàn)啟動成功,而且可以訪問接口了。

WARNING Previously, using the url attribute, did not require the name attribute. Using name is now required.

官網(wǎng)中有個這樣的提醒:以前在使用URL屬性時,不必要使用那么屬性,但是在現(xiàn)在Feign中name屬性就是必要的了。

它也給了例子,如下面代碼:

@FeignClient(name = "${feign.name}", url = "${feign.url}")
public interface StoreClient {
? ? //..
}

現(xiàn)在我們也來在我們的工程中實際運用一下。

新建一個接口FeignClient2,代碼如下:

@FeignClient(name = "xxx", url = "http://localhost:8761/", configuration = BeanConfiguration.class)
public interface FeignClient2 {
// ?@RequestMapping(value = "/eureka/apps/{serviceName}")
? ? @RequestLine("GET /eureka/apps/{serviceName}")
? ? public String findServiceInfoEurekaByServieName(@Param("serviceName") String serviceName);
}

我們通過這個feign來獲取eureka server下注冊的實例信息,通過@FeignClient注解配置了name、url和configuration屬性,這里那么我隨便寫的內(nèi)容,因為這個僅僅表示這個feign的名稱而已,url配置的是eureka server的地址,configuration我們這里配的一個需要新建的類BeanConfiguration。

大家肯定還有疑惑,這個BeanConfiguration類配置了是起什么作用的了?

好的,這里就為大家答疑解惑,首先貼出該類的代碼:

@Configuration
public class BeanConfiguration {
? ? @Bean
? ? public BasicAuthRequestInterceptor basicAuthRequestInterceptor() {
? ? ? ? return new BasicAuthRequestInterceptor("micheal", "123456");
? ? }
}

看到代碼,也許大家可能就明白了,這個在請求時不需要輸入用戶名和密碼就可以直接調(diào)用Eureka Server,因為Feign通過這個配置的configuration類為我們做了用戶名和密碼的權(quán)限認(rèn)證了。

完成上面的內(nèi)容了,接下來就是見證奇跡的時刻了。

啟動服務(wù),在Eureka Server中查看到注冊成功了,我們就可以通過瀏覽器進(jìn)行查看了。

Feign Logging 日志

A logger is created for each Feign client created. By default the name of the logger is the full class name of the interface used to create the Feign client. Feign logging only responds to the DEBUG level.

application.yml
logging.level.project.user.UserClient: DEBUG

官網(wǎng)API說:為每個Feign 客戶端創(chuàng)建日志,日志的默認(rèn)名稱為所創(chuàng)建的Feign客戶端接口類的整個類名。Feign的日志僅僅只有在DEBUG級別時才會響應(yīng)。

官網(wǎng)給我們提供了例子,按照官網(wǎng)提供的做法,現(xiàn)在來為我們對的工程配置Feign Logging。

以我們microservice-consumer-movie-feign-customizing工程為例,在配置文件application.yml進(jìn)行Feign 日志配置,如下配置:

logging:
? level:
? ? com.spring.cloud.feign.UserFeignClient: DEBUG

com.spring.cloud.feign.UserFeignClient 是Feign Client接口類的完成類名。好了,完成了這個配置,是不是有點超激動想要一看是否真的能打印出日志了。

先不著急,我們接著查看官網(wǎng)API文檔中的內(nèi)容:

The Logger.Level object that you may configure per client, tells Feign how much to log. Choices are:

• NONE, No logging (DEFAULT).

• BASIC, Log only the request method and URL and the response status code and execution time.

• HEADERS, Log the basic information along with request and response headers.

• FULL, Log the headers, body, and metadata for both requests and responses.

For example, the following would set the Logger.Level to FULL:

@Configuration
public class FooConfiguration {
? ? @Bean
? ? Logger.Level feignLoggerLevel() {
? ? ? ? return Logger.Level.FULL;
? ? }
}

官網(wǎng)給我們提供了一些日志級別的等級,這里就不一一翻譯了。我們的重點是在上面所給的例子,上面例子說為日志設(shè)置為FULL級別的日志。

好,開始我們的配置,找到我們所配Feign 日志的客戶端接口類,我們發(fā)現(xiàn)我們配值得configuration的類時FooConfiguration類,好我們將官網(wǎng)中的feignLoggerLevel方法添加到我們的FooConfiguration類中。

完成之后,我們啟動工程,并先將日志清掉,再重新請求接口,發(fā)現(xiàn)確實打印出日志來了。

這里還需要補(bǔ)充一下:在配置文件application.yml中配置了Feign客戶端日志之后,如果不在configuration類中添加日志級別的話,是不會打印出日志的。因為在官網(wǎng)API中有提到“NONE, no loggin(DEFAULT)”,就是說默認(rèn)日志級別時NONE的。

Feign進(jìn)行日志配置

在微服務(wù)項目中項目啟動遇到 bug 時,很多方面的錯誤都有可能出現(xiàn),比如參數(shù)錯誤,接口調(diào)用錯誤等,或者是想了解服務(wù)接口的使用量和性能。

首先 Feign 支持自定義日志的配置,配置 Feign 的日志信息是針對以上情況效率很高的一種解決方案。

Feign有四種類型的日志

  • NONE:不記錄任何日志信息,默認(rèn)是 NONE 配置。
  • BASIC:只記錄發(fā)起請求的方法,請求的 URL 地址,請求狀態(tài)碼和請求的響應(yīng)時間。
  • HEADERS:在 BASIC 級別的基礎(chǔ)上,還多記錄了請求頭和響應(yīng)頭的信息。
  • FULL:記錄所有的日志信息,包括請求和響應(yīng)的所有具體信息。

列出兩種在項目中配置Feign日志的方法

一:在配置文件中配置 Feign 的日志

feign:
? client:
? ? config:
? ? ? default: # 這里用default就是全局配置,如果是寫服務(wù)名稱,則是針對某個微服務(wù)的配置
? ? ? ? loggerLevel: FULL # ?日志級別

其中 default 表示全局配置日志,將 default 改為具體的服務(wù)名稱,表示在調(diào)用這個服務(wù)的時候才會記錄日志。

loggerLevel 表示日志的水平,包含 NONE、BASIC、HEADERS、FULL 四種級別的日志。

二:通過配置類的方式

聲明一個類,取名為 FeignLoggerConfiguration。在類中聲明一個 Logger.Level 對象并返回日志級別,這里設(shè)置級別為 BASIC ,通過 @Bean 注解將該方法設(shè)置為 IOC 容器的組件。

public class FeignLevelConfiguration {
? ? @Bean
? ? public Logger.Level logLevel(){
? ? ? ? return Logger.Level.BASIC;
? ? }
}

同樣的可以設(shè)置全局配置和局部給某個服務(wù)配置。

全局配置:

在啟動類的 @EnableFeignClients 注解中加上參數(shù)

defaultConfiguration = FeignLoggerConfiguration .class

這里的 FeignLoggerConfiguration.class要和配置的日志類一致。

局部配置:

在配置了 Feign 的服務(wù)接口上的注解 @FeignClient("要調(diào)用的服務(wù)名稱") 加上參數(shù)

configuration = FeignLoggerConfiguration .class

這里設(shè)置調(diào)用的服務(wù)名稱為 testservice ,則注解改為

@FeignClient(value = "testservice", configuration = FeignLoggerConfiguration .class)?

這里的 FeignLoggerConfiguration.class 就是上面的日志配置類。

同時,在優(yōu)化 Feign 時可以從日志的級別入手,日志盡量使用 Basic 級別,因為打印日志太多會消耗 Feign 的性能。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 使用IDEA打jar包的詳細(xì)圖文教程

    使用IDEA打jar包的詳細(xì)圖文教程

    JAR文件是一種壓縮文件,與常見的ZIP壓縮文件兼容,被稱為JAR包,下面這篇文章主要給大家介紹了關(guān)于使用IDEA打jar包的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • Java實現(xiàn)兩人五子棋游戲(二) 畫出棋盤

    Java實現(xiàn)兩人五子棋游戲(二) 畫出棋盤

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)兩人五子棋游戲,畫出五子棋的棋盤,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • java自定義日志輸出文件(log4j日志文件輸出多個自定義日志文件)

    java自定義日志輸出文件(log4j日志文件輸出多個自定義日志文件)

    打印日志的在程序中是必不可少的,如果需要將不同的日志打印到不同的地方,則需要定義不同的Appender,然后定義每一個Appender的日志級別、打印形式和日志的輸出路徑,下面看一個示例吧
    2014-01-01
  • 最新hadoop安裝教程及hadoop的命令使用(親測可用)

    最新hadoop安裝教程及hadoop的命令使用(親測可用)

    這篇文章主要介紹了最新hadoop安裝教程(親測可用),本文主要講解了如何安裝hadoop、使用hadoop的命令及遇到的問題解決,需要的朋友可以參考下
    2022-06-06
  • shiro 與 SpringMVC的整合完美示例

    shiro 與 SpringMVC的整合完美示例

    shiro可以直接和spring整合,但是這樣需要單獨配置spring用于整合shiro,在配置springmvc,接下來通過實例代碼給大家介紹shiro 整合 SpringMVC 的方法,感興趣的朋友一起看看吧
    2021-08-08
  • 基于feign傳參MultipartFile問題解決

    基于feign傳參MultipartFile問題解決

    這篇文章主要介紹了基于feign傳參MultipartFile問題解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 強(qiáng)烈推薦MyBatis?三種批量插入方式的比較

    強(qiáng)烈推薦MyBatis?三種批量插入方式的比較

    這篇文章主要介紹了強(qiáng)烈推薦MyBatis?三種批量插入方式的比較,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-07-07
  • 詳解Java快速上手用戶后臺管理系統(tǒng)

    詳解Java快速上手用戶后臺管理系統(tǒng)

    只有在實戰(zhàn)中練習(xí)才能真正獲得能力的提升,本篇文章手把手帶你用Java快速上手實現(xiàn)一個用戶后臺管理系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平
    2022-01-01
  • Spring Data JPA中的動態(tài)查詢實例

    Spring Data JPA中的動態(tài)查詢實例

    本篇文章主要介紹了詳解Spring Data JPA中的動態(tài)查詢。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • 詳解Java實現(xiàn)LRU緩存

    詳解Java實現(xiàn)LRU緩存

    這篇文章主要介紹了詳解Java實現(xiàn)LRU緩存,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08

最新評論

岑巩县| 孝义市| 嫩江县| 长寿区| 堆龙德庆县| 邵阳市| 富源县| 吉安市| 绵竹市| 龙州县| 会理县| 册亨县| 修武县| 施甸县| 沙坪坝区| 苏尼特右旗| 德庆县| 阳新县| 普宁市| 于都县| 独山县| 宁波市| 台湾省| 宜良县| 和田县| 抚顺县| 沂水县| 资源县| 平昌县| 长沙市| 贺州市| 石渠县| 那曲县| 游戏| 伽师县| 彭州市| 普宁市| 交口县| 工布江达县| 南丰县| 凉山|