Spring Cloud Feignを用いてHTTPクライアントとしてリモートHTTPサービスを呼び出す方法(推奨)


Spring Cloud Netflixスタックでは、それぞれのマイクロサービスがHTTPインターフェースの形で自身のサービスを暴露しているので、リモートサービスの呼び出しにはHTTPクライアントを使用しなければならない。JDK原生のURLConnection、ApacheのHttp Cient、Nettyの非同期HTTP Cient、SpringのRestTemplateを使用できます。しかし、一番便利で優雅なのはFeignです。
Feign概要
Feignは声明式、テンプレート化されたHTTPクライアントである。Spring CloudでFeignを使用すると、HTTPを使ってリモートサービスを要求する時にローカル方法を呼び出すと同じ符号化体験ができるようになります。開発者はこれがリモート方法であることを全く感じられません。これはHTTP要求であるということをより知覚できません。たとえば:

@Autowired
private AdvertGropRemoteService service; //     
public AdvertGroupVO foo(Integer groupId) {
 return service.findByGroupId(groupId); //   HTTP      
}
開発者はservice.findByGroupId()を通じてHTTP要求を送信し、HTTP戻り結果を復号し、オブジェクトにカプセル化するプロセスを行うことができる。
Feignの定義
Feignに方法を呼び出す時にどの住所に要求するべきかを知らせるために、どのパラメータが必要かを要求します。インターフェースを定義する必要があります。

@FeignClient(name = "ea") // [A]
public interface AdvertGroupRemoteService {
 @RequestMapping(value = "/group/{groupId}", method = RequestMethod.GET) // [B]
 AdvertGroupVO findByGroupId(@PathVariable("groupId") Integer adGroupId) // [C]
 @RequestMapping(value = "/group/{groupId}", method = RequestMethod.PUT)
 void update(@PathVariable("groupId") Integer groupId, @RequestParam("groupName") String groupName)
A:@Feign Clientは、Feignコンポーネントにこのインターフェースをプロキシするように通知するために用いられ、使用者は@Autowiredを介して直接注入することができる。
B:@Request Mappingは、この方法を呼び出す際には、GET要求を/group/{groupId}に送信する必要があることを示している。
C:@PathVarableはSprigMVCに対応する注釈と同じ意味です。
Spring Cloudアプリケーションは起動時、Feignは@Feign Client注釈のあるインターフェースをスキャンして、プロキシを生成し、Spring容器に登録します。プロキシを生成する際にFeignは、HTTP要求に必要なすべての情報をカプセル化したRequetTemplateオブジェクトをインターフェース方法ごとに作成し、要求パラメータ名、要求方法などの情報はこのプロセスで決定され、Feignのテンプレート化はここに表される。
本例では、FeignとEurekaとRibbonを組み合わせて,@FeignClient(name = "ea")を使用して、Feignにこのインターフェース方法を起動する際にEurekaにeaというサービスを照会し、サービスURLを得ることを意味する。
FeignのEnder、DecoderとError Decoder
Feignは、方法署名における方法パラメータオブジェクトを、HTTP要求に要求パラメータとしてプログレッシブ化するプロセスを、エンコーダによって実行する。同じように、HTTP応答データをjavaオブジェクトに逆プログレッシブ化することは、デコーダ(Decoder)によって行われる。
デフォルトでは、Feignは@Request Paramに注釈されているパラメータを文字列に変換してURLに追加し、注釈がないパラメータをJacksonを通じてjsonに変換して要求体に格納します。なお、@RequetMappingにおけるmethodが要求方式をPOSTとして指定すると、未標記のパラメータは無視されます。例えば、

@RequestMapping(value = "/group/{groupId}", method = RequestMethod.GET)
void update(@PathVariable("groupId") Integer groupId, @RequestParam("groupName") String groupName, DataObject obj);
このとき、声明はGET要求であり、要求体がないので、Objパラメータは無視されます。
Spring Cloud環境では、FeignのEncocder*は、注釈が付加されていないパラメータ*を符号化するためにのみ使用されます。もしあなたがEncoderをカスタマイズしたら、Objパラメータを符号化する時だけEnccoderを呼び出します。Decoderについては、デフォルトではSpringMVCのMappingJackson 2 HttpMessage Coverter類に復号を依頼します。状態コードが200~300の間にない場合のみ、Error Decoderが起動されます。Error Decoderの役割は、HTTP応答情報に基づいて、Feignインターフェースを呼び出したところで捕獲できる異常を返すことである。私たちは現在、Errer Decoderを通じてFeignインターフェースに業務異常を投げて使用者に処理させています。
FeignのHTTP Cient
FeignはデフォルトではJDK元のURLConnectionを使ってHTTP要求を送信しますが、接続池はありません。しかし、各アドレスに対しては長い接続を維持します。つまりHTTPを利用したpersistence connectionです。ApacheのHTTP CientをFeign元のhttp clientに置き換えることができ、接続池、タイムアウト時間などの性能に関わる制御能力を得ることができます。Spring CloudはBrixtions.SR 5バージョンからこのような代替をサポートしています。まずプロジェクトでApache HTTP Cientとfeign-httpclientの依存性を宣言します。

<!--   Apache HttpClient  Feign  httpclient -->
 <dependency>
 <groupId>org.apache.httpcomponents</groupId>
 <artifactId>httpclient</artifactId>
 </dependency>
 <dependency>
 <groupId>com.netflix.feign</groupId>
 <artifactId>feign-httpclient</artifactId>
 <version>${feign-httpclient}</version>
 </dependency>
その後、appication.propertiesに追加します。

feign.httpclient.enabled=true
締め括りをつける
Feignにより、HTTPの遠隔呼び出しを開発者に対して完全に透明にし、呼び出しローカル方法と一致する符号化体験を得ることができます。この点は、Al Dubboにおけるリモートサービスの曝露の方法と類似しており、Dubboはプライベートバイナリプロトコルに基づくものであり、Feignは本質的にはHTTPクライアントであるという違いがある。もしSpring Cloud Netflixでマイクロサービスを構築しているなら、Feignはきっと一番いい選択です。
以上は、Spring Cloud FeignをHTTPクライアントとしてリモートHTTPサービスを呼び出す方法(推奨)をご紹介しました。皆様のご協力をお願いします。もし何かご質問がありましたら、メッセージをください。ここでも私たちのサイトを応援してくれてありがとうございます。