1概要

このチュートリアルでは、Netflixによって開発された宣言型の

HTTP

クライアント__https://github.com/OpenFeign/feign[Feign]について説明します。


Feign

は、

HTTP API

クライアントを単純化することを目的としています。簡単に言うと、開発者はインターフェースを宣言して注釈を付けるだけでよく、実際の実装は実行時にプロビジョニングされます。


2例

書店サービス

REST API

の例を提示します。

サンプルの

Feign

クライアントを構築する前に、必要な依存関係を追加して

REST

サービスを起動します。

書店サービスの例は、https://github.com/Baeldung/spring-hypermedia-api[

here

]から複製できます。

サービスアプリケーションをダウンロードしたら、次のように実行します。

$> mvn install spring-boot:run


3セットアップ

まず、新しい

Maven

プロジェクトを作成し、これらの依存関係を含めます。

<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-okhttp</artifactId>
    <version>9.3.1</version>
</dependency>
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-gson</artifactId>
    <version>9.3.1</version>
</dependency>
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-slf4j</artifactId>
    <version>9.3.1</version>
</dependency>



feign-core


依存関係以外に(これも取り込まれています)、特にいくつかのプラグインを使います。

内部使用のためのhttps://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22io.github.openfeign%22%20AND%20a%3A%22feign-okhttp%22[

feign-okhttp

]

https://search.maven.org/classic/#search%7C1%7Cg%3A%22io.github.openfeign


https://search.maven.org/classic/#Squareのhttp://square.github.io/okhttp/


クライアント

JSON

プロセッサとしてhttps://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%として

GoogleのGSON

を使用するための%22%20AND%20a%3A%22feign-gson%22[

feign-gson

]22io.github.openfeign%22%20AND 20a%3A%22feign-slf4j%22[簡単なログ記録ファサード

]を使用して要求を記録します。

実際にログを出力するには、クラスパスに

SLF4J

でサポートされている好きなロガーの実装が必要です。

クライアントインターフェイスの作成を続ける前に、データを保持するための

Book

モデルを設定します。

public class Book {
    private String isbn;
    private String author;
    private String title;
    private String synopsis;
    private String language;

   //standard constructor, getters and setters
}

  • 注:**

    SON

    プロセッサには、少なくとも「引数なしのコンストラクタ」が必要です。

実際、私たちの

REST

プロバイダーは


ハイパーメディアドリブンAPI

なので、

簡単なラッパークラスが必要です。

public class BookResource {
    private Book book;

   //standard constructor, getters and setters
}

  • 注意:** サンプルの

    Feign

    クライアントはハイパーメディア機能の恩恵を受けないため、

    BookResource

    をシンプルにしてください。


4サーバ側


Feign

クライアントを定義する方法を理解するために、まず

REST

プロバイダでサポートされているいくつかのメソッドとレスポンスを調べます。

すべての本を一覧表示するための簡単な

curl

シェルコマンドで試してみましょう。


application.properties

で定義されている

servlet-context

である

‘/api’

をあなたの呼び出しに付けることを忘れないでください:

$> curl http://localhost:8081/api/books


JSON

として表される完全な本のリポジトリを取得します。

----[  {
    "book": {
      "isbn": "1447264533",
      "author": "Margaret Mitchell",
      "title": "Gone with the Wind",
      "synopsis": null,
      "language": null
    },
    "links":[      {
        "rel": "self",
        "href": "http://localhost:8081/api/books/1447264533"
      }
   ]  },

...

{
  "book": {
    "isbn": "0451524934",
    "author": "George Orwell",
    "title": "1984",
    "synopsis": null,
    "language": null
  },
  "links":[      {
      "rel": "self",
      "href": "http://localhost:8081/api/books/0451524934"
    }
 ]  }]----

getリクエストに

ISBN

を追加することで、個々の

Book

リソースをクエリすることもできます。

$> curl http://localhost:8081/api/books/1447264533


5クライアントの確認

これで、

Feign

クライアントを定義しましょう。


HTTP動詞とパス部分を引数として指定するには、

@ RequestLine

アノテーションを使用し、

@ Param__アノテーションを使用してパラメーターをモデル化します。

public interface BookClient {
    @RequestLine("GET/{isbn}")
    BookResource findByIsbn(@Param("isbn") String isbn);

    @RequestLine("GET")
    List<BookResource> findAll();

    @RequestLine("POST")
    @Headers("Content-Type: application/json")
    void create(Book book);
}

  • 注意:** FeignクライアントはテキストベースのHTTP APIのみを消費するために使用することができます。ファイルのアップロードまたはダウンロード

  • これですべてです!** 今度は

    Feign.builder()

    を使用して、インターフェイスベースのクライアントを設定します。実際の実装は実行時にプロビジョニングされます。

BookClient bookClient = Feign.builder()
  .client(new OkHttpClient())
  .encoder(new GsonEncoder())
  .decoder(new GsonDecoder())
  .logger(new Slf4jLogger(BookClient.class))
  .logLevel(Logger.Level.FULL)
  .target(BookClient.class, "http://localhost:8081/api/books");


Feign

は、リクエストを作成するための

JSON

/

XML

エンコーダおよびデコーダ、あるいは基盤となる

HTTP

クライアントなどのさまざまなプラグインをサポートします。


6. 単体テスト

クライアントをテストするために、3つの

@ Test

メソッドを含む単体テストクラスを作成しましょう。テストでは

org.hamcrest.CoreMatchers。



および

org.junit.Assert。

パッケージからの静的インポートが使用されます。

@Test
public void givenBookClient__shouldRunSuccessfully() throws Exception {
   List<Book> books = bookClient.findAll().stream()
     .map(BookResource::getBook)
     .collect(Collectors.toList());

   assertTrue(books.size() > 2);
}

@Test
public void givenBookClient__shouldFindOneBook() throws Exception {
    Book book = bookClient.findByIsbn("0151072558").getBook();
    assertThat(book.getAuthor(), containsString("Orwell"));
}

@Test
public void givenBookClient__shouldPostBook() throws Exception {
    String isbn = UUID.randomUUID().toString();
    Book book = new Book(isbn, "Me", "It's me!", null, null);
    bookClient.create(book);
    book = bookClient.findByIsbn(isbn).getBook();

    assertThat(book.getAuthor(), is("Me"));
}

これらのテストは一目瞭然です。実行するには、単純にMavenの

test

ゴールを実行します。

$> mvn test


7. 参考文献

サービスが利用できない場合に何らかのフォールバックが必要な場合は、https://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22io.github.openfeign%22%20ANDを追加できます。 %20a%3A%22feign-hystrix%22[

HystrixFeign

]を

classpath

に追加し、代わりに

HystrixFeign.builder()

を使用してクライアントを構築してください。


Hystrix

の詳細については、__

この専用チュートリアルシリーズ

を参照してください。


Spring Cloud Netflix Hystrixを

Feign__と統合したい場合は、このリンクの詳細を読むことができます。

クライアント側の負荷分散やサービス検出をクライアントに追加することもできます。

前者は

httpsを追加することで行われます。]

あなたのクラスパスに移動し、次のようにビルダーを呼び出します。

BookClient bookClient = Feign.builder()
  .client(RibbonClient.create())
  .target(BookClient.class, "http://localhost:8081/api/books");

サービスを発見するには、

Spring Cloud Netflix Eureka

を有効にしてサービスを構築する必要があります。それから、単に

Spring Cloud Netflix Feign

と統合すれば、あなたは無料で

Ribbon

ロードバランシングを手に入れることができます。これについての詳細はリンクを見つけることができます:/spring-cloud-netflix-eureka[

here

]。


8結論

この記事では、

Feign

を使用してテキストベースの

__API


を消費する宣言型の

HTTP__クライアントを作成する方法について説明しました。

いつものように、あなたはソースhttps://github.com/eugenp/tutorials/tree/master/feign[on GitHub]を見つけるでしょう。