使用SpringCloud實現Java分散式開發【part-4】:Feign服務呼叫的介紹及使用、Feign的負載均衡和熔斷器、請求壓縮和日期級別的設定

2020-09-24 11:01:54

SpringCloud簡介

Spring Cloud是Spring旗下的專案之一
Spring Cloud並不是一個元件 而是許多元件的集合
其將當下非常流行的一些技術整合到了一起 實現了多個分散式開發中的重要功能
協調了分散式環境中各個系統 並且為各類服務提供模板性的設定

其主要涉及的元件包括:

  • Eureka:註冊中心
  • Zuul或Spring Cloud Gateway:服務閘道器
  • Ribbon:負載均衡
  • Feign:服務呼叫
  • Hystrix或Resilience4j:熔斷器

【在本篇中 將介紹Feign服務呼叫】

Feign服務呼叫

Feign意即偽裝

Feign可以將Rest的請求進行隱藏 然後偽裝成類似於SpringMVC的Controller一樣的形式
無需自己進行指定服務名稱 拼接url 拼接引數等繁瑣操作 一切都可以交給Feign去做

一、使用步驟

注:在服務消費端進行操作 因為是服務消費端需要使用Feign進行便捷的服務呼叫

1、新增Feign的Maven依賴

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

2、在啟動類上新增/@EnableFeignClients註解以開啟Feign服務呼叫功能

@SpringCloudApplication
// 開啟Feign服務呼叫功能
@EnableFeignClients
public class ConsumerApplication {

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

3、編寫Feign使用者端
在介面上新增@FeignClient註解 用於宣告當前類為Feign使用者端 然後並且指定服務名稱即可
需要注意的是 Feign使用者端其實是一個介面

// @FeignClient註解宣告了當前類為Feign使用者端 並且指定服務名稱 這樣即可自動拼接了
@FeignClient("user-service")
public interface UserClient {

    // 自動拼接成http://user-service/user/{id}
    @GetMapping("/user/{id}")
    User queryById(@PathVariable Long id);
}

4、編寫控制器
在控制器中引入寫好的Feign使用者端 然後直接呼叫Feign使用者端中的方法即可

@RestController
@RequestMapping("/consumerfeign")
public class ConsumerFeignController {

    // 引入寫好的Feign使用者端
    @Autowired
    private UserClient userClient;

    @GetMapping("/{id}")
    public User queryById(@PathVariable Long id)
    {
        // 直接呼叫Feign使用者端中的方法即可
        return userClient.queryById(id);
    }
}

二、Feign的負載均衡和熔斷器

Feign已經內建了Ribbon負載均衡和Hystrix熔斷器
其實包括負載均衡 服務熔斷 請求壓縮 紀錄檔級別 這些功能都可通過設定項在Feign中開啟以使用

1、Ribbon負載均衡設定

ribbon:
  # 連線超時時長 單位為毫秒
  ConnectTimeout: 1000
  # 資料通訊超時時長 單位為毫秒
  ReadTimeout: 2000
  # 當前伺服器的重試次數
  MaxAutoRetries: 0
  # 重試多少次服務
  MaxAutoRetriesNextServer: 0
  # 是否對所有的請求方式都重試
  OkToRetryOnAllOperations: false

2、Hystrix熔斷器設定

Feign整合的Hystrix預設情況下是關閉的 需要手動在設定中開啟:

feign:
  hystrix:
    # 開啟Feign的熔斷功能
    enabled: true

然後再設定熔斷方法Fallback
指定在Feign使用者端中當某個方法請求失敗 需要呼叫哪個回撥方法
因此 方法名需要一致 即實現該介面即可

// 作為一個元件 記得要加上@Component註解
@Component
public class UserClientFallback implements UserClient {

    @Override
    public User queryById(Long id) {
        User user=new User();
        user.setId(id);
        user.setName("使用者異常,查詢失敗。");
        return user;
    }
}

最後 Feign使用者端的註解也需要修改一下:

  • value屬性代表要自動呼叫的服務名稱
  • fallback屬性代表服務降級類的class
// @FeignClient註解宣告了當前類為Feign使用者端 並且指定服務名稱 這樣即可自動拼接了
@FeignClient(value = "user-service",fallback = UserClientFallback.class)
public interface UserClient {

    // 自動拼接成http://user-service/user/{id}
    @GetMapping("/user/{id}")
    User queryById(@PathVariable Long id);
}

測試成功:
在這裡插入圖片描述

三、請求壓縮

Feign支援對請求和響應進行GZIP壓縮以減少通訊過程中的效能損耗

通過以下引數即可開啟請求與響應的壓縮功能:

feign:
  compression:
    request:
      # 開啟GZIP請求壓縮
      enabled: true
      # 設定壓縮的資料型別
      mime-types: text/html,application/xml,application/json
      # 設定觸發壓縮的大小下限
      min-request-size: 2048
    response:
      # 開啟GZIP響應壓縮
      enabled: true

四、紀錄檔級別

首先 在組態檔中開啟紀錄檔記錄:

# 開啟紀錄檔記錄
logging:
  level:
    # 這裡的屬性名為包名 意為記錄該包下的所有紀錄檔
    net.zjitc: debug

然後編寫設定類 在設定類中設定紀錄檔級別:
Feign支援4種紀錄檔級別:

  • NONE:不記錄任何紀錄檔資訊(預設)
  • BASIC:僅記錄請求的方法 URL以及響應狀態碼和執行時間
  • HEADERS:在BASIC紀錄檔級別的基礎上額外記錄了請求和響應的頭資訊
  • FULL:記錄所有請求和響應的明細 包括頭資訊 請求體 後設資料
// 設定類
@Configuration
public class FeignConfig {

    @Bean
    Logger.Level feignLoggerLevel()
    {
        return Logger.Level.FULL;
    }
}

最後 在Feign使用者端中進行設定即可:

  • configuration屬性代表Feign設定類的class
// @FeignClient註解宣告了當前類為Feign使用者端 並且指定服務名稱 這樣即可自動拼接了
@FeignClient(value = "user-service",fallback = UserClientFallback.class,configuration = FeignConfig.class)
public interface UserClient {

    // 自動拼接成http://user-service/user/{id}
    @GetMapping("/user/{id}")
    User queryById(@PathVariable Long id);
}

測試:
紀錄檔記錄成功
在這裡插入圖片描述