偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Spring Cloud 遠(yuǎn)程調(diào)用 OpenFeign 這些知識(shí)點(diǎn),能顛覆你的認(rèn)知!

開(kāi)發(fā) 前端
實(shí)現(xiàn)的原理也比較簡(jiǎn)單就是:向容器中注冊(cè)了一個(gè)OptionsFactoryBean類(lèi)型的bean且該Bean的作用域范圍是refresh。當(dāng)我們調(diào)用/refresh endpoint后就會(huì)刷新該Bean的配置信息。

環(huán)境:SpringBoot2.7.12 + Spring Cloud2021.0.7

1. 概述

Spring Cloud Openfeign是一種聲明式、模板化的HTTP客戶(hù)端,主要用于在Spring Cloud微服務(wù)架構(gòu)中進(jìn)行服務(wù)調(diào)用。

相比于傳統(tǒng)的RestTemplate,Openfeign更加簡(jiǎn)潔,開(kāi)發(fā)者只需通過(guò)編寫(xiě)一個(gè)接口并添加注解進(jìn)行配置,即可實(shí)現(xiàn)對(duì)服務(wù)提供方接口的綁定,而無(wú)需手動(dòng)構(gòu)造請(qǐng)求和解析返回?cái)?shù)據(jù)。

Openfeign的應(yīng)用,讓Spring Cloud微服務(wù)調(diào)用變得更加便捷。在服務(wù)消費(fèi)者中,只需通過(guò)接口方法即可進(jìn)行遠(yuǎn)程服務(wù)調(diào)用,就像調(diào)用本地方法一樣簡(jiǎn)單。此外,F(xiàn)eign還集成了LoadBalancer,利用LoadBalancer維護(hù)服務(wù)提供方列表,實(shí)現(xiàn)輪詢(xún)調(diào)用服務(wù)提供者。

使用Spring Cloud Openfeign,開(kāi)發(fā)者可以更加專(zhuān)注于業(yè)務(wù)邏輯而不是底層的HTTP請(qǐng)求,提高了開(kāi)發(fā)效率和代碼可讀性。同時(shí),Openfeign還支持自定義配置和擴(kuò)展,可以滿足不同場(chǎng)景下的需求??傊琒pring Cloud Openfeign是Spring Cloud微服務(wù)架構(gòu)中不可或缺的一部分,可以幫助開(kāi)發(fā)者更加高效地進(jìn)行服務(wù)調(diào)用。

2. 準(zhǔn)備環(huán)境

<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>

開(kāi)啟openfeign功能

@SpringBootApplication
@EnableFeignClients
public class SpringCloudComprehensiveApplication {
}

feign客戶(hù)端

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


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

以上DemoFeign就能被正確的使用了。接下來(lái)看看下面的那些知識(shí)點(diǎn)你是知道的

3. 知識(shí)盲區(qū)

盲區(qū)1:超時(shí)時(shí)間

默認(rèn)情況下feign調(diào)用超時(shí)時(shí)間如下:

/**
 * 默認(rèn)超時(shí)時(shí)間
 * <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 {
  // 讀超時(shí)時(shí)間
  private int readTimeoutMillis = new Request.Options().readTimeoutMillis();
  // 連接超時(shí)時(shí)間
  private int connectTimeoutMillis = new Request.Options().connectTimeoutMillis();
}

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

配置定義

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

盲區(qū)2:重試

feign的重試相信很多人都沒(méi)有玩過(guò)對(duì)吧?

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

@Bean
@Scope("prototype")
@ConditionalOnMissingBean
public Feign.Builder feignBuilder(Retryer retryer) {
  return Feign.builder().retryer(retryer);
}
// 默認(rèn)還是個(gè)不支持重試的,所以我們需要自定義重試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 ;
}

這樣如果當(dāng)前環(huán)境沒(méi)有cricuitbreaker,那么這里的重試就能生效了。

盲區(qū)3:服務(wù)降級(jí)

通常定義了feign客戶(hù)端后,我們都會(huì)定義相應(yīng)的降級(jí)服務(wù),fallback或fallbackFactory,如果這兩個(gè)都配置了那誰(shuí)才會(huì)生效呢?源碼如下:

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);
  }
}

盲區(qū)4:primary屬性

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

默認(rèn)每一個(gè)feign客戶(hù)端都被注冊(cè)為bean,并且每個(gè)bean都相當(dāng)于使用了@Primary注解修飾一樣,任何地方注入都是有限注入的該bean。它的用處還得從fallback屬性說(shuō)起。如果定義了feign客戶(hù)端后對(duì)應(yīng)的fallback是需要實(shí)現(xiàn)當(dāng)前這個(gè)feign接口的,且還的注冊(cè)為bean對(duì)象。那么如果把這里的primary設(shè)置為false后,容器中此時(shí)可是存在兩個(gè)DemoFeign類(lèi)型的bean的,這時(shí)候容器啟動(dòng)就會(huì)報(bào)錯(cuò)了。所以這里默認(rèn)就吧feign客戶(hù)端的primary設(shè)置為true就是解決這個(gè)問(wèn)題的。示例如下:

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


@Component
public class DemoFeignFallback implements DemoFeign {
}

盲區(qū)5:動(dòng)態(tài)刷新超時(shí)時(shí)間

盲區(qū)1中已經(jīng)提到了超時(shí)時(shí)間問(wèn)題,那都是寫(xiě)靜態(tài)配置,那能不能動(dòng)態(tài)配置呢?可以,完全可以,你只需下面這樣操作即可

#開(kāi)啟刷新配置
feign.client.refresh-enabled=true

實(shí)現(xiàn)的原理也比較簡(jiǎn)單就是:向容器中注冊(cè)了一個(gè)OptionsFactoryBean類(lèi)型的bean且該Bean的作用域范圍是refresh。當(dāng)我們調(diào)用/refresh endpoint后就會(huì)刷新該Bean的配置信息。

先就列出上面5個(gè)知識(shí)點(diǎn)吧,看看你知道幾個(gè)?

完畢!??!

責(zé)任編輯:武曉燕 來(lái)源: Spring全家桶實(shí)戰(zhàn)案例源碼
相關(guān)推薦

2023-02-15 08:12:19

http超時(shí)過(guò)濾器

2019-11-25 21:46:12

數(shù)據(jù)湖云計(jì)算數(shù)據(jù)倉(cāng)庫(kù)

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

手機(jī)安卓蘋(píng)果

2019-10-24 09:09:28

MySQLACIDJava

2018-01-29 15:23:14

網(wǎng)絡(luò)知識(shí)點(diǎn)軟件測(cè)試

2023-03-02 11:52:00

自定義自動(dòng)配置

2020-02-18 08:01:55

在家辦公Kakfa知識(shí)點(diǎn)大全

2023-09-27 18:02:31

2024-06-28 09:37:14

技巧.NET開(kāi)發(fā)

2009-08-05 09:22:43

C#調(diào)用VC DLL

2021-04-13 08:25:12

測(cè)試開(kāi)發(fā)Java注解Spring

2022-08-18 09:51:50

Python代碼循環(huán)

2022-05-24 14:07:53

OpenFeignSpring開(kāi)源

2025-10-15 02:15:00

SpringHTTP客戶(hù)端

2019-04-24 16:40:18

Redis數(shù)據(jù)庫(kù)

2020-08-04 14:00:17

分庫(kù)分表數(shù)據(jù)庫(kù)MySQL
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)