1
votes

java.lang.IllegalStateException: aucun client Feign pour loadBalancing n'est défini. Avez-vous oublié d'inclure spring-cloud-starter-netflix-ribbon?

Je reçois une exception
@Configuration
@EnableAspectJAutoProxy
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication(scanBasePackages = {"test.user"})
public class UserRegistrationApplication{
 public static void main(String[] args) {
        UserFeignClient userFeignClient = applicationContext.getBean(UserFeignClient.class);
        userFeignClient.doSomething();
        System.exit(SpringApplication.exit(applicationContext));
    }
}

lors de l'exécution de mon projet. Mon pom.xml contient

@FeignClient(value = "user-service", decode404 = true)
public interface UserFeignClient {

    @PostMapping("/do-something")
    void doSomething();
}

J'utilise également le client feign dans d'autres projets de la mienne sans aucune dépendance supplémentaire du ruban et ceux-ci fonctionnent avec la même version 2.0.8

J'ai fait référence à un autre lien de débordement de pile pour le même problème et ils ont demandé d'ajouter une dépendance supplémentaire au ruban. J'ai essayé d'ajouter la même chose dans mon pom.xml mais cela n'a pas aidé.

L'interface FeignClient est,

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

Code de classe principale,

FactoryBean threw exception on object creation; nested exception is java.lang.IllegalStateException: No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-netflix-ribbon?
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:178)
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:101)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1654)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getObjectForBeanInstance(AbstractAutowireCapableBeanFactory.java:1174)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:257)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:224)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1012)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:338)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:333)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1105)
    at com.hsbc.gbgcf.spartan.referencedatabase.UserRegistrationApplication.main(UserRegistrationApplication.java:57)

Quelqu'un peut-il m'aider s'il vous plaît avec ce problème?

Sprint-Boot version 2.0.8 que j'utilise


0 commentaires

3 Réponses :


0
votes

Ajoutez ServiceName (ie feignName) avec son URL dans votre interface feignClient.

@FeignClient(name="ServiceName")
@RibbonClient(name="ServiceName")

Feign Client est un outil permettant d'appeler plus facilement Rest-Api d'un autre service où le ruban est principalement utilisé pour l'équilibrage de charge.

Si vous souhaitez utiliser le ruban

  1. Ajoutez cette dépendance à votre pom.xml
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
  1. Interface FeignClient

    @FeignClient(name = "user-service", url = "feignUrl", decode404 = true)
    public interface UserFeignClient {
        @PostMapping("/do-something")
        void doSomething();
    }
    
  2. configurez votre application.properties comme indiqué ci-dessous

ServiceName.ribbon.listOfServers = http: // localhost: 8000, http: // localhost: 8001


1 commentaires

Merci @Harshal pour le commentaire. J'ai essayé d'ajouter une dépendance de ruban dans pom mais pas de chance. J'ai ajouté la dépendance hystrix et cela a fonctionné, car hystrix utilise en interne loadBalancer.



2
votes

Vous devez décider quel équilibreur de charge client utiliser: (1) Spring Cloud Loadbalancer ou (2) Ribbon .

Spring Cloud Loadbalancer est une abstraction générique qui peut faire le travail que nous faisions auparavant avec le projet Ribbon de Netflix. Spring Cloud prend toujours en charge le ruban Netflix, mais les jours des rubans Netflix sont comptés, comme beaucoup d'autres de la pile de microservices Netflix, nous avons donc fourni une abstraction pour prendre en charge une alternative

Vérifiez ici: https://spring.io/blog/2020/03/25/spring-tips-spring-cloud-loadbalancer

(1) Spring Cloud Load Balancer :

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

# And (optionally)... @application.yaml

   spring:
      cloud:
        loadbalancer:
           ribbon:
            enable: true

(2) Ruban : Ajoutez la dépendance:

spring:
  cloud:
    loadbalancer:
       ribbon:
        enable: false

# And... inform the "url" attribute at FeignClient
@FeignClient(name = "student", url = "student") 


0 commentaires

0
votes

Ruban

Nécessite la version Spring Boot> = 2.0.0.RELEASE et <2.4.0-M1


0 commentaires