Feignの詳しい解説と実戦解説
記事ディレクトリ
I. 概要
リボンの使い方は前章で紹介しましたが、リボンを使用してRestTemplate経由で他のサービスのAPIを呼び出す場合、リクエストされたURLにすべてのパラメータを接続する必要があります。パラメータが多すぎる場合、リクエスト文字列を結合すると効率が低下します。Spring Cloud は、Spring Cloud Feignを使用して API を呼び出すための別のソリューションを提供します。
2. フェイクとは何ですか?
Feign は、Ribbon をラップする負荷分散された HTTP クライアントです。Feign を使用した API の呼び出しは、ネイティブ メソッドの呼び出しと同じです。これにより、マイクロサービスを呼び出すときに常に Json データをカプセル化/解析するという面倒な手順が回避されます。
Feign は、Web サービス クライアントの作成を容易にする宣言型 Web クライアントです。Fegin を使用してインターフェイスを作成し、それに注釈を付けます。Feign アノテーションや JAX-RS アノテーションなどのプラグ可能なアノテーション サポートがあり、Feign はプラグ可能なエンコーダとデコーダもサポートしており、Spirng Cloud は Spring MVC にアノテーション機能を追加します。Feign はデフォルトでリボンを統合するため、Fegin はデフォルトで負荷分散を実現します。
3. ふりの特徴
- プラグ可能な HTTP エンコーダおよびデコーダをサポート
- Hystrix とそのフォールバックをサポートします。
- リボンの負荷分散をサポートします。
- HTTP リクエストとレスポンスの圧縮をサポートします。
4. Feign は使いやすい
3.1 偽装使用手順
- 依存関係を導入する
- スタートアップクラスにアノテーションを追加する
- FeignClient インターフェイスを作成する
- Feign を使用して http リクエストを開始する
- 偽ログの設定
3.2 Feign の具体的な使用方法
1. 依存関係を導入する
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2. スタートアップ クラスにアノテーションを追加する
@MapperScan("com.goyeer")
@SpringBootApplication
@EnableFeignClients
public class GoyeerApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}
3. FeignClient インターフェースを作成する
@FeignClient("orderservice")
public interface OrderClient {
@GetMapping("/Order/findById")
Order findById(@PathVariable("orderId") Long orderId);
}
5. Feign を使用して http リクエストを開始する
5.1 Maven が Feign 構成をインポートし、Jackson を統合する
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- 用于解析数据 -->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-jackson</artifactId>
<version>9.7.0</version>
</dependency>
5.2 送信経路と送信方法の設定を偽装する
@RequestLine("GET /user/getone?arkOrgId={arkOrgId}&userId={userId}")
JSONObject getOneEmployee(@Param("orgId") String orgId,@Param("userId") String userId);
@RequestLine("POST /user/add")
@Headers("Content-Type: application/json")
@Body("{body}")
JSONObject saveEmployee(@Param("body") EmployeeDTO employeeDTO);
5.3 Feign.bulider() を呼び出してリクエスト URI を指定し、インターフェース内のメソッドを呼び出す
public class App{
public static void main(String[] args){
EmloyeeAPI emloyeeAPI = Feign.builder().target(EmloyeeAPI.class,"http://localhost:8088");
String result = emloyeeAPI.getOneEmployee("110","1110");
System.out.println(result);
}
}
6. Feign インターフェースの共通アノテーション
注釈 | タイプ | 説明する |
---|---|---|
@RequestLine | 方法 | リクエストメソッドとリクエストパス(UriTemplate)を定義します。リクエスト パスはスラッシュで始まり、途中に {変数名} を使用できます。式の値は @Param アノテーションによって提供されます。 |
@Param | パラメータ | 変数テンプレートを定義すると、式 {変数名} を通じて変数の値を参照できます。 |
@ヘッダー | メソッド、タイプ | リクエスト ヘッダーを定義するには、{変数名} を使用できます。式の値は @Param アノテーションによって提供されます。 |
@QueryMap | パラメータ | Map または Pojo タイプのパラメータを定義します。 |
@HeaderMap | パラメータ | Map型のリクエストヘッダを定義する |
@体 | 方法 | @Param の拡張子。JSON および XML 型パラメータを定義するために @Headers とともに使用されます。 |
7. 偽のインターフェースと共通の注釈
7.1 ターゲットメソッド
プロキシ オブジェクト呼び出しメソッドを通じて HTTP リクエストを送信できるように、HTTP プロキシ オブジェクトとインターフェイスするインターフェイス タイプと URL アドレスを指定します。
7.2 クライアントメソッド
Feign は、デフォルトで JDK のネイティブ URLConnection を使用して HTTP リクエストを送信します。
7.3 オプションメソッド
接続タイムアウト期間と応答タイムアウト期間をミリ秒単位で指定します。
7.4 リトライヤ方式
再試行戦略を指定します。パラメータは、最小時間、最大時間、および再接続の数です。
7.5 encoder()/decode()方法
デフォルトのエンコード/デコード方法は String です。
7.6 ロガー() logLevel()
ログとログ レベルの指定、SLF4J の構成など。
7.7 @EnableFeignClients
フェインをオンにするために使用されます
7.8 @FeignClient
Feign でインターセプトするリクエスト インターフェイスをマークします。
7.9 値、名前
値は名前と同じ機能を持ち、URL が設定されていない場合は、設定された値がサービス検出のサービス名として使用されます。それ以外の場合は単なる名前です。
7.10 サービスID
serviceId は放棄されました。名前を直接使用してください。
7.11 コンテキストID
Bean 名の競合が解決されました。
7.12 URL
URL は、指定されたサービスのアドレスを構成するために使用されます。これは、リボンのサービス選択を介さずにこのサービスを直接要求することと同じです。デバッグなどのシナリオで使用できます。
7.13 デコード404
呼び出しリクエストで 404 エラーが発生し、decode404 の値が true の場合、デコーダのデコードが実行されます。それ以外の場合は、例外がスローされます。
7.14構成
Configuration は Feign の設定クラスで、この設定クラスでは Feign の Encoder、Decoder、LogLevel、Contract などをカスタマイズできます。
7.15 フォールバック
フォールト トレラントな処理クラス、つまりフォールバック ロジックを定義します。フォールバック クラスは Feign Client インターフェイスを実装する必要があり、サーキット ブレーカーの例外情報を知ることはできません。
7.16 フォールバックファクトリー
フォールトトレラントな処理でもあり、ヒューズの異常情報を知ることができます。
7.17 パス
パスは、現在の FeignClient がインターフェイスにアクセスするときの統合プレフィックスを定義します。たとえば、インターフェイス アドレスは /user/get です。プレフィックスを user として定義する場合、特定のメソッドのパスは /get と記述するだけで済みます。
7.18 プライマリー
Primary は @Primary アノテーションに対応し、デフォルトでは true に設定されていますが、公式設定には理由があります。Feign がフォールバックを実装すると、Feign Client の Spring コンテナーに同一の Bean が複数存在することになりますが、@Autowired を使用して注入する場合、どれを注入すればよいかわからないため、優先度の高い Bean を設定する必要があります。はい、@Primary アノテーションがこれを行います。
7.19予選
修飾子は @Qualifier アノテーションに対応します。使用シナリオは上記の基本とはほとんど関係ありません。一般的なシナリオでは、@Autowired を直接挿入できます。
8. Feignのログレベル
8.1 Feign のログレベル
- NONE (デフォルト): ログは記録されず、最高のパフォーマンスが得られ、運用環境での使用に適しています。
- BASIC: リクエスト メソッド、URL、レスポンス ステータス コード、および実行時間のみを記録します。実稼働環境の問題の追跡に適しています。
- HEADERS: BASIC レベルに基づいて要求ヘッダーと応答ヘッダーを記録します。
- FULL: 問題を特定するための開発とテストに使用される、リクエストとレスポンスのヘッダー/本文とメタデータを記録します。
8.2 偽装ログの設定方法
-
構成クラスのグローバル構成
プロジェクトに構成クラスを追加し、次のようにログ レベルを設定します。これはグローバル構成として使用できます。
@Configuration public class FeignConfig{ @Bean public Logger.Level level(){ return Logger.level.FULL; } }
-
構成クラスのローカル構成
まず、FeignConfig の @Configuration アノテーションを削除します。削除しないと、グローバル構成になります。
@FeignClient の構成属性には FeignConfig.class が割り当てられます
@FeignClient(path = "/employee", value = "provider", configuration = FeignConfig.class) public interface UserService { @RequestMapping("/list") List<String> findEmployee(); }
-
構成ファイルはマイクロサービス構成を指定します
構成ファイルに次の構成を追加します。プロバイダーはサーバー サービス名であり、構成の変更はプロバイダー サービスが呼び出されたときにのみ有効になります。
feign.client.config.provider.loggerLevel=BASIC
9. ふりの原則
4.1 Feign サービス コールの動作原理は、次の手順に要約できます。
- まず @EnableFeignCleints アノテーションを通じて FeignCleint を有効にします。
- Feign のルールに従ってインターフェイスを実装し、 @FeignCleint アノテーションを追加します。プログラムが開始されると、@FeignCleint を使用してすべてのクラスをスキャンし、この情報を ioc コンテナに挿入します。
- インジェクション時に FeignClientFactoryBean.class から FeignClient を取得します。
- インターフェイス メソッドが呼び出されると、jdk プロキシを通じて特定の RequesTemplate が生成され、RequesTemplate は http Reques を生成します。
- リクエストは処理のためにクライアントに渡されます。クライアントは HttpUrlConnection、HttpClient、または Okhttp です。
- クライアントは LoadBalanceClient クラスにカプセル化され、リボン クラスと結合して負荷分散を実現します。
4.2 Feign全体フローチャート
10. フェーンとリボンの類似点と相違点
リボンとフェインはどちらも負荷分散を実装するコンポーネントであり、フェインの本質はリボンであり、リボンの実装に基づいています。これらはすべてコンシューマ側に追加されたアノテーションであり、コンシューマ側が他のプロデューサのサービスを呼び出すことができるようになります。
フェギンとリボンの違い
- スタートアップ クラスは異なるアノテーションを使用しており、Ribbon は @RibbonClinet を使用し、Feign は @EnableFeignClients を使用します。
- サービスの指定場所が異なり、Ribbon は @RibbonClient アノテーションで宣言されているのに対し、Feign は抽象メソッドが定義されているインターフェース内で @FeignClient を使用して宣言されています。
- 呼び出し方法が異なり、リボン自体で http リクエストを作成し、http リクエストをシミュレートしてから、RestTemplate を使用して他のサービスに送信する必要があり、その手順は非常に面倒です。
- リボン構成可能な負荷分散メカニズム
11. Feign と RestTemplate の類似点と相違点
-
残りのテンプレート
RestTemplate は Spring 3.0 以降でサポートされている HTTP リクエスト ツールで、GET リクエスト、POST リクエスト、PUT リクエスト、DELETE リクエスト、および一部の一般的なリクエスト実行メソッド交換および実行などの一般的な REST リクエスト シナリオ用のテンプレートを提供します。RestTemplate は InterceptingHttpAccessor から継承し、基本的な RESTful 操作を定義する RestOperations インターフェイスを実装します。これらの操作は RestTemplate に実装されます。
- 関連する分析パラメータを追加するだけで、簡単で便利に使用できます。
- ヒューズ ノードは制御が簡単なので、後でビジネスに基づいて対応する調整を行うのが簡単です。
- 例外キャプチャは簡単で、対応するメソッドを同じページに追加するだけです。
- リクエストは httpclient に近いため、より使いやすくなっています。
- 柔軟性は高いが、メッセージのカプセル化が肥大化します。
-
ふりをする
Feign を使用して API を呼び出す負荷分散された HTTP クライアントは、ローカル メソッドを呼び出すようなもので、ターゲットのマイクロサービスを呼び出すときに json データを常に解析/カプセル化するという面倒な必要性を回避します。Feign は宣言型 Web サービス クライアントです。Spring Cloud は Spring MVC にアノテーションを追加します。Spring Web はデフォルトで HttpMessageConverters を使用します。Spring Cloud は、Ribbon と Eureka が提供する負荷分散された HTTP クライアント Feign を統合します。
- 記述方法は洗練されており、インターフェイス指向のスタイルに基づいていますが、開発はより面倒です。
- yml は、hystrix コンポーネントを開始するための設定を追加する必要があります。
- フォールバック メソッドを実行するには、対応するクラスを作成する必要があります。
- 例外情報をキャッチすることによって実装されるインターフェイスと、例外をキャッチしないことによって実装されるインターフェイスは異なります。
- 対応するパラメータ設定を feign アノテーションで行う必要があります。
- 偽の操作では、さまざまなパラメータに対応するさまざまなクラスを作成する必要があります。
12. Feign と OpenFeign の類似点と相違点
-
同じ点
- Feign と OpenFeign はどちらも Spring Cloud のリモート呼び出しおよび負荷分散コンポーネントです。
- FeignとOpenFeignは同じ機能を持ち、サービスのリモート呼び出しや負荷分散を実現できます。
- Feign と OpenFeign は両方とも、Ribbon を統合し、Ribbon を使用して利用可能なサービスのリストを管理し、Ribbon を介してクライアントの負荷分散を実装しました。
- Feign と OpenFeign は両方とも、サービス コンシューマ (クライアント) 上でサービス バインディング インターフェイスを定義し、アノテーションを通じてそれらを構成して、リモート サービス呼び出しを実現します。
-
違い
- Feign と OpenFeign には異なる依存関係があり、Feign の依存関係は spring-cloud-starter-feign であるのに対し、OpenFeign の依存関係は spring-cloud-starter-openfeign です。
- Feign と OpenFeign は、異なるアノテーションをサポートします。Feign は、Feign アノテーションと JAX-RS アノテーションをサポートしますが、Spring MVC アノテーションはサポートしません。Feign アノテーションと JAX-RS アノテーションのサポートに加えて、OpenFeign は Spring MVC アノテーションもサポートします。