7

我得到了例外:

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)

在执行我的项目时。我的 pom.xml 包含

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

我也在我的其他项目中使用 feign 客户端,没有任何额外的功能区依赖,这些都使用相同的 spring-boot 版本 2.0.8

我已经针对相同的问题引用了其他堆栈溢出链接,他们要求添加功能区的其他依赖项。我尝试在我的 pom.xml 中添加相同的内容,但没有帮助。

FeignClient 接口是,

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

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

主类代码:

@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));
    }
}

我正在使用 Sprint Boot 版本 2.0.8。

4

5 回答 5

8

您必须决定使用哪个客户端负载均衡器:(1) Spring Cloud Loadbalancer或 (2) Ribbon

Spring Cloud Loadbalancer 是一个通用抽象,可以完成我们过去在 Netflix 的 Ribbon 项目中所做的工作。Spring Cloud 仍然支持 Netflix Ribbon,但 Netflix Ribbons 的日子已经屈指可数了,就像 Netflix 微服务堆栈的其他许多内容一样,因此我们提供了一个抽象来支持替代方案

在这里查看:https ://spring.io/blog/2020/03/25/spring-tips-spring-cloud-loadbalancer

(1) Spring Cloud 负载均衡器

spring:
  cloud:
    loadbalancer:
       ribbon:
        enable: false

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

(2) Ribbon : 添加依赖:

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

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

   spring:
      cloud:
        loadbalancer:
           ribbon:
            enable: true
于 2020-10-06T08:42:58.567 回答
2

使用spring-cloud-starter-loadbalancer依赖而不是spring-cloud-starter-netflix-ribbon.

于 2021-07-01T12:45:54.913 回答
1

丝带

需要 Spring Boot 版本 >= 2.0.0.RELEASE 和 < 2.4.0-M1

于 2020-11-24T17:06:51.227 回答
1

对我来说,问题是我没有在 feign 注释中包含 url

@FeignClient(name = "microservice-common", url = "${microservice-common.url}")
于 2022-01-17T11:49:58.740 回答
0

在您的 feignClient 界面中添加ServiceName(即 feignName)及其 URL。

@FeignClient(name = "user-service", url = "feignUrl", decode404 = true)
public interface UserFeignClient {
    @PostMapping("/do-something")
    void doSomething();
}

Feign Client 是用于更轻松地调用其他服务的 Rest-Api 的工具,因为 Ribbon 主要用于负载平衡。

如果你想使用功能区

  1. 将此依赖项添加到您的 pom.xml
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
  1. FeignClient 接口

    @FeignClient(name="ServiceName")
    @RibbonClient(name="ServiceName")
    
  2. 配置您的application.properties,如下所示

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

于 2020-09-09T15:41:58.643 回答