紹介するイントロ

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]を見つけるでしょう。