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);
}
注目してください:
- FeignClientアノテーションのname属性は、呼び出されるサービスプロバイダの名前を指定するために使用します。これは、サービスプロバイダymlファイルのspring.application.nameと同じです。
- 接続で使用するメソッドがリモートサービスプロバイダコントローラの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
注目してください:
- Hystrixをオンにすると、Feignのメソッドが管理され、問題が発生すると対応するフォールバックロジックが実行されます。
- タイムアウトについては、現在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リクエストを開始します。