Spring Cloud Netflixスタックでは、各マイクロサービスがHTTPインターフェイスの形で独自のサービスを公開するため、リモートサービスを呼び出すときはHTTPクライアントを使用する必要があります。 JDKネイティブUrlConnection、ApacheのHTTPクライアント、Nettyの非同期HTTPクライアント、およびSpringのRestTemplateを使用できます。ただし、使用する最も便利でエレガントなものは装備です。
偽物の紹介
Feignは、宣言的でテンプレートされたHTTPクライアントです。 Spring CloudでFeignを使用して、HTTPを使用してリモートサービスを要求するときにローカルメソッドを呼び出すのと同じエンコーディングエクスペリエンスを実現できます。開発者は、これがリモートメソッドであることを完全に認識できず、これがHTTPリクエストであることもわかりません。例えば:
@autowiredprivate Advertgropremoteserviceサービス。 //リモートサービスpublic Advertgroupvo foo(integer GroupID){return service.findbygroupid(groupID); // http経由でリモートサービスを呼び出す}開発者は、HTTPリクエストを送信し、HTTP返品をデコードし、 service.findByGroupId()を介してオブジェクトにカプセル化するプロセスを完了できます。
feignの定義
Feignがメソッドを呼び出すときにリクエストを送信するアドレスと、リクエストのためにどのパラメーターを実行するかを知るために、インターフェイスを定義する必要があります。
@feignclient(name = "ea")// [a] public interface advertgroupremoteservice {@requestmapping(value = "/group/{groupid}"、method = requestmethod.get)// [b] AdvertgroupVo FindByGroupid( @pathvariable( "groupid")integer adgroupid)/[c] @Requestm "/group/{groupId}"、method = requestmethod.put)void update( @pathvariable( "groupid")integer groupid、@requestparam( "groupname")string groupName)A:@feignclientは、feignコンポーネントを通知してインターフェイスをプロキシ(インターフェイスの実装を記述する必要はありません)を使用して、ユーザーは@autowiredを介して直接注入できます。
B:@RequestMappingは、このメソッドを呼び出すときに、 /group/{groupId}にget requestを送信する必要があることを意味します。
C: @pathvariableは、SpringMVCの対応する注釈と同じ意味を持っています。
Spring Cloudアプリケーションが開始されると、Feignは@FeignClientアノテーションでマークされたインターフェイスをスキャンし、プロキシを生成し、スプリングコンテナに登録します。プロキシを生成すると、Feignは各インターフェイスメソッドのRecetTemplateオブジェクトを作成します。このオブジェクトは、HTTP要求に必要なすべての情報をカプセル化します。要求パラメーター名、要求方法、およびその他の情報は、このプロセスで決定されます。ここでは、偽物のテンプレート化が反映されています。
この例では、EurekaとRibbonと組み合わせてFeignを使用しています,@FeignClient(name = "ea")サービスURLを取得するために、このインターフェイスメソッドを呼び出すときにeurekaにeurekaを照会するためにeurekaに通知することを意味します。
Feignのエンコーダー、デコーダー、ErerordeCoder
メソッド署名内のメソッドパラメーターオブジェクトをリクエストパラメーターにシリアル化し、HTTPリクエストに配置するFeignのプロセスは、エンコーダ(エンコーダ)によって完了します。同様に、JavaオブジェクトへのHTTP応答データの降下は、デコーダー(デコーダー)によって行われます。
デフォルトでは、Feignは@RequestParam Annotationでマークされたパラメーターを文字列に変換し、URLに追加し、ジャクソンを介して注釈なしでパラメーターをJSONに変換してリクエスト本体に入れます。 @RequetMappingのメソッドがリクエストメソッドを投稿として指定する場合、たとえば、すべての注目されていないパラメーターは無視されることに注意してください。
@RequestMapping(value = "/group/{groupId}"、method = requestmethod.get)void update( @pathvariable( "groupid")integer groupid、 @requestparam( "groupname")string groupName、dataObject obj);現時点では、GETリクエストにはリクエスト本体がないため、OBJパラメーターは無視されます。
Spring Cloud環境では、Feignのエンコーダー*は、注釈に追加されていないパラメーターをエンコードするためにのみ使用されます。エンコーダーをカスタマイズする場合、EncoderはOBJパラメーターをエンコードするときにのみ呼び出されます。デコーダーの場合、デコードのためにSpringMVCのMappingJackson2HTTPMessageConverterクラスにデフォルトの代表者。 ErrorDeCoderは、ステータスコードが200〜300の間である場合にのみ呼び出されます。ErrorDeCoderの関数は、HTTP応答情報に基づいて例外を返すことです。現在、ErrordeCoderを使用して、発信者が処理するためのPeign Interfaceにビジネス例外をスローさせています。
FeignのHTTPクライアント
デフォルトでは、FeignはJDKネイティブUrlConnectionを使用してHTTPリクエストを送信します。接続プールはありませんが、アドレスごとに長い接続が維持されます。つまり、HTTPの永続的な接続が使用されます。 Feignの元のHTTPクライアントをApacheのHTTPクライアントに置き換えることができます。これにより、接続プール、タイムアウトなどのパフォーマンスに密接に関連する制御機能が得られます。SpringCloudは、Brixtion.SR5バージョン以来、この代替品をサポートfeign-httpclientます。
<! - feign native httpclientをapache httpclientに置き換えます - > <依存関係> <groupid> org.apache.httpcomponents </groupid> <artifactid> httpclient> </dependency> <redencyd> com.netflix.feign </groupigigin <バージョン> $ {feign-httpclient} </version> </dependency>次に、application.propertiesを追加します。
feign.httpclient.enabled = true
要約します
feignを通じて、HTTPリモートコールを開発者に対して完全に透明にすることができ、ローカルメソッドの呼び出しと一致するコーディングエクスペリエンスを取得できます。これは、リモートサービスがAlibaba Dubboで公開される方法に似ています。違いは、Dubboはプライベートバイナリプロトコルに基づいているのに対し、Feignは本質的にHTTPクライアントです。 Spring Cloud Netflixを使用してマイクロサービスを構築している場合、偽装は間違いなく最良の選択です。
上記は、リモートHTTPサービスを呼び出すためのHTTPクライアントとしてSpring Cloud Feignを使用するための方法(推奨)です(推奨)。私はそれが誰にでも役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は、すべての人に時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!