前の章では、リボンが停止して停止されたと述べました. OpenFeign は、リボンのさらなる単純化とカプセル化 (インターフェイス + 注釈) です。
1.OpenFeignの紹介
1.1. Feign と OpenFeign の概念と機能
Feign は宣言型 Web クライアントです. インターフェイスを作成し、注釈を追加してマイクロサービス間の呼び出しを完了するだけで済みます. Feign を使用すると、Web サービス クライアントの作成が容易になります.
これは、サービス インターフェイスを定義し、それに注釈を追加することで機能します。feign は、プラグ可能なエンコーダーとデコーダーもサポートしています。Spring Cloud は Feign をカプセル化して、Spring MVC 標準アノテーションと Http MessageConverters をサポートします。Feign は、負荷分散をサポートするために Eureka および Ribbon と組み合わせて使用できます。
Feign は、Ribbon と RestTemplate を統合して、Http 呼び出しの負荷分散された実行を実装しますが、元のメソッド (Ribbon+RestTemplate) をカプセル化します。開発者は、RestTemplate を手動で使用してサービスを呼び出す必要はありませんが、このインターフェイスでインターフェイスを定義します。これは、インターフェース指向プログラミングの目的に沿ったものであり、開発を簡素化します。
つまり、A が B を呼び出したい場合、Feign は B の外部サービスとまったく同じインターフェイスを A に作成することになります. このインターフェイスを呼び出して B にサービスを提供できます.
1.2、Feign と OpenFeign の違い
2.OpenFeignの利用手順
2.1. Feign コンシューマー側マイクロサービスの作成
プロジェクト モジュール名: Cloud-order-feign80
2.2. POM ファイル構成の変更
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud2023</artifactId>
<groupId>com.tigerhhzz.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>Cloud-order-feign80</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>com.uclass.springcloud</groupId>
<artifactId>Api-Commons</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
</project>
プロジェクトの依存関係を確認してください。openfeign は本質的にリボンを継承しており、リボンの負荷分散機能も備えています。
2.3、yml 設定ファイルを書く
server:
port: 80
spring:
application:
name: Cloud-consumer-feign-order80
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
# defaultZone: http://localhost:7001/eureka/ #单机版
defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/ #集群版
2.4、メインのスタートアップ クラスを書く
クラスに @EnableFeignClients アノテーションを追加して、Feign クライアントを示します。
package com.tigerhhzz.springcloud;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
@Slf4j
@EnableFeignClients //激活对Feign的使用
@SpringBootApplication
public class OrderFeignMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderFeignMain80.class, args);
log.info("OrderFeignMain80启动成功~~~~~~~~~~~~~~~~~~~");
}
}
2.5、ビジネスクラスを書く
ビジネス ロジック インターフェイス + @FeignClient アノテーション構成は、provider8001 または 8002 サービスを呼び出します。
2.5.1. サービスプロバイダーインターフェースのリモート呼び出し用のサービスレイヤーインターフェースを書く
サービス層: @FeignClient(value = "cloud-payment-service") アノテーションを追加するように注意してください。値の値は、リモートで呼び出す必要があるマイクロサービスの名前を示します。
package com.tigerhhzz.springcloud.service;
import com.tigerhhzz.springcloud.entities.CommonResult;
import com.tigerhhzz.springcloud.entities.Payment;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
/**
* @author tigerhhzz
* @date 2023/4/11 15:27
*/
@Component
@FeignClient(value = "cloud-provider-service") //需要寻找的微服务名称
public interface PaymentFeignService {
@GetMapping(value = "/payment/{id}")
public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id);
}
2.5.2. URL マッピングとサービス呼び出し用のコントローラー層を作成する
package com.tigerhhzz.springcloud.controller;
import com.tigerhhzz.springcloud.entities.CommonResult;
import com.tigerhhzz.springcloud.entities.Payment;
import com.tigerhhzz.springcloud.service.PaymentFeignService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
@Slf4j
public class OrderFeignController {
@Resource
private PaymentFeignService paymentFeignService;
@GetMapping(value = "/consumer/payment/get/{id}")
public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id){
return paymentFeignService.getPaymentById(id);
}
}
注: 80 モジュールが開始された後、クライアント アクセス アドレスは /consumer/payment/get/{id} であり、最初にアクセス インターフェイス レイヤー 2.5.1 に記述された PaymentFeignService インターフェイスを見つけ、アノテーション @FeignClient(value = " cloud-provider -service") Eureka レジストリに移動して、サービス名が "cloud-provider-service" のマイクロサービス インターフェイスを見つけます。その呼び出しインターフェイスは @GetMapping(value = "/payment/{id}" であり、外部に公開されています8001 モジュールによって提供される世界) インターフェイス; 中間に openfeign インターフェイスのレイヤーがあります。
2.6. テスト
インターフェイスにアクセスし、openfeign の負荷分散機能をテストします。
- 最初に 2 つの Eureka クラスター 7001/7002 を開始します
- さらに 2 つのマイクロサービスを開始する 8001/8002
- OpenFeign モジュールを開始します OrderFeignMain80
- アクセスアドレス:http://localhost/consumer/payment/get/1
Feign はデフォルトでリボンを使用して負荷分散を実現し、結果を取得します (Feign には負荷分散構成アイテムが付属しています)。
3. OpenFeign タイムアウトメカニズム
3.1、タイムアウトの状況
OpenFeign のデフォルトの待機時間は 1 秒で、1 秒を超えるとエラーが直接報告されます
3.2. タイムアウト時間を設定する
application.yaml 構成ファイルで、タイムアウト期間を設定します。
#设置feign客户端超时时间(OpenFeign默认支持ribbon)
ribbon:
# 表示建立连接后从服务器读取到可用资源,所用时间
ReadTimeout: 5000
# 表示建立连接时间,适用于网络正常的情况下,两端连接所用时间
ConnectTimeout: 5000
OpenFeign の最下層は負荷分散のためのリボンであるため、そのタイムアウト期間はリボンによって制御されます。
4.OpenFeignのログ印刷
Feign インターフェイスの呼び出しステータスを監視および出力し、設定によってログ レベルを調整して、Feign での HTTP リクエストの詳細を理解します。
4.1、ログレベル
- NONE: デフォルト、ログを表示しません
- BASIC: リクエストメソッド、URL、レスポンスステータスコード、実行時間のみ記録
- HEADERS: BASICで定義されている情報に加えて、リクエストとレスポンスのヘッダー情報があります
- FULL: HEADERS で定義された情報に加えて、リクエストとレスポンスのボディとメタデータ
4.2. OpenFeign を使用したログ:
構成クラスに OpenFeign のログ クラスを追加することを実現する
注: Logger は import feign.Logger パッケージの下に導入されています。
@Configuration
public class FeignConfig {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
4.3. 指定したクラスのログ レベルを設定する
YML ファイルのログを開く必要がある Feign クライアント
logging:
level:
#feign日志以什么级别监控哪个接口
com.uclass.springcloud.service.PaymentFeignService: debug