欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

springboot集成Feign的實(shí)現(xiàn)示例

 更新時(shí)間:2024年11月24日 08:41:43   作者:Flying_Fish_Xuan  
Feign是聲明式HTTP客戶端,用于簡(jiǎn)化微服務(wù)之間的REST調(diào)用,本文就來(lái)介紹一下springboot集成Feign的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

1. 背景與概念

在微服務(wù)架構(gòu)中,服務(wù)之間的通信是關(guān)鍵問(wèn)題之一。通常有兩種常見(jiàn)的通信方式:

  • 基于 HTTP 的 REST 通信:服務(wù)之間通過(guò) HTTP 協(xié)議進(jìn)行調(diào)用,通常使用 RestTemplate 或 OkHttp 進(jìn)行 HTTP 請(qǐng)求。
  • 基于 RPC 的遠(yuǎn)程調(diào)用:通過(guò)遠(yuǎn)程過(guò)程調(diào)用(RPC),如 gRPC。

為了簡(jiǎn)化微服務(wù)間的 REST 調(diào)用,Spring Cloud 提供了 Feign 作為聲明式 HTTP 客戶端,來(lái)替代手寫(xiě)的 HTTP 請(qǐng)求邏輯。Feign 是一個(gè)簡(jiǎn)化服務(wù)調(diào)用的工具,它通過(guò)聲明式的接口定義和注解,使得遠(yuǎn)程調(diào)用更加直觀和簡(jiǎn)單。

2. Feign 的特點(diǎn)

  • 聲明式調(diào)用:通過(guò)接口和注解的方式定義服務(wù)調(diào)用,避免了手寫(xiě)大量的 HTTP 客戶端代碼。
  • 與 Ribbon 結(jié)合:Feign 可以與 Ribbon 結(jié)合實(shí)現(xiàn)客戶端的負(fù)載均衡。
  • 與 Hystrix 結(jié)合:Feign 可以與 Hystrix 集成,實(shí)現(xiàn)熔斷、降級(jí)等容錯(cuò)處理。
  • 與 Eureka 結(jié)合:Feign 可以與 Eureka 服務(wù)發(fā)現(xiàn)機(jī)制結(jié)合,通過(guò)服務(wù)名動(dòng)態(tài)選擇服務(wù)實(shí)例。

3. Feign 的引入和配置

為了使用 Feign,首先需要在 Spring Boot 項(xiàng)目中引入相應(yīng)的依賴(lài),并進(jìn)行一些配置。

3.1. 引入依賴(lài)

在 pom.xml 文件中引入 Spring Cloud Feign 相關(guān)的依賴(lài)。

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

注意:如果項(xiàng)目是基于 Spring Cloud 的,通常 Feign 是 Spring Cloud 中內(nèi)置的,只需引入 spring-cloud-dependencies 即可。

3.2. 啟用 Feign

要啟用 Feign 客戶端支持,需要在 Spring Boot 的啟動(dòng)類(lèi)中使用 @EnableFeignClients 注解。

@SpringBootApplication
@EnableFeignClients  // 啟用 Feign 客戶端
public class FeignApplication {

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

3.3. 配置文件(可選)

可以在 application.yml 或 application.properties 文件中進(jìn)行一些 Feign 配置,例如超時(shí)時(shí)間、日志級(jí)別等。

feign:
  client:
    config:
      default:
        connectTimeout: 5000     # 連接超時(shí)時(shí)間
        readTimeout: 5000        # 讀取超時(shí)時(shí)間
  httpclient:
    enabled: true                # 啟用 HttpClient 作為 Feign 的底層實(shí)現(xiàn)
logging:
  level:
    com.example: DEBUG           # 設(shè)置日志級(jí)別為 DEBUG

4. 定義 Feign 客戶端接口

使用 Feign 的核心是通過(guò)接口來(lái)聲明遠(yuǎn)程服務(wù)的調(diào)用。Feign 將根據(jù)該接口生成具體的 HTTP 請(qǐng)求。

4.1. 定義服務(wù)接口

例如,假設(shè)我們有一個(gè)用戶服務(wù) user-service,該服務(wù)提供了查詢用戶信息的 API:

@FeignClient(name = "user-service", url = "http://localhost:8081")  // 定義 Feign 客戶端
public interface UserClient {

    @GetMapping("/users/{id}")
    User getUserById(@PathVariable("id") Long id);
}
  • @FeignClient:定義 Feign 客戶端,name 指定客戶端的名稱(chēng),url 是服務(wù)的基礎(chǔ) URL。如果與 Eureka 等服務(wù)發(fā)現(xiàn)系統(tǒng)集成,url 可以省略。
  • @GetMapping:指定 HTTP 方法為 GET,并定義請(qǐng)求路徑。
  • @PathVariable:將路徑中的變量 {id} 映射為方法參數(shù)。

4.2. 定義數(shù)據(jù)模型

為了接收服務(wù)端返回的數(shù)據(jù),我們需要定義一個(gè)用戶模型 User

public class User {
    private Long id;
    private String name;
    private String email;

    // getters and setters
}

4.3. 使用 Feign 客戶端

在需要調(diào)用用戶服務(wù)的地方,可以注入 UserClient 接口,然后直接使用它來(lái)發(fā)起請(qǐng)求:

@RestController
@RequestMapping("/orders")
public class OrderController {

    @Autowired
    private UserClient userClient;

    @GetMapping("/{id}/user")
    public User getUserByOrderId(@PathVariable("id") Long orderId) {
        // 通過(guò) Feign 調(diào)用用戶服務(wù)
        User user = userClient.getUserById(orderId);
        return user;
    }
}

這里 userClient.getUserById() 的調(diào)用會(huì)通過(guò) Feign 自動(dòng)生成 HTTP 請(qǐng)求,并發(fā)起調(diào)用,無(wú)需手寫(xiě)復(fù)雜的 HTTP 客戶端代碼。

5. Feign 集成負(fù)載均衡和服務(wù)發(fā)現(xiàn)

5.1. 集成 Eureka 服務(wù)發(fā)現(xiàn)

如果項(xiàng)目集成了 Eureka 作為服務(wù)發(fā)現(xiàn)組件,F(xiàn)eign 可以通過(guò)服務(wù)名自動(dòng)發(fā)現(xiàn)服務(wù),而不需要指定 url。此時(shí),只需要在 @FeignClient 中指定服務(wù)名稱(chēng)即可。

@FeignClient(name = "user-service")  // 通過(guò) Eureka 服務(wù)發(fā)現(xiàn)獲取服務(wù)地址
public interface UserClient {
    @GetMapping("/users/{id}")
    User getUserById(@PathVariable("id") Long id);
}

Eureka 會(huì)自動(dòng)為 user-service 選擇合適的實(shí)例,F(xiàn)eign 負(fù)責(zé)與該實(shí)例進(jìn)行通信。

5.2. 負(fù)載均衡

Feign 默認(rèn)集成了 Ribbon 作為客戶端的負(fù)載均衡器,當(dāng)通過(guò)服務(wù)名調(diào)用時(shí),Ribbon 會(huì)根據(jù)配置選擇可用的服務(wù)實(shí)例??梢栽?nbsp;application.yml 中配置 Ribbon 的負(fù)載均衡策略:

ribbon:
  eureka:
    enabled: true   # 啟用與 Eureka 的集成
  NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule  # 負(fù)載均衡策略,輪詢

5.3. 自定義 Feign 配置

你可以通過(guò)配置類(lèi)自定義 Feign 的行為。例如,自定義超時(shí)、重試機(jī)制或日志配置:

@Configuration
public class FeignConfig {

    @Bean
    public Request.Options options() {
        return new Request.Options(5000, 10000);  // 設(shè)置連接超時(shí)和讀取超時(shí)
    }

    @Bean
    public Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;  // 設(shè)置日志級(jí)別為 FULL
    }
}

然后在 @FeignClient 中指定配置類(lèi):

@FeignClient(name = "user-service", configuration = FeignConfig.class)
public interface UserClient {
    @GetMapping("/users/{id}")
    User getUserById(@PathVariable("id") Long id);
}

6. Feign 降級(jí)處理(Hystrix 集成)

在微服務(wù)環(huán)境下,遠(yuǎn)程調(diào)用可能會(huì)出現(xiàn)失敗或超時(shí)等情況。為了解決這些問(wèn)題,F(xiàn)eign 可以與 Hystrix 集成,提供熔斷和降級(jí)功能。

6.1. 啟用 Hystrix

在 application.yml 中啟用 Hystrix:

feign:
  hystrix:
    enabled: true  # 啟用 Feign 的 Hystrix 降級(jí)功能

6.2. 定義降級(jí)邏輯

你可以在 @FeignClient 中通過(guò) fallback 參數(shù)指定降級(jí)類(lèi),當(dāng)服務(wù)調(diào)用失敗時(shí),Hystrix 會(huì)執(zhí)行降級(jí)邏輯:

@FeignClient(name = "user-service", fallback = UserClientFallback.class)
public interface UserClient {
    @GetMapping("/users/{id}")
    User getUserById(@PathVariable("id") Long id);
}

// 定義降級(jí)類(lèi)
@Component
public class UserClientFallback implements UserClient {

    @Override
    public User getUserById(Long id) {
        // 返回默認(rèn)的用戶信息
        User user = new User();
        user.setId(id);
        user.setName("Default User");
        user.setEmail("default@example.com");
        return user;
    }
}

7. Feign 日志配置

Feign 支持記錄每個(gè)請(qǐng)求的詳細(xì)日志,以便調(diào)試和監(jiān)控。你可以在 application.yml 中配置日志級(jí)別:

logging:
  level:
    com.example: DEBUG  # 開(kāi)啟 DEBUG 級(jí)別日志
    feign:
      Logger: FULL       # 記錄 Feign 的詳細(xì)日志

8. 完整示例

下面是一個(gè)完整的 Spring Boot 應(yīng)用,集成 Feign 并使用 Hystrix 進(jìn)行降級(jí)處理:

@SpringBootApplication
@EnableFeignClients
public class FeignApplication {

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

@FeignClient(name = "user-service", fallback = UserClientFallback.class)
public interface UserClient {

    @GetMapping("/users/{id}")
    User getUserById(@PathVariable("id") Long id);
}

@Component
public class UserClientFallback implements UserClient {

    @Override
    public User getUserById(Long id) {
        User user = new User();
        user.setId(id);
        user.setName("Default User");
        user.setEmail("default@example.com");
        return user;
    }
}

@RestController
@RequestMapping("/orders")
public class OrderController {

    @Autowired
    private UserClient userClient;

    @GetMapping("/{id}/user")
    public User getUserByOrderId(@PathVariable("id") Long orderId) {
        return userClient.getUserById(orderId);
    }
}

9. 總結(jié)

Spring Boot 集成 Feign 提供了一種簡(jiǎn)潔高效的方式來(lái)調(diào)用 REST 服務(wù)。通過(guò) Feign,開(kāi)發(fā)者只需要定義接口和注解,就可以完成遠(yuǎn)程服務(wù)的調(diào)用。Feign 支持與 Spring Cloud 生態(tài)系統(tǒng)的多種組件集成,如 Eureka、Ribbon、Hystrix 等,使其在微服務(wù)架構(gòu)中非常實(shí)用。

到此這篇關(guān)于springboot集成Feign的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)springboot集成Feign內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Jmeter 中 CSV 如何參數(shù)化測(cè)試數(shù)據(jù)并實(shí)現(xiàn)自動(dòng)斷言示例詳解

    Jmeter 中 CSV 如何參數(shù)化測(cè)試數(shù)據(jù)并實(shí)現(xiàn)自動(dòng)斷言示例詳解

    這篇文章主要介紹了Jmeter 中 CSV 如何參數(shù)化測(cè)試數(shù)據(jù)并實(shí)現(xiàn)自動(dòng)斷言,本文通過(guò)示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • jenkins自動(dòng)構(gòu)建SpringCloud流程

    jenkins自動(dòng)構(gòu)建SpringCloud流程

    文章介紹了如何使用Jenkins和docker-compose自動(dòng)部署SpringCloud和Vue項(xiàng)目,首先,下載并安裝Jenkins,并配置Jenkins以自動(dòng)啟動(dòng),然后,配置GitLab插件和NodeJS插件,以便可以從GitLab倉(cāng)庫(kù)中獲取代碼并構(gòu)建,接下來(lái),創(chuàng)建一個(gè)Jenkins任務(wù)來(lái)構(gòu)建Vue項(xiàng)目
    2025-02-02
  • java線程之Happens before規(guī)則案例詳解

    java線程之Happens before規(guī)則案例詳解

    這篇文章主要為大家介紹了java線程之Happens-before規(guī)則,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>
    2022-08-08
  • Java數(shù)據(jù)結(jié)構(gòu)中堆的向下和向上調(diào)整解析

    Java數(shù)據(jù)結(jié)構(gòu)中堆的向下和向上調(diào)整解析

    堆是一顆完全二叉樹(shù),在這棵樹(shù)中,所有父節(jié)點(diǎn)都滿足大于等于其子節(jié)點(diǎn)的堆叫大根堆,所有父節(jié)點(diǎn)都滿足小于等于其子節(jié)點(diǎn)的堆叫小根堆。堆雖然是一顆樹(shù),但是通常存放在一個(gè)數(shù)組中,父節(jié)點(diǎn)和孩子節(jié)點(diǎn)的父子關(guān)系通過(guò)數(shù)組下標(biāo)來(lái)確定
    2021-11-11
  • 使用@Value 注入 List 類(lèi)型的配置屬性需要注意的 BUG

    使用@Value 注入 List 類(lèi)型的配置屬性需要注意的 BUG

    這篇文章主要介紹了使用@Value 注入 List 類(lèi)型的配置屬性需要注意的 BUG,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • springcloud中RabbitMQ死信隊(duì)列與延遲交換機(jī)實(shí)現(xiàn)方法

    springcloud中RabbitMQ死信隊(duì)列與延遲交換機(jī)實(shí)現(xiàn)方法

    死信隊(duì)列是消息隊(duì)列中非常重要的概念,同時(shí)我們需要業(yè)務(wù)場(chǎng)景中都需要延遲發(fā)送的概念,比如12306中的30分鐘后未支付訂單取消,那么本期,我們就來(lái)講解死信隊(duì)列,以及如何通過(guò)延遲交換機(jī)來(lái)實(shí)現(xiàn)延遲發(fā)送的需求,感興趣的朋友一起看看吧
    2022-05-05
  • Spring中的循環(huán)依賴(lài)問(wèn)題

    Spring中的循環(huán)依賴(lài)問(wèn)題

    在Spring框架中,循環(huán)依賴(lài)是指兩個(gè)或多個(gè)Bean相互依賴(lài),這導(dǎo)致在Bean的創(chuàng)建過(guò)程中出現(xiàn)依賴(lài)死鎖,為了解決這一問(wèn)題,Spring引入了三級(jí)緩存機(jī)制,包括singletonObjects、earlySingletonObjects和singletonFactories
    2024-09-09
  • 淺談SpringBoot資源初始化加載的幾種方式

    淺談SpringBoot資源初始化加載的幾種方式

    在平時(shí)的業(yè)務(wù)模塊開(kāi)發(fā)過(guò)程中,難免會(huì)需要做一些全局的任務(wù)、緩存、線程等等的初始化工作,那么如何解決這個(gè)問(wèn)題呢?本文就來(lái)介紹一下,感興趣的可以了解一下
    2021-07-07
  • 詳解Spring的@Value作用與使用場(chǎng)景

    詳解Spring的@Value作用與使用場(chǎng)景

    這篇文章主要介紹了詳解Spring的@Value作用與使用場(chǎng)景,Spring為大家提供許多開(kāi)箱即用的功能,@Value就是一個(gè)極其常用的功能,它能將配置信息注入到bean中去,需要的朋友可以參考下
    2023-05-05
  • Spring?Boot自定義Starter組件開(kāi)發(fā)實(shí)現(xiàn)配置過(guò)程

    Spring?Boot自定義Starter組件開(kāi)發(fā)實(shí)現(xiàn)配置過(guò)程

    SpringBoot中的starter是一種非常重要的機(jī)制,能夠拋棄以前繁雜的配置,將其統(tǒng)一集成進(jìn)?starter,應(yīng)用者只需要在maven中引入starter依賴(lài),這篇文章主要介紹了Spring?Boot自定義Starter組件開(kāi)發(fā)實(shí)現(xiàn),需要的朋友可以參考下
    2022-06-06

最新評(píng)論