Maison  >  Article  >  Java  >  Feign of Spring Cloud utilise HTTP pour demander des services à distance

Feign of Spring Cloud utilise HTTP pour demander des services à distance

巴扎黑
巴扎黑original
2017-06-26 11:09:372129parcourir

1. Introduction à Feign

Dans la pile Spring Cloud Netflix, chaque microservice expose son propre service sous la forme d'une interface HTTP, il doit donc être utilisé lors de l'appel de services distants HTTP. client. Nous pouvons utiliser l'URLConnection native du JDK, le client HTTP d'Apache, le client HTTP asynchrone de Netty et le RestTemplate de Spring. Cependant, le plus pratique et le plus élégant à utiliser est Feign.

Feign est un client HTTP déclaratif et basé sur un modèle. En utilisant Feign dans Spring Cloud, nous pouvons obtenir la même expérience de codage que l'appel de méthodes locales lors de l'utilisation de HTTP pour demander des services distants. Les développeurs ignorent complètement qu'il s'agit d'une méthode distante, encore moins d'une requête HTTP.

2. L'utilisation de feign dans Spring Cloud

1. Ajouter des dépendances

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

2.

@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请求
}
  • @FeignClient(name="SPRING-PRODUCER-SERVER/spring") : utilisé pour notifier le composant Feign de proxy l'interface (pas besoin pour écrire l'implémentation de l'interface), l'attribut name spécifie le service que nous voulons appeler. Les utilisateurs peuvent injecter directement via @Autowired.

  • @RequestMapping indique que lors de l'appel de cette méthode, une requête GET doit être envoyée à /group/{groupId}.

  • @PathVariable a la même signification que l'annotation correspondante dans SpringMVC.

Principe : lorsqu'une application Spring Cloud est démarrée, Feign analysera l'interface marquée de l'annotation @FeignClient, générera un proxy et l'enregistrera dans le conteneur Spring. Lors de la génération d'un proxy, Feign créera un objet RequetTemplate pour chaque méthode d'interface. Cet objet encapsule toutes les informations requises pour les requêtes HTTP. Le nom du paramètre de requête, la méthode de requête et d'autres informations sont déterminés dans le modèle de Feign.

3. Ajouter des annotations à la classe de démarrage

@Configuration
@ComponentScan
@EnableAutoConfiguration
@EnableEurekaClient
@EnableFeignClientspublic class SpringConsumerServerFeignApplication {public static void main(String[] args) {
        SpringApplication.run(SpringConsumerServerFeignApplication.class, args);
    }
}

4. Fichier de configuration application.yml

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

3. Configuration personnalisée

1. Configuration personnalisée

@Configurationpublic class FooConfiguration {
    @Beanpublic Contract feignContract() {//这将SpringMvc Contract 替换为feign.Contract.Defaultreturn new feign.Contract.Default();
    }
}

2. Utiliser une configuration personnalisée

@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);*/}
@RequestLine:是feign的注解


为每个创建的Feign客户端创建一个记录器。默认情况下,记录器的名称是用于创建Feign客户端的接口的完整类名。Feign日志记录仅响应DEBUG级别。logging.level.project.user.UserClient: DEBUG
在配置文件application.yml 中加入:
logging:
 level:
  com.jalja.org.spring.simple.dao.FeignUserClient: DEBUG
Ajouter un niveau de journalisation dans la classe de configuration personnalisée

@Configurationpublic 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 : simuler le délai d'expiration de la demande problème

Le délai d'attente par défaut d'Hystrix est de 1 seconde. S'il n'y a pas de réponse après ce délai, le code de secours sera saisi. La première requête est souvent lente (à cause du mécanisme de chargement paresseux de Spring, qui nécessite d'instancier certaines classes), et le temps de réponse peut être supérieur à 1 seconde

Il existe trois solutions, en prenant feign comme exemple.
Méthode 1
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds : 5000
Cette configuration consiste à modifier le délai d'attente d'Hystrix à 5 secondes
Méthode 2
hystrix.command. default.execution.timeout.enabled : false
Cette configuration est utilisée pour désactiver le délai d'attente de Hystrix
Méthode 3
feign.hystrix.enabled : false
Cette configuration est utilisée pour désactiver simplement l'hystrix de feign . Cette approche n'est pas recommandée, sauf dans certains scénarios particuliers.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn