ホームページ  >  記事  >  Java  >  Feign of Spring Cloud は HTTP を使用してリモート サービスをリクエストします

Feign of Spring Cloud は HTTP を使用してリモート サービスをリクエストします

巴扎黑
巴扎黑オリジナル
2017-06-26 11:09:372183ブラウズ

1. Feign の概要

Spring Cloud Netflix スタックでは、各マイクロサービスが HTTP インターフェイスの形式で独自のサービスを公開するため、リモート サービスを呼び出すときに HTTP クライアントを使用する必要があります。 JDK のネイティブ URLConnection、Apache の Http クライアント、Netty の非同期 HTTP クライアント、Spring の RestTemplate を使用できます。ただし、最も便利でエレガントに使用できるのは Feign です。

Feign は、宣言型のテンプレート化された HTTP クライアントです。 Spring Cloud で Feign を使用すると、HTTP を使用してリモート サービスをリクエストするときに、ローカル メソッドを呼び出すのと同じコーディング エクスペリエンスを実現できます。開発者は、HTTP リクエストはおろか、これがリモート メソッドであることをまったく認識しません。

2. Spring Cloud での feign の使用

1. 依存関係を追加します

      <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-feign</artifactId>   </dependency>

2. FeignClient を作成します

    @FeignClient(name="SPRING-PRODUCER-SERVER/spring ") : Feign コンポーネントにインターフェイスをプロキシするよう通知するために使用されます (インターフェイスの実装を記述する必要はありません)。 name 属性は、呼び出すサービスを指定します。ユーザーは @Autowired を通じて直接注入できます。
  • @RequestMapping は、このメソッドを呼び出すときに、GET リクエストを /group/{groupId} に送信する必要があることを意味します。
  • @PathVariable は、SpringMVC の対応するアノテーションと同じ意味を持ちます。
  • 原則: Spring Cloud アプリケーションが起動すると、Feign は @FeignClient アノテーションが付けられたインターフェイスをスキャンし、プロキシを生成し、Spring コンテナに登録します。プロキシを生成するとき、Feign は各インターフェイス メソッドに対して RequetTemplate オブジェクトを作成します。このオブジェクトには、HTTP リクエストに必要なすべての情報がカプセル化されており、このプロセスで決定されるリクエスト パラメータ名、リクエスト メソッド、その他の情報がここに反映されます。

3. スタートアップクラスにアノテーションを追加します

@FeignClient(name="SPRING-PRODUCER-SERVER/spring")public interface FeignUserClient {
  @RequestMapping( value = "/findAll/{name}",method = RequestMethod.GET)  public List<SpringUser> findAll(@PathVariable("name") String name);
  
  @RequestMapping( value = "/findUserPost",method = RequestMethod.POST)  public SpringUser findUserPost(@RequestBody SpringUser springUser);//复合类型好像默认是POST请求
}
4. 設定ファイル application.yml

3. Feign 設定をカスタマイズします
@Configuration
@ComponentScan
@EnableAutoConfiguration
@EnableEurekaClient
@EnableFeignClientspublic class SpringConsumerServerFeignApplication {public static void main(String[] args) {
        SpringApplication.run(SpringConsumerServerFeignApplication.class, args);
    }
}

2.

spring:
 application:
  name: spring-consumer-server-feign
server: 
 port: 8084
 context-path: /spring
#服务注册中心的配置内容,指定服务注册中心的位置
eureka:
 client:
  serviceUrl:
   defaultZone: http://user:password@localhost:8761/eureka/

@Configurationpublic class FooConfiguration {
    @Beanpublic Contract feignContract() {//这将SpringMvc Contract 替换为feign.Contract.Defaultreturn new feign.Contract.Default();
    }
}
@FeignClient(name="SPRING-PRODUCER-SERVER/spring",configuration=FooConfiguration.class)public interface FeignUserClient {
    @RequestLine("GET /findAll/{name}")public List<SpringUser> findAll(@Param("name") String name);    
 /* @RequestMapping( value = "/findAll/{name}",method = RequestMethod.GET)
  public List<SpringUser> findAll(@PathVariable("name") String name);
  
  @RequestMapping( value = "/findUserPost",method = RequestMethod.POST)
  public SpringUser findUserPost(@RequestBody SpringUser springUser);*/}
カスタムConfigurationクラスにログレベルを追加

@RequestLine:是feign的注解


为每个创建的Feign客户端创建一个记录器。默认情况下,记录器的名称是用于创建Feign客户端的接口的完整类名。Feign日志记录仅响应DEBUG级别。logging.level.project.user.UserClient: DEBUG
在配置文件application.yml 中加入:
PS:リクエストタイムアウトの問題を装う

Hystrixのデフォルトのタイムアウトは1秒です、それを超えた場合 現時点で応答がない場合、フォールバックコードが入力されます。最初のリクエストは (一部のクラスのインスタンス化を必要とする Spring の遅延読み込みメカニズムのため) 遅くなることが多く、応答時間が 1 秒を超える場合があります。feign を例に挙げると、解決策は 3 つあります。
方法 1
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 5000

この設定は、Hystrix のタイムアウトを 5 秒に変更することです方法 2hystrix.command.default.execution.timeout.enabled: false

この設定は、Hystrix のタイムアウトを無効にするために使用されます

方法 3
feign.hystrix.enabled: false
この設定は、単に feign の hystrix を無効にするために使用されます。このアプローチは、一部の特殊なシナリオを除いて推奨されません。
りー

以上がFeign of Spring Cloud は HTTP を使用してリモート サービスをリクエストしますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。