spring cloudのFeign HTTPを用いて遠隔サービスを要求する実現方法


一、Feign概要
spring Cloud Netflixスタックでは、それぞれのマイクロサービスがHTTPインターフェースの形で自身のサービスを暴露しているので、リモートサービスの呼び出しにはHTTPクライアントを使用しなければならない。JDK原生のURLConnection、ApacheのHttp Cient、Nettyの非同期HTTP Cient、SpringのRestTemplateを使用できます。しかし、一番便利で優雅なのはFeignです。
Feignは声明式、テンプレート化されたHTTPクライアントである。Spring CloudでFeignを使用すると、HTTPを使ってリモートサービスを要求する時にローカル方法を呼び出すと同じ符号化体験ができるようになります。開発者はこれがリモート方法であることを全く感じられません。これはHTTP要求であるということをより知覚できません。
二、feignの使用はspring cloudでの使用
1、依存を追加する

   <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-feign</artifactId>
    </dependency>
2、Feign Clientを作成する 

@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  
}
@Feign Client(name=「SPRING-PRODUCER-SERVER/spring」):Feignコンポーネントにこのインターフェースをプロキシするように通知するために使用されます。name属性はどのサービスを呼び出すべきかを指定します。使用者は直接に@Autowiredを通して注入することができます。
@Request Mappingは、この方法を呼び出すには、GET要求を/group/groupIdに送信する必要があることを示している。
@PathVarableはSprigMVCに対応する注釈と同じ意味です。
原理:Spring Cloudアプリケーションは起動時、Feignは@Feign Client注釈のあるインターフェースをスキャンして、プロキシを生成し、Spring容器に登録します。プロキシを生成する際にFeignは、HTTP要求に必要なすべての情報をカプセル化したRequetTemplateオブジェクトをインターフェース方法ごとに作成し、要求パラメータ名、要求方法などの情報はこのプロセスで決定され、Feignのテンプレート化はここに表される。
3、起動クラスにコメントを追加する

@Configuration
@ComponentScan
@EnableAutoConfiguration
@EnableEurekaClient
@EnableFeignClients
public class SpringConsumerServerFeignApplication {
  public static void main(String[] args) {
    SpringApplication.run(SpringConsumerServerFeignApplication.class, args);
  }
}
4、プロファイルappration.yml

spring:
 application:
 name: spring-consumer-server-feign
server: 
 port: 8084
 context-path: /spring
#           ,           
eureka:
 client:
 serviceUrl:
  defaultZone: http://user:password@localhost:8761/eureka/
三、カスタムFeignの配置
1、カスタムConfigration

@Configuration
public class FooConfiguration {
  @Bean
  public Contract feignContract() {
    //  SpringMvc Contract    feign.Contract.Default
    return new feign.Contract.Default();
  }
}
2、カスタムConfigrationを使う

@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);*/
}
@Request Line:feignの注釈です。
四、Feignログの配置
作成したFeignクライアントごとにレコーダを作成します。デフォルトでは、レコーダの名前はFeignクライアントを作成するためのインターフェースの完全な類名です。Feignログ記録はDEBUGレベルのみに応答します。loging.level.project.user.UserCient:DEBUG
設定ファイルのapplication.ymlに追加:

logging:
 level:
 com.jalja.org.spring.simple.dao.FeignUserClient: DEBUG 
ユーザー定義のConfigrationのクラスにログレベルを追加します。

@Configuration
public class FooConfiguration {
  /* @Bean
  public Contract feignContract() {
    //  SpringMvc Contract    feign.Contract.Default
    return new feign.Contract.Default();
  }*/
  @Bean
  Logger.Level feignLoggerLevel() {
    //    
    return Logger.Level.FULL;
  }
}
PS:Feign要求タイムアウト問題
Hystrixのデフォルトのタイムアウト時間は1秒です。この時間を超えてもまだ応答していないなら、fallbackコードに入ります。最初の要求は比較的に遅くなりがちです。(Springの怠惰負荷機構のため、いくつかのクラスを実装します。)この応答時間は1秒よりも大きいかもしれません。
解決策は三つあります。feignを例にします。
方法1
hystrix.co mmand.default.execution.isolation.thread.timeout Inmilliseconds:5000
この設定はHystrixのタイムアウト時間を5秒に変更します。
方法2
hystrix.co mmand.default.execution.timeout.enabled:false
この設定は、Hystrixのタイムアウト時間を無効にします。
方法3
feign.hystrix.enabled:false
この構成は、いっそのこと、feignのhystrixを無効にするために使用される。このやり方は特別な場面がない限り、おすすめできません。
以上のspring cloudのFeignはHTTPを使ってリモートサービスの実現方法を要求しました。つまり、小編集は皆さんに全部の内容を共有しました。参考にしてもらいたいです。どうぞよろしくお願いします。