紹介するイントロ
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]を見つけるでしょう。