blog

フェイントプラクティス -> ソースコード

FeignはNetflixによって開発された軽量なRESTful HTTPサービスクライアントで、vaのようにHTTPリクエストファイルをカプセル化して直接HTTPリクエストを呼び出すのではなく、va...

Sep 16, 2020 · 6 min. read
シェア

Feign

FeignはNetflixが開発した軽量なRESTful HTTPサービスクライアントで、JavaのようにHTTPリクエストファイルをカプセル化して直接呼び出すのではなく、Javaのアウトレットにアノテーションを付けることでHttpリクエストを呼び出します。Dubboと同様に、サービスコンシューマはサービスプロバイダの接続を取得し、ローカル接続であるかのように呼び出しますが、実際にはリクエストをリモートから送信します。

  • FeignはHTTP APIの利用をより簡単かつエレガントにします。UrlをスプライスしてrestTemplate apiを呼び出す代わりに、SpringCloudでFeignを使うのはとても簡単で、ポートを作成し、ポートにいくつかのアノテーションを追加すればコードは完了です!
  • SpringCloudはFeignを強化し、SpringMVCアノテーションをサポートしました。

Nature: Httpの呼び出し処理をカプセル化するもので、Dubboのサービス呼び出しに似たDirected Outputのプログラミング習慣に沿ったものです。 実際にDubboの呼び出しメソッドはDirected Outputの非常に良い例です。

Feignアプリケーションを設定します。

フェイン=レストテンプレート+リボン+ヒストリックス

  • コンシューマはFeign依存性を呼び出します。
<dependency>
 <groupId>org.springframework.cloud</groupId>
 <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  • 偽装アウトレットの作成
// name呼び出されるサービスの名前と、springのymlファイルにあるサービスプロバイダの名前である。.application.name同じにする
@FeignClient(name="lagou-service-resume")
public interface ResumeFeignClient {
//リクエストパスが呼び出される。
@RequestMapping(value = "/resume/openstate/{userId}",method=
RequestMethod.GET)
 public Integer findResumeOpenState(@PathVariable(value = "userId")
Long userId);
}

注目してください:

  1. FeignClientアノテーションのname属性は、呼び出されるサービスプロバイダの名前を指定するために使用します。これは、サービスプロバイダymlファイルのspring.application.nameと同じです。
  2. 接続で使用するメソッドがリモートサービスプロバイダコントローラのHanderメソッドと類似している場合、パラメータバインディングを行う際に@PathVariable、@RequestParam、@RequestHeaderなどを使用することができ、OpenFeign for SpringMVCのアノテーションでもサポートされていますが、値が設定されていないと例外がスローされるので注意が必要です。ただし、値が設定されていないと例外がスローされるので注意が必要です。
  • 接続方法による遠隔調整の完了
@Autowired
private ResumeFeignClient resumeFeignClient;
@Test
public void testFeignClient(){
 Integer resumeOpenState =
 resumeFeignClient.findResumeOpenState(1545132l);
 System.out.println("=======>>>resumeOpenState + resumeOpenState);
}

III.Feignの負荷分散サポート

Feignは既にRibbonの依存関係と自動設定を統合しているので、依存関係を追加する必要はありません。グローバルな設定はribbon.xxで、詳細な設定はservice.ribbon.xxで特定のサービスに対して行うことができます。Feignのデフォルトのリクエスト処理のタイムアウトは1秒ですが、サービスの実行に一定の時間がかかる場合もあります。Feignには独自のタイムアウト設定がありますので、Ribbonのタイムアウトを設定した場合は、Ribbonのタイムアウトが優先されます

  • Ribbon
#呼び出されるマイクロサービスの名前で、これがないとグローバルな効果がない。
lagou-service-resume:
 ribbon:
 #リクエスト接続タイムアウト
 #ConnectTimeout: 2000
 #リクエスト処理のタイムアウト
 #ReadTimeout: 5000
 #すべての操作は再試行される。
 OkToRetryOnAllOperations: true
 ####上記の設定によると、欠陥のあるリクエストにアクセスすると、現在のインスタンスにもう一回アクセスしようとする(回数は
 MaxAutoRetries ,
 ####うまくいかなければ、リクエストは別のインスタンスによってアクセスされ、うまくいかなければ、リクエストは別のインスタンスによってアクセスされる(回数はHttpURLConnectionによってアクセスされる回数によって決定される)。
 MaxAutoRetriesNextServer ,
 ####それでもリクエストが失敗した場合、失敗メッセージが返される。
 MaxAutoRetries: 0 #最初の呼び出しを含めない、現在選択されているインスタンスの再試行回数。
 MaxAutoRetriesNextServer: 0 #インスタンス切り替えのリトライ回数
 NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule # 
 ポリシーの調整

Feignヒューズのサポート

  • Feignクライアントプロセス設定ファイルでFeignのヒューズサポートを有効にします。
# Feignのメルトダウン機能を有効にする。
feign:
 hystrix:
 enabled: true

注目してください:

  1. Hystrixをオンにすると、Feignのメソッドが管理され、問題が発生すると対応するフォールバックロジックが実行されます。
  2. タイムアウトについては、現在2つのタイムアウト設定があり、メルトダウンはこれら2つの時間の最小値に基づいています。つまり、処理時間が最も短いタイムアウトを超えると、メルトダウンはフォールバック劣化ロジックに入ります。
  • 自己定義 FallBack ハンドラクラス
  • 2)の@FeignClientアノテーションで自己定義されたクラスを処理します。
@FeignClient(value = "lagou-service-resume",fallback =
ResumeFallback.class,path = "/resume") // フォールバックが使用される場合、クラス
@RequestMappingリクエストのurlプレフィックスを修飾する代わりに、リクエストは@FeignClientHttpURLConnectionのpath属性にある
//@RequestMapping("/resume")
public interface ResumeServiceFeignClient {

V. Feignによるリクエスト圧縮とレスポンス圧縮のサポート

Feign はリクエストとレスポンスの GZIP 圧縮をサポートし、通信中のパフォーマンス低下を抑えます。リクエストとレスポンスの圧縮を有効にするには、以下のパラメータを使用します:

Feign要約すると、以下はHttpURLConnectionの日付レベルの設定の簡単な説明です。

Feign は http リクエストクライアントで、私たちのブラウザと似ていますが、 リクエストやレスポンスの受信時に、より詳細な日付情報を表示することができます。

  • 日付の偽装機能とレベルの有効化
// FeignHttpURLConnectionの日付レベル
// NONE以下は簡単な要約である。日付を表示しないデフォルトの ---- が最高のパフォーマンスを持つ。
// BASICリクエストメソッド、URL、応答ステータスコード、実行時間のみが記録される。
// HEADERSリクエストヘッダとレスポンスヘッダはBASICレベルで記録される。
// FULLリクエストとレスポンスのヘッダー、ボディ、メタデータを記録する。
@Configuration
public class FeignConfig {
 @Bean
 Logger.Level feignLevel() {
 return Logger.Level.FULL;
 }
}
  • ログの日付レベルをデバッグに設定します。
logging:
 level:
 # Feign日付がデバッグレベルのリクエストにのみ応答する。
 com.lagou.edu.controller.service.ResumeServiceFeignClient: debug

Feignコアのソースコード解析

FeignClientが追加され、インターフェイスが定義されただけで、 実装が何もないリモート・リクエストを完了できますか?いいえ。

  • ブレイクポイントアノテーション@FeginClient
  • @EnableFeignClients フォワードカット
  • import FeignClientsRegistrar
  • 次のステップは、他の主要なコードをトレースすることです registerFeignClients(metadata, registry); これは、@FeginClientをスキャンするスキャナを定義します。
  • クライアントの登録と各クライアントのプロキシの作成
  • そこで次に、ワーカービーンであるFeignClientFactoryBeanのgetObjectメソッドに着目し、経験的にプロキシオブジェクトを返します。
  • getObjectはロードバランシングカプセル化を含むコアメソッドを完了し、最後にリクエストを開始します。
  • 最終的なリクエストはHttpURLConnectionを使って開始されます。

簡単なまとめ

FactoryBean#getObjectを使用してリボンをラップし、最後にhttpリクエストを開始します。

Read next

Vueのライフサイクル

例えば、作成から始まり、データの初期化、テンプレートのコンパイル、DOMのマウント、データが変更されたときのDOMの更新、アンインストールなどです。このプロセスをVueのライフサイクルと呼びます。

Sep 15, 2020 · 2 min read