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、依存を追加する
@Request Mappingは、この方法を呼び出すには、GET要求を/group/groupIdに送信する必要があることを示している。
@PathVarableはSprigMVCに対応する注釈と同じ意味です。
原理:Spring Cloudアプリケーションは起動時、Feignは@Feign Client注釈のあるインターフェースをスキャンして、プロキシを生成し、Spring容器に登録します。プロキシを生成する際にFeignは、HTTP要求に必要なすべての情報をカプセル化したRequetTemplateオブジェクトをインターフェース方法ごとに作成し、要求パラメータ名、要求方法などの情報はこのプロセスで決定され、Feignのテンプレート化はここに表される。
3、起動クラスにコメントを追加する
1、カスタムConfigration
四、Feignログの配置
作成したFeignクライアントごとにレコーダを作成します。デフォルトでは、レコーダの名前はFeignクライアントを作成するためのインターフェースの完全な類名です。Feignログ記録はDEBUGレベルのみに応答します。loging.level.project.user.UserCient:DEBUG
設定ファイルのapplication.ymlに追加:
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を使ってリモートサービスの実現方法を要求しました。つまり、小編集は皆さんに全部の内容を共有しました。参考にしてもらいたいです。どうぞよろしくお願いします。
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を使ってリモートサービスの実現方法を要求しました。つまり、小編集は皆さんに全部の内容を共有しました。参考にしてもらいたいです。どうぞよろしくお願いします。