成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Spring Cloud 遠程調用 OpenFeign 這些知識點,能顛覆你的認知!

開發 前端
實現的原理也比較簡單就是:向容器中注冊了一個OptionsFactoryBean類型的bean且該Bean的作用域范圍是refresh。當我們調用/refresh endpoint后就會刷新該Bean的配置信息。

環境:SpringBoot2.7.12 + Spring Cloud2021.0.7

1. 概述

Spring Cloud Openfeign是一種聲明式、模板化的HTTP客戶端,主要用于在Spring Cloud微服務架構中進行服務調用。

相比于傳統的RestTemplate,Openfeign更加簡潔,開發者只需通過編寫一個接口并添加注解進行配置,即可實現對服務提供方接口的綁定,而無需手動構造請求和解析返回數據。

Openfeign的應用,讓Spring Cloud微服務調用變得更加便捷。在服務消費者中,只需通過接口方法即可進行遠程服務調用,就像調用本地方法一樣簡單。此外,Feign還集成了LoadBalancer,利用LoadBalancer維護服務提供方列表,實現輪詢調用服務提供者。

使用Spring Cloud Openfeign,開發者可以更加專注于業務邏輯而不是底層的HTTP請求,提高了開發效率和代碼可讀性。同時,Openfeign還支持自定義配置和擴展,可以滿足不同場景下的需求。總之,Spring Cloud Openfeign是Spring Cloud微服務架構中不可或缺的一部分,可以幫助開發者更加高效地進行服務調用。

2. 準備環境

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
</dependency>

開啟openfeign功能

@SpringBootApplication
@EnableFeignClients
public class SpringCloudComprehensiveApplication {
}

feign客戶端

@FeignClient(
    url = "http://localhost:8088/demos", 
    name = "demoService"
)
public interface DemoFeign {


  @GetMapping("/info/{id}")
  public Object info(@PathVariable("id") Integer id) ;
  
}

以上DemoFeign就能被正確的使用了。接下來看看下面的那些知識點你是知道的

3. 知識盲區

盲區1:超時時間

默認情況下feign調用超時時間如下:

/**
 * 默認超時時間
 * <ul>
 * <li>Connect Timeout: 10 seconds</li>
 * <li>Read Timeout: 60 seconds</li>
 * <li>Follow all 3xx redirects</li>
 * </ul>
 */
public Options() {
  this(10, TimeUnit.SECONDS, 60, TimeUnit.SECONDS, true);
}

定義

public class FeignClientFactoryBean {
  // 讀超時時間
  private int readTimeoutMillis = new Request.Options().readTimeoutMillis();
  // 連接超時時間
  private int connectTimeoutMillis = new Request.Options().connectTimeoutMillis();
}

編程方式自定義:你只需要提供Request.Options類型的Bean即可。

配置定義

#全局定義
feign.client.config.default.connect-timeout=3000
feign.client.config.default.read-timeout=3000
#具體服務定義
feign.client.config.demoService.connect-timeout=2000
feign.client.config.demoService.read-timeout=2000

盲區2:重試

feign的重試相信很多人都沒有玩過對吧?

如果feign沒有啟用斷路器功能(feign.circuitbreaker.enabled, 默認值為false),那么會開啟retryer(重試)功能;默認情況openfeign提供了如下配置:

@Bean
@Scope("prototype")
@ConditionalOnMissingBean
public Feign.Builder feignBuilder(Retryer retryer) {
  return Feign.builder().retryer(retryer);
}
// 默認還是個不支持重試的,所以我們需要自定義重試Bean
@Bean
@ConditionalOnMissingBean
public Retryer feignRetryer() {
  return Retryer.NEVER_RETRY;
}

自定義重試bean

@Bean
public Retryer feignRetryer() {
  Retryer.Default retryer = new Retryer.Default(100, SECONDS.toMillis(1), 2);
  return retryer ;
}

這樣如果當前環境沒有cricuitbreaker,那么這里的重試就能生效了。

盲區3:服務降級

通常定義了feign客戶端后,我們都會定義相應的降級服務,fallback或fallbackFactory,如果這兩個都配置了那誰才會生效呢?源碼如下:

class FeignCircuitBreakerTargeter implements Targeter {
  public <T> T target(FeignClientFactoryBean factory, Feign.Builder feign, FeignContext context,
      Target.HardCodedTarget<T> target) {
    // ...
    FeignCircuitBreaker.Builder builder = (FeignCircuitBreaker.Builder) feign;
    String name = !StringUtils.hasText(factory.getContextId()) ? factory.getName() : factory.getContextId();
    // 先判斷了fallback屬性,如果不是void,那么直接返回了
    Class<?> fallback = factory.getFallback();
    if (fallback != void.class) {
      return targetWithFallback(name, context, target, builder, fallback);
    }
    Class<?> fallbackFactory = factory.getFallbackFactory();
    if (fallbackFactory != void.class) {
      return targetWithFallbackFactory(name, context, target, builder, fallbackFactory);
    }
    return builder(name, builder).target(target);
  }
}

盲區4:primary屬性

在@FeignClient注解中有個primary屬性,你知道這個屬性有什么用嗎?

默認每一個feign客戶端都被注冊為bean,并且每個bean都相當于使用了@Primary注解修飾一樣,任何地方注入都是有限注入的該bean。它的用處還得從fallback屬性說起。如果定義了feign客戶端后對應的fallback是需要實現當前這個feign接口的,且還的注冊為bean對象。那么如果把這里的primary設置為false后,容器中此時可是存在兩個DemoFeign類型的bean的,這時候容器啟動就會報錯了。所以這里默認就吧feign客戶端的primary設置為true就是解決這個問題的。示例如下:

@FeignClient(
    url = "http://localhost:8088/demos", 
    name = "demoService", 
    fallback = DemoFeignFallback.class
    primary = true // 默認即為true
)
public interface DemoFeign {}


@Component
public class DemoFeignFallback implements DemoFeign {
}

盲區5:動態刷新超時時間

盲區1中已經提到了超時時間問題,那都是寫靜態配置,那能不能動態配置呢?可以,完全可以,你只需下面這樣操作即可

#開啟刷新配置
feign.client.refresh-enabled=true

實現的原理也比較簡單就是:向容器中注冊了一個OptionsFactoryBean類型的bean且該Bean的作用域范圍是refresh。當我們調用/refresh endpoint后就會刷新該Bean的配置信息。

先就列出上面5個知識點吧,看看你知道幾個?

完畢!??!

責任編輯:武曉燕 來源: Spring全家桶實戰案例源碼
相關推薦

2023-02-15 08:12:19

http超時過濾器

2019-11-25 21:46:12

數據湖云計算數據倉庫

2023-07-13 09:01:39

Bean接口容器

2024-02-26 08:19:00

WebSpring容器

2016-05-30 17:31:34

Spring框架

2021-05-17 06:02:58

Css前端CSS 特效

2021-04-27 22:27:19

手機安卓蘋果

2019-10-24 09:09:28

MySQLACIDJava

2018-01-29 15:23:14

網絡知識點軟件測試

2023-03-02 11:52:00

自定義自動配置

2020-02-18 08:01:55

在家辦公Kakfa知識點大全

2023-09-27 18:02:31

2024-06-28 09:37:14

技巧.NET開發

2009-08-05 09:22:43

C#調用VC DLL

2021-04-13 08:25:12

測試開發Java注解Spring

2022-08-18 09:51:50

Python代碼循環

2022-05-24 14:07:53

OpenFeignSpring開源

2013-10-17 15:30:04

方法調用object

2019-04-24 16:40:18

Redis數據庫

2020-08-04 14:00:17

分庫分表數據庫MySQL
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧洲成人免费视频 | 亚洲欧美国产毛片在线 | 夜夜操天天艹 | 欧美日韩电影一区二区 | 爱爱免费视频网站 | 最新国产精品精品视频 | 国产精品视频中文字幕 | 亚洲精品国产成人 | 水蜜桃久久夜色精品一区 | 日本中文字幕在线观看 | 日韩视频a| 爱爱免费视频 | 免费国产一区二区视频 | 午夜免费福利片 | 成人夜晚看av| 欧美人成在线视频 | www.蜜桃av| 久久精品亚洲一区二区三区浴池 | 日韩成人在线电影 | 日本高清不卡视频 | 91久久| 国产黄色免费网站 | 久久精品av | 成人一区二区在线 | 久久国产精品一区 | 亚洲免费网 | www.97国产| 午夜小视频免费观看 | 精品福利一区二区三区 | 欧美精品久久久 | 91中文字幕在线 | www日韩| 一区二区三区精品视频 | 欧美精品网站 | 91久久伊人 | 日韩在线综合网 | 国产91在线 | 欧美 | 欧美在线观看一区 | 亚洲精品久久久久久国产精华液 | 在线成人免费视频 | 成人精品国产免费网站 |