Spring Cloud OpenFeignの概要

1. 概要

このチュートリアルでは、https://spring.io/projects/spring-cloud-openfeign [Spring Cloud OpenFeign]-Spring Bootアプリ用の宣言型RESTクライアントについて説明します。
link:/intro-to-feign[Feign]は、Feign注釈とJAX-RS注釈を含むプラグイン可能な注釈のサポートにより、Webサービスクライアントの記述を容易にします。
また、https://www.baeldung.com/spring-cloud-tutorial [Spring Cloud]は、https://www.baeldung.com/spring-mvc-annotations [Spring MVCアノテーション]および同じsupporthttpsを使用するためのサポートを追加します。 ://www.baeldung.com/spring-httpmessageconverter-rest [_HttpMessageConverters_] Spring Webで使用されています。
また、Feignの優れた点は、サービスを呼び出すためのインターフェイス定義以外のコードを記述する必要がないことです。

2. 依存関係

最初に、Spring Boot Webプロジェクトを作成し、_spring-cloud-starter-openfeign_依存関係を_pom.xml_ファイルに追加することから始めます。
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
また、_spring-cloud-dependencies_を追加する必要があります。
 <dependencyManagement>
     <dependencies>
         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
_https://search.maven.org/search?q = g:org.springframework.cloud%20AND%20a:spring-cloud-starter-openfeign [spring-cloud-starter-openfeign] _の最新バージョンを見つけることができますおよびhttps://search.maven.org/search?q=g:org.springframework.cloud%20AND%20a:spring-cloud-dependencies[_spring-cloud-dependencies_] Maven Centralで。

3. 偽クライアント

次に、_ @ EnableFeignClients_をメインクラスに追加する必要があります。
@SpringBootApplication
@EnableFeignClients
public class ExampleApplication {

    public static void main(String[] args) {
        SpringApplication.run(ExampleApplication.class, args);
    }
}
このアノテーションを使用して、偽のクライアントであると宣言するインターフェイスのコンポーネントスキャンを有効にします。
次に、* _ @ FeignClient_アノテーションを使用してFeignクライアントを宣言します:*
@FeignClient(value = "jplaceholder", url = "https://jsonplaceholder.typicode.com/")
public interface JSONPlaceHolderClient {

    @RequestMapping(method = RequestMethod.GET, value = "/posts")
    List<Post> getPosts();

    @RequestMapping(method = RequestMethod.GET, value = "/posts/{postId}", produces = "application/json")
    Post getPostById(@PathVariable("postId") Long postId);
}
この例では、https://jsonplaceholder.typicode.com [JSONPlaceHolder APIs]から読み取るようにクライアントを構成しました。
__ @ FeignClient __annotationで渡される_value_引数は必須の任意のクライアント名ですが、_url_引数では、APIベースURLを指定します。
さらに、このインターフェースはFeignクライアントであるため、Spring Webアノテーションを使用して、到達したいAPIを宣言できます。

4. 構成

ここで、*各Feignクライアントはカスタマイズ可能なコンポーネントのセットで構成されていることを理解することが非常に重要です。*
Spring Cloudは、次のセクションで説明するようにカスタマイズできる_FeignClientsConfiguration_クラスを使用して、名前付きクライアントごとに新しいデフォルトセットをオンデマンドで作成します。
上記のクラスには次のBeanが含まれます。
  • デコーダーSpringDecoderをラップする_ResponseEntityDecoder used
    _Response_をデコードする

  • エンコーダー– SpringEncoder _、 RequestBody_のエンコードに使用

  • ロガー-_Slf4jLogger_は、Feignが使用するデフォルトのロガーです

  • 契約– SpringMvcContract。注釈処理を提供します

  • Feign-Builder – _HystrixFeign.Builder_は、
    コンポーネント

  • クライアント– _LoadBalancerFeignClient_またはデフォルトのFeignクライアント

* 4.1。 カスタムBean設定*

*これらのBeanの1つ以上をカスタマイズするイベントでは、_ @ Configuration_クラスを使用してそれらをオーバーライドし、_FeignClient_アノテーションに追加します。
@FeignClient(value = "jplaceholder",
  url = "https://jsonplaceholder.typicode.com/",
  configuration = MyClientConfiguration.class)
@Configuration
public class MyClientConfiguration {

    @Bean
    public OkHttpClient client() {
        return new OkHttpClient();
    }
}
この例では、HTTP / 2をサポートするために、デフォルトの代わりにlink:/guide-to-okhttp[_OkHttpClient_]を使用するようにFeignに指示します。
Feignは、さまざまなユースケースで複数のクライアントをサポートします。たとえば、一部のサーバーが期待する_Content-Length、_など、リクエストでより多くのヘッダーを送信する_ApacheHttpClient_などです。
これらのクライアントを使用するために、必要な依存関係を_pom.xml_ファイルに追加することを忘れないでください、例えば:
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-okhttp</artifactId>
</dependency>

<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-httpclient</artifactId>
</dependency>
https://search.maven.org/search?q=g:io.github.openfeign%20AND%20a:feign-okhttp[_feign-okhttp_]およびhttps://search.mavenの最新バージョンを見つけることができます。 Maven Centralのorg / search?q = g:io.github.openfeign%20AND%20a:feign-httpclient [_feign-httpclient_]。

* 4.2。 プロパティを使用した構成*

_ @ Configuration_クラスを使用する代わりに、次の_application.yaml_の例に示すように、アプリケーションプロパティを使用してFeignクライアントを構成できます*。
feign:
  client:
    config:
      default:
        connectTimeout: 5000
        readTimeout: 5000
        loggerLevel: basic
この構成では、アプリケーションで宣言された各クライアントのタイムアウトを5秒に設定し、ロガーレベルを_basic_に設定しています。
最後に、_default_をクライアント名として使用して構成を作成し、すべての_ @ FeignClient_ objectsを構成するか、構成の偽のクライアント名を宣言できます。
feign:
  client:
    config:
      jplaceholder:
__ @ Configuration ___beanと構成プロパティの両方がある場合、構成プロパティは_ @ Configuration_値をオーバーライドします。

5. インターセプター

*インターセプターの追加は、Feignが提供するもう1つの便利な機能です。 *
インターセプターは、すべてのHTTP要求/応答に対して、認証からログ記録まで、さまざまな「暗黙的な」タスクを実行できます。
そのため、以下のスニペットで、各リクエストに基本認証を追加するリクエストインターセプターを宣言しましょう。
@Bean
public RequestInterceptor requestInterceptor() {
  return requestTemplate -> {
      requestTemplate.header("user", username);
      requestTemplate.header("password", password);
      requestTemplate.header("Accept", ContentType.APPLICATION_JSON.getMimeType());
  };
}
また、インターセプターをリクエストチェーンに追加するには、このBeanを_ @ Configuration_クラスに追加するか、前に見たようにプロパティファイルで宣言する必要があります。
feign:
  client:
    config:
      default:
        requestInterceptors:
          com.baeldung.cloud.openfeign.JSONPlaceHolderInterceptor

6. Hystrixサポート

Feignはlink:/spring-cloud-netflix-hystrix[Hystrix]をサポートしているため、有効にした場合は*フォールバックパターンを実装できます。*
フォールバックパターンでは、リモートサービスコールが例外を生成するのではなく失敗すると、サービスコンシューマーは代替コードパスを実行して、別の手段でアクションを実行しようとします。
目標を達成するには、プロパティファイルにin_feign.hystrix.enabled = true_を追加してHystrixを有効にする必要があります。
これにより、サービスが失敗したときに呼び出されるフォールバックメソッドを実装できます。
@Component
public class JSONPlaceHolderFallback implements JSONPlaceHolderClient {

    @Override
    public List<Post> getPosts() {
        return Collections.emptyList();
    }

    @Override
    public Post getPostById(Long postId) {
        return null;
    }
}
フォールバックメソッドが提供されたことをFeignに知らせるには、フォールバッククラスを_ @ FeignClient_アノテーションに設定する必要もあります。
@FeignClient(value = "jplaceholder",
  url = "https://jsonplaceholder.typicode.com/",
  fallback = JSONPlaceHolderFallback.class)
public interface JSONPlaceHolderClient {
    // APIs
}

7. ロギング

各Feignクライアントについて、デフォルトでロガーが作成されます。
ロギングを有効にするには、クライアントインターフェースのパッケージ名を使用して、__application.propertie__sファイルでログを宣言する必要があります。
logging.level.com.baeldung.cloud.openfeign.client: DEBUG
または、パッケージ内の1つの特定のクライアントに対してのみログを有効にする場合は、完全なクラス名を使用できます。
logging.level.com.baeldung.cloud.openfeign.client.JSONPlaceHolderClient: DEBUG
*偽のログは_DEBUG_レベルにのみ応答することに注意してください。*
クライアントごとに構成できる_Logger.Level_は、ログに記録する量を示します。
@Configuration
public class ClientConfiguration {

    @Bean
    Logger.Level feignLoggerLevel() {
        return Logger.Level.BASIC;
    }
}
次の4つのロギングレベルから選択できます。
  • NONE –ロギングなし、これがデフォルトです

  • BASIC –要求メソッド、URL、および応答ステータスのみを記録します

  • HEADERS –基本情報をリクエストとともに記録し、
    応答ヘッダー

  • FULL –リクエストとリクエストの両方のボディ、ヘッダー、メタデータを記録します
    応答

8. エラー処理

Feignのデフォルトのエラーハンドラである_ErrorDecoder.default_は、常に_FeignException_をスローします。
現在、この動作は常に最も有用とは限りません。 したがって、スローされる例外をカスタマイズするには、_CustomErrorDecoder_ *を使用できます。
public class CustomErrorDecoder implements ErrorDecoder {
    @Override
    public Exception decode(String methodKey, Response response) {

        switch (response.status()){
            case 400:
                return new BadRequestException();
            case 404:
                return new NotFoundException();
            default:
                return new Exception("Generic error");
        }
    }
}
次に、前に行ったように、_ @ Configuration_クラスにBeanを追加して、デフォルトの_ErrorDecoder_を置き換える必要があります。
@Configuration
public class ClientConfiguration {

    @Bean
    public ErrorDecoder errorDecoder() {
        return new CustomErrorDecoder();
    }
}

9. 結論

この記事では、Spring Cloud OpenFeignとその実装を簡単なサンプルアプリケーションで説明しました。
さらに、クライアントを構成する方法、リクエストにインターセプターを追加する方法、_Hystrix_および_ErrorDecoder._を使用してエラーを処理する方法を見てきました。
いつものように、このチュートリアルに示されているすべてのコードサンプルは利用可能ですhttps://github.com/eugenp/tutorials/tree/master/spring-cloud/spring-cloud-openfeign[over on GitHub。]