别来BUG求求了 2023-09-07 17:07 采纳率: 91.7%
浏览 18
已结题

使用Springcloud Loadbalancer集成Openfeign报错

使用Springcloud Loadbalancer集成Openfeign报错
报错内容

No qualifying bean of type 'org.springframework.cloud.client.discovery.ReactiveDiscoveryClient' available

application.yml配置文件

server:
  port: 8080
spring:
  application:
    name: consumer-01
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        namespace: c7ffbcd1-c4d8-425b-b41c-a1077693fa57
        group: A_GROUP
    loadbalancer:
      ribbon:
        enabled: false
      nacos:
        enabled: true
      enabled: true
      configurations: zone-preference
      zone: zone1
        hint:
        default: myhint

主类

@EnableDiscoveryClient
@EnableFeignClients
@SpringBootApplication
public class Consumer01Application {

    public static void main(String[] args) {
        SpringApplication.run(Consumer01Application.class, args);
    }
}

Openfeign controller(前端调用这个接口)

@RestController
public class OpenFeignController {

    @Autowired
    private FeignEchoService echoService;

    @GetMapping("/feign/echo/{message}")
    public String feignEcho(@PathVariable String message) {
        return echoService.echo(message);
    }
}

FeignEchoService配置,我的服务是provider-01,有三个实例

@LoadBalancerClient(name = "provider-01", configuration = CustomLoadBalancerConfig.class)
@FeignClient(value = "provider-01") // 指向服务提供者应用
public interface FeignEchoService {
    @LoadBalanced
    @GetMapping("/echo/{message}")
    String echo(@PathVariable("message") String message);
}

自定义的负载均衡配置,添加下面这个bean就会报错,不添加就正常运行,但是这样我没办法配置zone和hint

public class CustomLoadBalancerConfig {
    // 随机负载均衡
    @Bean
    ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
    }

    // 配置zone
    @Bean
    public ServiceInstanceListSupplier discoveryClientServiceInstanceListSupplier(ConfigurableApplicationContext context) {
        return ServiceInstanceListSupplier.builder().withDiscoveryClient().withZonePreference().withCaching().build(context);
    }
}

provider-01的application.yml

server:
  port: 8081
spring:
  application:
    name: provider-01
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        namespace: c7ffbcd1-c4d8-425b-b41c-a1077693fa57
        group: A_GROUP
        metadata:
          zone: zone1
          hint: myhint
    loadbalancer:
      ribbon:
        enabled: false
      nacos:
        enabled: false
      enabled: true
      configurations: zone-preference

provider-01的controller

@RestController
public class EchoServiceController {

    @GetMapping("/echo/{message}")
    public String echo(@PathVariable String message) {
        return message;
    }
}
  • 写回答

3条回答 默认 最新

  • 别来BUG求求了 2023-09-11 10:25
    关注

    DiscoveryClient ReactiveDiscoveryClient 代表服务消费者Consumer从注册中心发现服务提供者Provider的服务发现操作。两个接口的差异就体现在getServices()getInstances(String serviceId)。只是把List类型转换成了Reactor里的Flux类型。Springcloud 默认使用的是DiscoveryClient ,在Spring WebFlux场景下,ReactiveDiscoveryClient才会生效,所以需要添加webflux依赖。

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 9月19日
  • 已采纳回答 9月11日
  • 创建了问题 9月7日

悬赏问题

  • ¥20 校园二手交易小程序搭建
  • ¥15 请问在ubuntu用conda创建环境报错怎么能解决
  • ¥15 STM32CubeMX/proteus按键控制指示灯颜色切换
  • ¥20 python,计算区位熵和扩张指数
  • ¥15 Python环境配置
  • ¥15 大四学生的困惑,有偿提问!
  • ¥15 解决页面无法编入索引:被“noindex”标签排除的问题?
  • ¥15 arduino测量电阻
  • ¥15 快手uid转快手号谁能解决 需要开发
  • ¥15 iis部署Django时css不生效,来个真人,ai不好使