zoukankan      html  css  js  c++  java
  • Spring Cloud Ribbon负载均衡配置类放在Spring boot主类同级增加Exclude过滤后报Field config in com.cloud.web.controller.RibbonConfiguration required a bean of type 'com.netflix.client.config.IClientConfig' that could not b

    环境:

      Spring Cloud:Finchley.M8

      Spring Boot:2.0.0.RELEASE

    目录结构:

      

    可以看到代码第13行的注释,我已经在@ComponentScan注解中添加了Exclude配置项,但是启动服务的时候还是报如下的错误:

      

    2018-04-12 15:59:37.815  WARN 17828 --- [           main] o.s.b.f.support.DisposableBeanAdapter    : Invocation of destroy method 'close' failed on bean with name 'eurekaRegistration': org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name 'org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration$RefreshableEurekaClientConfiguration': Singleton bean creation not allowed while singletons of this factory are in destruction (Do not request a bean from a BeanFactory in a destroy method implementation!)
    2018-04-12 15:59:37.825  INFO 17828 --- [           main] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
    2018-04-12 15:59:37.828  WARN 17828 --- [ost-startStop-1] o.a.c.loader.WebappClassLoaderBase       : The web application [ROOT] appears to have started a thread named [spring.cloud.inetutils] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
     java.net.Inet6AddressImpl.getHostByAddr(Native Method)
     java.net.InetAddress$2.getHostByAddr(InetAddress.java:932)
     java.net.InetAddress.getHostFromNameService(InetAddress.java:617)
     java.net.InetAddress.getHostName(InetAddress.java:559)
     java.net.InetAddress.getHostName(InetAddress.java:531)
     org.springframework.cloud.commons.util.InetUtils$2.call(InetUtils.java:162)
     org.springframework.cloud.commons.util.InetUtils$2.call(InetUtils.java:159)
     java.util.concurrent.FutureTask.run(FutureTask.java:266)
     java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
     java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
     java.lang.Thread.run(Thread.java:748)
    2018-04-12 15:59:37.838  INFO 17828 --- [           main] ConditionEvaluationReportLoggingListener : 
    
    Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
    2018-04-12 15:59:37.961 ERROR 17828 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   : 
    
    ***************************
    APPLICATION FAILED TO START
    ***************************
    
    Description:
    
    Field config in com.cloud.web.controller.RibbonConfiguration required a bean of type 'com.netflix.client.config.IClientConfig' that could not be found.
    
    
    Action:
    
    Consider defining a bean of type 'com.netflix.client.config.IClientConfig' in your configuration.
    
    
    Process finished with exit code 1
    

      日志关键点在倒数第二行,其实原因很简单ComponentScan不去扫单个Ribbon的配置(RibbonConfigureration)不应用于所有Ribbon客户端,那这个当个客户端去加载的时候就要让Component知道不去管理他,否则就回去扫一遍,看我的Ribbon配置类,55行,被我注释了,没有引用到Exclude注解,所以还是去扫了:

      

    问题很简单,把注解加上就好了。。

      贴一下几个类的代码:

      1、ExcludeFromComponetScan

      

    public @interface ExcludeFromComponetScan {
    }
    

      2、spring cloud启动加载类:

      

    @EnableAutoConfiguration
    //excludeFilters这里的意思是,只要标有ExcludeFromComponetScan注解的类都不会去扫描
    @ComponentScan(value = "com.cloud", excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value=ExcludeFromComponetScan.class)})
    @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
    @EnableEurekaClient
    @RibbonClient(name = "SPRING-CLOUD-WEB-PROVIDER", configuration = RibbonConfiguration.class)
    public class SpringCloudRibbonApplication {
    
    	public static void main(String[] args) {
    		SpringApplication.run(SpringCloudRibbonApplication.class, args);
    	}
    }
    

      3、RibbonConfiguration

      

    //这个类不能喝Spring Boot @ConponentScan所在主类放在同一个包或其子包下,否则需要些Exclude类做区分
    @ExcludeFromComponetScan
    @Configuration
    public class RibbonConfiguration {
        @Autowired
        IClientConfig config;
    
        @Bean
        public IRule ribbonRule(IClientConfig config) {
            //随机算法
            return new RandomRule();
        }
    }
    

      

  • 相关阅读:
    Jdk1.8 HashMap源码分析
    瘦身部署应用
    Redis 创建和使用集群(yum方式安装低版本)
    Redis 创建和使用集群
    记录一下
    Oracle 开发人员权限控制
    Linux 免密登录远程服务器及执行相关命令
    Oracle 连接表空间并执行SQL文件
    MySQL 8.0.13安装教程(windows 64位) (转)
    scrapy中Selector的使用
  • 原文地址:https://www.cnblogs.com/dbaxyx/p/8808940.html
Copyright © 2011-2022 走看看